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   Rxr 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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java--对象引用与对象的区别
在java学习中,理解对象以及对象的引用是万里长征的第一步。但是,现在大量的java学习书籍都将对象以及对象的引用混为一谈,然而实际上它们有着本质的区别。为了帮助更多的java学者更好的理解,我将自己的学习理解记录下来。如有理解不全或者错误的地方,欢迎大家批评指正。
java中对象和对象引用的区别!
如下表达式: A a1 = new A(); 它代表A是类,a1是引用,a1不是对象,new A()才是对象,a1引用指向new A()这个对象。 在JAVA里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在JAVA里,“=”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的过程,而是一个传地址的过程,被译成赋值语句会造成很多误解,译得不准确。 再如: A a2; 它代表A是类,a2是引用,a2不是对象,a2所指向的对象为空null; 再如: a2 = a1; 它代表,a2是引用,a1也是引用,a1所指向的对象的地址传给了a2(传址),使得a2和a1指向了同一对象。 综上所述,可以简单的记为,在初始化时,“=”语句左边的是引用,右边new出来的是对象。 在后面的左右都是引用的“=”语句时,左右的引用同时指向了右边引用所指向的对象。 再所谓实例,其实就是对象的同义词。
Java对象、对象引用关系及参数传递讨论
学习Java的过程中,很容易将对象及对象引用混为一谈,而且我们平时在交流时为了方便起见也只是对象怎样、对象怎样,但很多时候我们操作的,根本上来说是对象,但直接操作的却是对象的引用。 先贴一篇博文,非常形象的解释了对象及对象引用间的关系 .Java语言中通过对象的引用来操纵对象,要注意的一点是对象和对象的引用是存储在不同的地方的,因为对象往往所占的空间要求比较大,所以对象存储在堆中,而为了便于操作,对
java对象引用概念
我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式。这方面的讨论将引出“对象引用”(object reference)这一重要概念。   对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test { public static void main(String[] args) {
Java中对象和引用对象
Case cc;  //在栈内存里面开辟了空间给引用变量cc,这时cc=null''' cc=new Case();1. new Case()在堆内存里面开辟了空间给Case类的对象,这个对象没有名字2. Case()随即调用了Case类的构造函数3. 把对象的地址在堆内存的地址给引用变量ccJava对象和引用的关系可以说是互相关联,却又彼此独立。彼此独立主要表现在:引用是可以改变的,它可以指向别...
java——对象的引用级别
为了更加灵活的控制对象的生命周期,jdk1.2以后,将对象的引用分为4个级别: 一、强引用(StrongReference) 特性:当内存空间不足时,java虚拟机宁可抛出OutOfMemoryError错误,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 二、 软引用(SoftReference) 特性:除非JVM即将OutOfMemory,否则不会被GC回收
Java父类对象引用指向子类对象
今天看到一行代码
java序列化之后,对象的引用关系?
今天写代码的时候用到序列化,不过突然想到这个问题。 于是写了一些测试代码,得出两个结论。 如果两个对象存在引用关系,比如A引用B。 如果两个对象是各自序列化的,则引用关系不再存在。 如果两个对象是是另一个类对象C的成员,序列化C,反序列化C之后,A和B的引用关系还存在。
对象引用和值引用的区别
/**对象引用和值引用的区别 ,画图就清楚了*/     public static void main(String[] args) {         String str1 = "string interning"; // string literal会被自动”扣留“         String str2 = new String(str1);   // 这时产生了两个内容相同的St
Nosql的一些疑问
couchbase,membase与memcached的关系是? 我了解memcached是什么,但是不知道前面2者与它的关系是什么? 就我的理解,好像前面2者只是提供了一个memcached的管理页面?其实还是memcahced的东西? 另外,为什么couchbase的安装包90M,而memcached只有200KB... Membase 后来改名为 Couchbase,Couchbas