日期:2014-05-20  浏览次数:20775 次

求助:关于java引用类型的疑问~
自定义类,都应该属于引用类型吧。
求人解释一下,两个引用指向同一个对象,其中一个设置为null了,为什么另一个引用还可以使用该对象?
Java code

 public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("张三");
        Student stu2 = stu;
        System.out.println(stu.hashCode());
        System.out.println(stu2.hashCode());
        stu = null;
        System.out.println(stu2.getName());
    }



打印结果:
11108810
11108810
张三 

而我期待的结果,应该是报一个空指针异常才对。因为stu为null了,stu2也应该为空,可是结果不是这样啊

------解决方案--------------------
求人解释一下,两个引用指向同一个对象,其中一个设置为null了,为什么另一个引用还可以使用该对象?


分清了....引用与对象.
让一个引用为null,就是说让这个引用不指向任何对象.
并不是说让这个对象消失了.因为你有另外的引用还在引用着这个对象,所以对象不会被销毁.

Student stu = new Student();
stu.setName("张三");
Student stu2 = stu;
System.out.println(stu.hashCode());
System.out.println(stu2.hashCode());
stu = new Student();//改一下,不是null,而是让它引用新的对
象,这样可能就更好理解了.
stu.setName("李四");
System.out.println(stu2.getName());
System.out.println(stu.getName());

------解决方案--------------------
本来stu和stu2都是指向同一个Student对象,
当stu=null后,只是将stu指向null,并没有影响到Student对象.stu2仍然指向那个Student对象.
------解决方案--------------------
String stu2=stu;
这一句是创建一个Student 类型的变量 stu2 同时让stu2指向stu所指向的那个对象,而不是让stu2指向stu。
------解决方案--------------------
堆现有一个student对象,stu指向它,后来stu2又指向它,再后来又让stu指向null的对象
但是此时stu2还是指向堆中的student对象