问题描述
- java 对象引用关系疑问
-
源码如下:
vo1被赋值null后 vo2不受影响, 请帮忙解释下原理 .
非常感谢.Product vo1 = new Product(1, "iphone 5s", 5000) ; Product vo2 = vo1 ; System.out.println("vo1: " + vo1); System.out.println("vo2: " + vo2); vo1.setId(222); // 因为是引用类型 所以 vo1与vo2都会被赋值 System.out.println("vo1: " + vo1); System.out.println("vo2: " + vo2); vo1 = null ; // vo1是null 但 vo2还是有值 . 原理 ?? System.out.println("vo1: " + vo1); System.out.println("vo2: " + vo2);
打印结果:
vo1: Product [id=1, name=iphone 5s, price=5000]
vo2: Product [id=1, name=iphone 5s, price=5000]
vo1: Product [id=222, name=iphone 5s, price=5000]
vo2: Product [id=222, name=iphone 5s, price=5000]
vo1: null
vo2: Product [id=222, name=iphone 5s, price=5000]
解决方案
vo2已经指向了vo1所指向的地址,vo1=null,只是vo1这个变为空指针,但是它原来指向的内容并没有空,被vo2指向着
解决方案二:
类:是对现实存在事物的一种抽象,一种高度的概括。
对象:是类的实例,是类中的一个个体,它具有该类的属性。
引用:当你引入一个包时,你可以引用该包内的类的对象,也就是说,引用针对的是类的对象。
【1】类和对象
class A{
public void test(){ ... }
}
A a = new A(); 这里a就是类A的对象。
【2】引用
class B{
public void setA(A a){
...
}
}
B b = new B();
b.setA(a);
这里的a就是A的引用
解决方案三:
vo1 = null
这个只是设置vo1对象为空
解决方案四:
这个就像
String str = new String("abc");
Product vo1 = new Product(1, "iphone 5s", 5000) ;
实际上是创建了两个对象
一个 vo1 和 new Product(1, "iphone 5s", 5000),这里的 = 将vo1指向了new Product(1, "iphone 5s", 5000),就相当于vo1引用了new Product(1, "iphone 5s", 5000)。当vo2=vo1的时候,也是让vo2指向了new Product(1, "iphone 5s", 5000);
让vo1指向null并不是让new Product(1, "iphone 5s", 5000)=null 也并不影响vo2指向谁。
所以最后输出结果是 null 和 Product [id=222, name=iphone 5s, price=5000]
解决方案五:
这个就像
String str = new String("abc");
Product vo1 = new Product(1, "iphone 5s", 5000) ;
实际上是创建了两个对象
一个 vo1 和 new Product(1, "iphone 5s", 5000),这里的 = 将vo1指向了new Product(1, "iphone 5s", 5000),就相当于vo1引用了new Product(1, "iphone 5s", 5000)。当vo2=vo1的时候,也是让vo2指向了new Product(1, "iphone 5s", 5000);
让vo1指向null并不是让new Product(1, "iphone 5s", 5000)=null 也并不影响vo2指向谁。
所以最后输出结果是 null 和 Product [id=222, name=iphone 5s, price=5000]
解决方案六:
由第一行vo1指向了5000这个值的地址,然后第二行vo1把5000这个值的地址让vo2指向了。这时vo1和vo2的值是5000,再看vo1=null这行,
vo1指向了null,这时vo2还是指向5000,运行出来的结果vo1=null,vo2=5000
解决方案七:
你要好好了解一下java的内存分布。也许对你理解这块知识更透彻。
java内存分为:堆内存,栈内存,常量池。
堆内存:存放new 出来的对象和数组。像你 new Product(1, "iphone 5s", 5000)这个对象就放到了堆内存中了。
栈内存:存储java的一些基本类型变量和对象的引用变量,它存放的是指向对象的地址。像你的vol1 和vol2的值其实是指向Product对象的地址而非对象本身。
vo1 = null ; 就是把存放原来对象的地址改成了null。而vol2依然还是原来对象。
解决方案八:
vo1为null而vo2指向vo1原先指向的对象