zoukankan      html  css  js  c++  java
  • java基础之一:基本数据类型

    在java中有基本数据类型和引用类型两种,今天来说下基本数据类型和其对应的包装类的之间的关系。

    一、概述

    java中的基本数据类型有八种,分别是char、byte、short、int、long、float、double,boolean。其中这八种基本类型都有其对应的包装类,分别是Character、Byte、Short、Integer、Long、Float、Double、Boolean。八种基本数据类型中byte、short、int、long都是表示的整型(无小数位),float、double表示的是浮点数(俗称小数),char表示的是单个字符,boolean表示的是布尔型。

    在java中整型默认的基本数据类型为int,浮点型默认为double。

    二、详述

    何为包装类

    都知道java种8种数据类型都有其对应的包装类,那么何为包装类,如何去理解包装类。

    所谓包装类其实很好理解,只要从字面量来理解即可,举个例子,就是拿一个箱子把水杯包装起来,这就可以类比包装类。关键要知道包装类包装的是什么东西,是如何包装的。

    下面看Integer类的定义,

    /**
         * The value of the {@code Integer}.
         *
         * @serial
         */
        private final int value;

    在Integer类中有int类型的value,那么包装的便是基本类型int,把value进行了包装,再看Double类

    /**
         * The value of the Double.
         *
         * @serial
         */
        private final double value;

    在Double类中同样有一个Double类型的value,那么包装的便是double基本类型。

    从上面我们知道了,包装类包装的其实就是基本类型,和基本类型的区别是包装类是一个引用类型,很好的诠释了java的封装的特性,把相应的基本类型进行了封装,并提供了一些共用的操作;

    数据长度

    八种基本数据类型每个所能表示的数据范围不同,在其相应的包装类中都有其最大值和最小值的定义。且通过

    byte占8位,也就是1个字节,且有符号,以二进制补码表示;因为有符号,所以符号位占1位,有效的数字位未7位,数据范围未-128~127,即,-2^7~2^7-1,因为中间有0,所以最大需要减1

    short占16位,也就是2个字节,且是有符号,以二进制补码表示;因为有符号,所以符号位占1位,有效的数字位未15位,数据范围未-2^15~2^15-1;

    int占32位,也就是4个字节,且是有符号,以二进制补码表示;因为有符号,所以符号位占1位,有效的数字位未31位,数据范围未-2^31~2^31-1;

    long占64位,也就是8个字节,且是有符号,以二进制补码表示;因为有符号,所以符号位占1位,有效的数字位未63位,数据范围未-2^63~2^63-1;

    float占32位,也就是4个字节,无符号,是单精度的;怎么存储的?

    double占64位,也就是8个字节,无符号,是双精度的;

    char是一个单一的 16 位 Unicode 字符;

    boolean表示一位的信息只有true和false;

    自动装箱与拆箱

    何为自动装箱与拆箱,其实这是针对基本数据类型和包装类型来说的,从基本数据类型到包装类型是装箱,从包装类型到基本数据类型是拆箱,而这个转变是自动的,无需程序员手动转化,

    public void execPackAndUnpack(){
            int b=1;
           //调用方法,传入int类型的数值,自动装箱位Integer类型
            autoPackAndUnpack(b);
            
        }
    
    public void autoPackAndUnpack(Integer i){
           //进行算术加运算,将i自动拆箱为int执行相加操作
            int a=i+1;
            System.out.println(a);
        }

    上面的两个方法便是很好的自动装箱和拆箱的例子,那么java为自动装箱和拆箱做了哪些事那。

    其实自动装箱,调用的是包装类的静态方法。以上面的int类型为例,自动装箱调用的Integer.valueOf()方法,而自动拆箱调用的Integer.intValue()方法,下面看这两个方法的定义,

    valueOf(int i)

    public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }

    从上面可以看到最后返回的是一个Integer的对象,完成了装箱的功能。

    intValue()

    public int intValue() {
            return value;
        }

    可以看到最后返回的是int类型,完成了拆箱。

    valueOf方法

    在每个包装类中都有valueOf方法,看下Integer中的valueOf方法

    public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }

    看到最后使用i构造了一个Integer对象,再看下Double类中的valueOf方法,

    public static Double valueOf(double d) {
            return new Double(d);
        }

    看到使用d构造了一个Double对象。

    很多资料把valueOf方法作为工厂方法来讲解,当然这里也可以这样理解,就是通过基本类型来构造相应的包装类。

    parseXXX方法

    parseXXX方法在包装类中很常见,像Integer有以下方法,

    在Double类中有,

    public static double parseDouble(String s) throws NumberFormatException {
            return FloatingDecimal.parseDouble(s);
        }

    parseXXX方法就是把字符串类型的参数转化为相应的基本类型。

    XXXValue方法

    在包装类中经常看到这样的方法,

    这些方法的意思是把一种类型强转为另一种类型,看Integer中的方法

    public byte byteValue() {
            return (byte)value;
        }

    就是把类型为int的value强转为byte,在强转的时候类型转换异常

    public double doubleValue() {
            return (double)value;
        }

    把类型为int的value强转为double。其他的方法也是类似的,都是强转。

    为什么要在包装类中要包装强转的方法那,在使用基本数据类型时,可以使用下面的方式,

    double b=89.0;
    int a= (int) b;

    由于是包装类,又包装了基本类型,那么就应该具备强转为其他类型的方法,所以提供了XXXValue方法,作为包装类型向其他基本类型的强转。

    三、总结

    重点分析了以下内容,

    java中的包装类,如何理解包装类;

    java中基本数据类型及对应的包装类;

    包装类中常用的valueOf、parseXXX、XXXValue方法;(XXX代表byte、short、int、float等)

    有不正之处欢迎指正,感谢!

  • 相关阅读:
    POJ 2251 Dungeon Master(BFS)
    POJ 1321 棋盘问题 (DFS + 回溯)
    POJ 3009 Curling 2.0(DFS + 模拟)
    Codeforces 702D Road to Post Office(模拟 + 公式推导)
    Codeforces 702A Maximum Increase(dp)
    Codeforces 702C Cellular Network(二分)
    Codeforces 702B Powers of Two
    POJ 3083 Children of the Candy Corn (DFS + BFS + 模拟)
    POJ 2488 A Knight's Journey (回溯法 | DFS)
    POJ1094 Sorting It All Out (拓扑排序)
  • 原文地址:https://www.cnblogs.com/teach/p/14058506.html
Copyright © 2011-2022 走看看