2 yongxu 16 yongxu_16 于 2016.03.17 14:45 提问

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]

8个回答

bdmh
bdmh   Ds   Rxr 2016.03.17 14:57
已采纳

vo2已经指向了vo1所指向的地址,vo1=null,只是vo1这个变为空指针,但是它原来指向的内容并没有空,被vo2指向着

yongxu_16
yongxu_16 简单明了
接近 2 年之前 回复
jiaziinfo
jiaziinfo   2016.03.17 14:48

类:是对现实存在事物的一种抽象,一种高度的概括。
对象:是类的实例,是类中的一个个体,它具有该类的属性。
引用:当你引入一个包时,你可以引用该包内的类的对象,也就是说,引用针对的是类的对象。
【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的引用

enpterexpress
enpterexpress   2016.03.17 15:02
 vo1 = null

这个只是设置vo1对象为空

gan_hua
gan_hua   2016.03.17 15:02

这个就像
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]

gan_hua
gan_hua   2016.03.17 15:03

这个就像
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]

epm_kf6_10
epm_kf6_10   2016.03.17 15:29

由第一行vo1指向了5000这个值的地址,然后第二行vo1把5000这个值的地址让vo2指向了。这时vo1和vo2的值是5000,再看vo1=null这行,
vo1指向了null,这时vo2还是指向5000,运行出来的结果vo1=null,vo2=5000

fubo1990
fubo1990   2016.03.17 16:10

你要好好了解一下java的内存分布。也许对你理解这块知识更透彻。
java内存分为:堆内存,栈内存,常量池。
堆内存:存放new 出来的对象和数组。像你 new Product(1, "iphone 5s", 5000)这个对象就放到了堆内存中了。
栈内存:存储java的一些基本类型变量和对象的引用变量,它存放的是指向对象的地址。像你的vol1 和vol2的值其实是指向Product对象的地址而非对象本身。
vo1 = null ; 就是把存放原来对象的地址改成了null。而vol2依然还是原来对象。

bi_ma_wen
bi_ma_wen   2016.03.17 18:07

vo1为null而vo2指向vo1原先指向的对象

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!