引用数据类型的几个问题
-
数据类型除了基本数据类型就是引用数据类型,两者的本质区别就是一个是保存的真正的值,而另一个是保存的地址,在JVM解析引用数据类型变量的时候,会根据变量保存的地址进一步解析到其保存的值。
-
为引用数据类型赋值就是修改该引用变量的指向,那么在Java中,引用数据类型都存储在堆内存中。
User u = new User(1);
u = new User(2);//重新修改u的指向,第一次new的那个user依然在堆内存中,但是此时没有指向了,会被JVM回收。
- 引用数据类型大小的计算,确定一个变量为引用数据类型以后,如何确定所占用的字节数,这就涉及到了对象大小的计算,在Java中,int 4个字节,char 1个 字节 byte 1个字节 short 2个字节 long 8个字节,而一个引用数据类型在64位操作系统下往往占8个字节。
class User{
private int id;
private long age;
private User user;
}
如下的一个对象,字节占用数就是 4 + 8 + 8 = 20,Java中如果不足8的倍数会补齐,也就是最后会占用24个字节。
- 一个变量赋值给其他变量后对这个变量重新赋值不会改变原来的值。
Person top = new Person();
Person p1 = new Person();
p1.setName("p1");
Person p2 = new Person();
p2.setName("p2");
Person p3 = new Person();
p3.setName("p3");
top = p2;
p2.setGoodFriend(p1);
p3.setGoodFriend(top);
System.out.println(p3);
System.out.println(top);
top = p3;
System.out.println(top);
执行 p3.setGoodFriend(top);时由于top就是一个引用数据类型,所以将top赋值给p3.goodFriend是,实际上只是将top所保存的内存地址赋值给了p3.goodFriend,那么此时p3.goodFriend 与 top 与 p2指向的都是同一块内存地址。那么此时将p3赋值给top,那一样的道理,只是将p3的地址赋值给了top,top这个引用此时保存的是p3的地址。在top赋值给p3.goodFriend时还是保存的p2的地址,此时只是让top重新保存p3的地址,也就是一个变量的赋值只影响当前保存的值是什么,不会影响已经赋值过的,已经赋值过的依然会保存在堆内存中。