1. java中有哪些基本数据类型?占用的字节是多少?对应包装器类型是什么?
答:请看表。占用空间大小与平台是32位、64位无关。boolean类型所占空间大小没有明确指定,仅定义为能够取字面值true或者false。
2. 不同的基本类型之间可以相互赋值吗(哪些类型间赋值可隐式转换)?
byte
答:从面代码的结果来看,boolean除外,7个基本类型间根据其可表示的数据范围,有明显的地位高低(大的可以承接住小的赋值)。
解析:上面还只是一部分,为了清楚看清所有的赋值有无隐式转换的情况,总结了下表。从表中可看出:
double是绝对的大哥,谁都能罩;
float(占4字节)是二哥,虽然比三哥long(占8字节)个子矮,但是一身内功深厚;
int是四哥,毕竟是哥,五弟、六妹、七弟都能罩住;
short是五弟,功力有限,只能罩小师弟(七弟byte);
char六妹、byte七弟功力太弱,无奈只够自保;
3. 不同的基本类型进行运算符运算之后类型会变吗?
byte
答:从上面代码结果来看,基本上还是谁拳头大听谁的,结果是参与运算的变量里地位最高的哥的类型。但是几个小弟(short、char、byte)间的规则有点混乱,固总结下表。
大哥、二哥、三哥、四哥,只要谁在场,就都听谁的。
参与打架的没有四位大哥,只有五弟、六妹、七弟的话,统一听四哥的。(四哥小日子混的不错,权力还蛮大)
4. 类里的成员如果是基本数据类型, 那么会自动初始化吗?初始化成什么?
答: 会, 初始化为0或者false。
5. 代码中出现的具体数字会被当成什么类型?
float
答:整数会当成int,小数会当成double,所以要给float变量赋值,小数必须显示增加f标识。
6. 基本类型与其对应的包装类型进行 == 比较,比较的是地址还是值?
Integer
答:上述结果为true。包装类型会自动拆包,比较两者的值。
7. Integer包装类型之间使用==比较,比较的是地址还是值?
Integer
答:结果是false,true。比较的是对象的地址。
解析:num1跟num2是两个Integer对象,地址不相等。由于JVM为Integer准备了-128到127的整形常量池,num3、num4都指向同一个对象(常量池里127对应的Integer对象)。
Integer num3 = 127会被java平台编译转换为 Integer num3 = Integer.valueOf(127),而-128到127的数字是从常量池获取的逻辑就在Integer.valueOf方法中。
8. 自动拆箱、自动装箱发生在哪个阶段?编译阶段还是运行时?
答:自动拆装箱是一种语法糖,在编译阶段,Java平台自动为我们做了转换,以保证不同写法在运行时等价(生成的字节码一致)。
自动装箱:Integer num = 1 自动转换为 Integer num = Integer.valueOf(1);
自动拆箱:int number = num 自动转换为 int number = num.intValue();