java 对象引用关系疑问

问题描述

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原先指向的对象

时间: 2024-08-30 18:30:12

java 对象引用关系疑问的相关文章

jfreechart 的java对象关系简释

chart|java对象  jfreechart 的java对象关系简释 博客中国分类:java技术,  jfreechart是一个优秀的开源JAVA 2D项目,缺点是缺乏文档,中英文都是如此.本文是经验总结的第二部分 二.jfreechart作图类对象的协调关系 jfreechart 的绘图对象由一个org.jfree.chart.JFreeChart组成,但作为绘图关键的Graphich2d通过 org.jfree.chart.render.*中的对应render类包装后设入,换言之,开发者

java的关系运算符

关系运算符生成的是一个"布尔"(Boolean)结果.它们评价的是运算对象值之间的关系.若关系是真实的,关系表达式会生成true(真):若关系不真实,则生成false(假).关系运算符包括小于(<).大于(>).小于或等于(<=).大于或等于(>=).等于(==)以及不等于(!=).等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型. 1. 检查对象是否相等 关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找

指针-Java对象引用指向的问题

问题描述 Java对象引用指向的问题 有以下代码: package com.lzw; import java.util.*; public class UpdateStu implements Comparable{ String name; long id; public UpdateStu(long id, String name) { this.id = id; this.name = name; } public int compareTo(Object o) { UpdateStu u

并发性-Web服务器的最大并发数和进程线程的关系疑问

问题描述 Web服务器的最大并发数和进程线程的关系疑问 刚才看了一篇关于进程线程的文章,一个进程会分配2G可用内存,一个线程默认会分配1M内存.那么一个进程最多能产生2000左右的线程数.那么一个web服务器(Tomcat)中一个请求过来,就会创建一个线程来处理,理论上不是只能最多处理2000并发请求了?而nginx好像可以处理更大并发(上万个).这是怎么实现的(不是每个请求生成一个线程?)?另外一个进程会分配2G可用内存是不是绝对的?还是只针对32位系统,64位是不是不止这个大小. 请高手指点

史上最全Java集合关系图

        说是史上最全,或许有点吸引眼球的嫌疑了,但我在网上确实也没有找到更全的,这图也是我对照Java源码挨个分析,画出了较为常见的关系图,及其重要特性. 图中部分集合的使用事例可以参见我的github(点击访问),部分集合的源码分析可以参见我的CSDN的其他文章.如果需要下图的vsdx原图,请点击此处下载,Java集合关系图.         下图由于CSDN对图像尺寸有限制,可能有点模糊,可以点此访问http://img.blog.csdn.net/20160124221843905

java-有关Java static的疑问(凑字数的...)

问题描述 有关Java static的疑问(凑字数的...) public class StaticTest { private static List<String> listA; private static List<String> listB; static { listA = new ArrayList<String>(); listA.add("aaa"); setB(listB); } public static void main(S

java 数据库操作疑问,有没有大神?

问题描述 java 数据库操作疑问,有没有大神? java 要处理3张表 表直接没外键关联,3张表必须同时处理成功! 其中任何张表操作失败怎么处理:有没有好的事物处理,求正解 public void undoUpdate(CaseFreezeDTO dto) { // 保存bb2dc表 Bb2dc bb2dc = new Bb2dc(); BeanHelper.copyProperties(dto, bb2dc); hibernate.save(bb2dc); // 更新案件状态 Bb1a bb

JSP编译成Servlet(四)JSP与Java行关系映射

我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class文件的过程需要考虑的事情比较多,其中一个比较重要的就是调试问题,由于语法不一样,jsp某行执行的逻辑怎样与java文件对应起来,这样在JVM执行过程发生异常或错误才能找到JSP对应的行,提供一个友好的调试信息.类似的,jsp文件名编译后的java文件名同样也要有映射关系.     总的来说,为了解决

JAVA开发的疑问?

问题描述 C++开发的时候,在windows开发一些通讯软件,需要调用windows的一些API,需要学windows编程.那么如果用JAVA在windows下开发一些通讯软件,或者其他软件,需要用windows的API去实现某些功能,那么是不是还要学习windows编程,还是直接学懂jdk,在什么操作系统的编程都可以得心应手呢?其实主要的问题,是想问,java的编程是不是只要研究好jdk,在windows下开发已经可以完成很多软件开发的工作? 解决方案 解决方案二:java由于是跨平台的,做出