【Java深入浅出】基本类型篇

举报
MDKing 发表于 2023/12/26 14:12:15 2023/12/26
【摘要】 本文深入浅出地介绍了Java中的基本类型的方方面面。用问答、代码的形式针对易混淆、易搞错的场景进行了针对性阐示。

java中有哪些基本数据类型?占用的字节是多少?对应包装器类型是什么?


汇总到下表。占用空间大小与平台是32位、64位无关。boolean类型所占空间大小没有明确指定,仅定义为能够取字面值true或者false。

1.png

不同的基本类型之间是否可以相互赋值(哪些类型间赋值可隐式转换)


byte byteNum = 1;
char charNum = 2;
short shortNum = 3;
int intNum = 4;
long longNum = 5;
float floatNum = 6;
double doubleNum = 7;

charNum = byteNum; //编译错误,不可隐式转换
shortNum = byteNum;
intNum = charNum;
longNum = intNum;
floatNum = longNum;
doubleNum = floatNum;

从上面代码的结果来看,boolean除外,7个基本类型间根据其可表示的数据范围,有明显的地位高低(较大范围类型的变量可以承接住较小范围类型变量的赋值)。基于该特征,7种类型排列组合后整理的可赋值汇总表如下:


2.png

解析:除了short=char char=byte这两种情况不支持外,其余的都符合"大可以接住小的"的规律。


不同的基本类型进行运算符运算之后类型是否会变


byte byteNum = 1;
char charNum = 2;
short shortNum = 3;
int intNum = 4;
long longNum = 5;
float floatNum = 6;
double doubleNum = 7;

byte byteNum2 = byteNum + byteNum;  //编译错误,byte与byte相加,会变为int类型(冷知识)
float floatNum2 = floatNum + charNum;
double doubleNum2 = doubleNum + floatNum;

从上面代码结果来看,基本上还是谁拳头大听谁的,结果是参与运算的变量里范围最大的类型。但是几个小弟(short、char、byte)间的规则有点特殊,总结汇总如下:

3.png

解析:short、char、byte、int之间参与运算的话,统一变为int类型,其余的情况符合“变为参与运算类型较大的类型”的规律。


类里的成员如果是基本数据类型, 那么会自动初始化吗?初始化成什么?


会, 初始化为0或者false。


代码中出现的具体数字直接数会被当成什么类型?


float num1 = 123;
float num2 = 123.0; //编译错误
float num3 = 123.0f;

整数会自动作为int,小数会自动作为double,所以要给float变量赋值,小数必须显示增加f标识。


基本类型与其对应的包装类型进行 == 比较,比较的是地址还是值?


Integer num5 = 128; 
int num6 = 128;
System.out.println(num5==num6);

上述结果为true。包装类型会自动拆包,比较两者的值。


Integer包装类型之间使用==比较,比较的是地址还是值?


Integer num1 = 128;
Integer num2 = 128;
System.out.println(num1==num2);
Integer num3 = 127;
Integer num4 = 127;
System.out.println(num3==num4);

结果是false,true。比较的是对象的地址。

解析:num1跟num2是两个Integer对象,地址不相等。由于JVM为Integer准备了-128到127的整形常量池,num3、num4都指向同一个对象(常量池里127对应的Integer对象)。


自动拆箱、自动装箱发生在哪个阶段?编译阶段还是运行时?


自动拆装箱是一种语法糖,在编译阶段,Java平台自动为我们做了转换,以保证不同写法在运行时等价(生成的字节码一致)。

自动装箱:Integer num = 1 自动转换为 Integer num = Integer.valueOf(1);

自动拆箱:int number = num 自动转换为 int number = num.intValue();


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。