对象
在内存中对象的名字是存储在栈空间里的,而后面new出来的那一部分是存储在堆空间里。也就是说在堆空间里存放的是对象的主体部分(方法、字段)。
例如:
public class User {
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
public class Test {
public static void main(String[] args) {
User u1 = new User();
User u2 = new User();
User u3 = new User();
}
}
在内存中的存储情况如图:
但是如果这样做:
public class Test {
public static void main(String[] args) {
User u1 = new User();
u1.setScore(50);
System.out.println("u1.score=" + u1.getScore());
User u2 = new User();
u2 = u1;
u2.setScore(0);
System.out.println("u1.score=" + u1.getScore());
}
}
执行结果:
虽然只改变了u2但是由于之前将u1赋值给了u1所以u1发生了变化。在内存中u1和u2指向了同一块内存空间,如图:
再看另外一种情况:
public class Test {
public static void main(String[] args) {
User u1 = new User();
u1.setScore(50);
User u2;//这里由于下面的u2 = u1所以不用new了,否则浪费空间
u2 = u1;
User u3 = new User();
u1 = u3;
u2.setScore(100);
u3.setScore(0);
System.out.println("u1的地址="+u1);
System.out.println("u2的地址="+u2);
System.out.println("u3的地址="+u3);
System.out.println("u1.score"+u1.getScore());
}
}
执行结果:
发现u1和u3的内存地址相同,而u2还是原来u1的内存地址。然后改变u2.score和u3.score发现u3和u1一样的。
在内存中:
之后经过u1 = u3变成下图: