Java高阶之路系列文章之第2讲:8大基本数据类型与引用类型

这里写图片描述

通过本篇文章的阅读,笔者希望你能知道以下问题:
1.char数据类型所占的字节。
2.8大基本数据类型的运算结果是怎样的规则?
3.8大基本数据类型之间的强制转换与自动转换。
4.拆箱和装箱是什么?什么时候是拆箱,什么时候是装箱。

0.什么是数据类型?

  对于程序而言,最重要的就是对数据的运算和处理,无论是游戏,服务类软件,它们都需要大量的数据。数字,字符都是数据,程序当中存储数据是需要内存空间的,因此对这些数字,字符又进一步进行了划分,在Java中数据最大会以8个字节存储,一个字节就是8位,但是有些数字可以使用1个字节处理,比如:数字5,如果你将他用8个字节存放,很浪费内存,因此这种划分是很有必要的。Java当中存在8大基本数据类型,它们足以应付各种数据,整数型:byte(1字节),short(2字节),int(4字节),long(8字节),浮点型:float(4字节),double(8字节),字符型:char(至少2个字节),判断型:boolean(1字节),你也许奇怪为什么char是至少2个字节,这是因为它的具体字节大小跟字符集有关,请看以下总结:

  • java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。
  • java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。
  • UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。
  • UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。

看过以上结论,你知道为何笔者说是char至少占2个字节了吧,关于字符集,笔者之后在讲IO/NIO的时候会详细讲解。

1.八大基本数据类型

  笔者在上面已经对8大基本类型简单的介绍了,包括占的内存大小,接下来,我们就来细谈一下8大基本类型,先看看以下代码:

public class Test {

    public static void main(String[] args){

        /**
         * 8大基本类型
         */

        //整数型
        byte a = 1;
        short b = 2;
        int c = 3;
        long d = 4;

        //浮点型
        float e = 5.0f;//这里末尾必须加上f
        double f = 6.0;//奇怪这里为什么不需要加呢?

        //字符型
        char g = '7';

        //判断型
        boolean h = true;



    }

}

单单对基本类型赋值是很简单的,但是把它们放到一起运算就需要掌握一些规则了。其实规则也很简单,运算结果总是最精确的,只要你懂得这句话,不管你你看到什么类型的运算,你都可以看出最后运算结果是什么类型:byte < short < int < long < float < double,注意,当你把char类型的数据拿去运算的时候,它是先转化为int类型的数据再进行运算,因此,你可以把char类型当作int类型处理,我们来写代码试试:

    char a = 'a';
    byte b = 2;

    int c = (b + a);//最大精度为char,也就是int类型
    b = (byte) (b + a);//需要强制转换

    float f = 7.0d + 1 +'a' ;//这里肯定报错啊,因为右边运算结果肯定是double类型

    double d =  7.0d + 1 +'a' ;//不报错

你可以自己写写代码来尝试这个规则,实验出真知。对于强制转换和自动转换,也是符合这个规则的,请看下面的图,自己敲代码实验一下吧,笔者不啰嗦了。

这里写图片描述

只要是启始数据类型通过箭头方向能够达到目的数据类型的都可以自动转换,否则则需要强制转换。

2.引用类型

  在Java中引用类型是除去8大基本数据类型的类型,笔者这里还可以加一句,就是可以通过”new”关键字生成对象的类型就是引用类型,但是引用类型当中有个十分特殊的类,这个类就是String类,它是字符串有关的类,关于这个类的高阶知识,我们放在后面去讲解,为什么说它很特殊呢,这是因为这个类可以不需要new关键字生成对象,直接赋值即可,String a = “12213”,其实还有特殊的,就是8大基本数据类型都有对应的包装类,byte–>Byte,short–>Short,int –> Integer,long –> Long,float –>Float,double –> Double,char –>Character,boolean –> Boolean,或许你会产生疑问,明明8大基本数据类型可以满足所有类型的存储要求,还加个引用类型的干嘛,这个问题,我在这里也不好回答,当你在学习泛型和反射的时候,你就应该可以找到答案了。

    //int对应的引用数据类型为Integer
    int a = 3;
    Integer integer = new Integer(1);
    Integer aa = a;

关于基本数据类型的拆箱和装箱问题,早期学Java的我,认为拆箱和装箱不过是一颗”语法糖”,但是深入学习了JVM之后,才认识到这不仅仅是一颗”语法糖”而已,具体知识点,请看后面的文章,笔者一定会坚持写下去,将为你分析这些Java高阶的点滴,也希望你提出错误的地方,欢迎你提意见:

扫描二维码关注公众号,回复: 2677041 查看本文章
    //int对应的引用数据类型为Integer
    int a = 3;
    Integer integer = new Integer(2);

    int add = integer;//这是拆箱,把Integer拆箱成为int
    Integer integer1 = a;//这是装箱,把int装箱为Integer

下篇:
Java高阶之路系列文章之第3讲:原始数据类型数组和引用类型数组
https://blog.csdn.net/ClAndEllen/article/details/81566923

猜你喜欢

转载自blog.csdn.net/ClAndEllen/article/details/81543128
今日推荐