一、Vehicle veh1 = new Vehicle();

通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作。

1.new Vehicle  :表示在堆空间内创建了一个Vehicle类的对象。

2.():表示调用Vehicle的构造函数,初始化新创建的对象。

3.Vehicle veh1 :表示在栈空间内创建了一个Vehicle类的引用。

4. = :表示把栈空间的这个引用指向堆空间内的对象。

二、对象引用和对象之间的关系

我们可以把这条语句拆成两部分:

Vehicle veh1;

veh1 = new Vehicle();

对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球。 如果只执行了第一条语句,还没执行第二条,此时创建的引用变量veh1还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。 它是一根绳,一根还没有系上任何一个汽球的绳。执行了第二句后,一只新汽球做出来了,并被系在veh1这根绳上。我们抓住这根绳,就等于抓住了那只汽球。

Vehicle veh2;

就又做了一根绳,还没系上汽球。如果再加一句:

veh2 = veh1;

系上了。这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,veh2也指向了veh1所指向的对象。两根绳系的是同一只汽球。

如果用下句再创建一个对象:

veh2 = new Vehicle();

则引用变量veh2改指向第二个对象。

从以上叙述再推演下去,我们可以获得以下结论:

(1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);

(2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。

如果再来下面语句:

veh1 = veh2;

按上面的推断,veh1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条绳子系住它,它飞了。多数书里说,它被Java的垃圾回收机制回收了。

这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。

三 例程分析

public class ObjectRef {//基本类型的参数传递public static void testBasicType(int m) {System.out.println("m=" + m);//m=50m = 100;System.out.println("m=" + m);//m=100}//参数为对象,不改变引用的值 ??????public static void add(StringBuffer s) {s.append("_add");}//参数为对象,改变引用的值 ?????public static void changeRef(StringBuffer s) {s = new StringBuffer("Java");}public static void main(String[] args) {int i = 50;testBasicType(i);System.out.println(i);//i=50StringBuffer sMain = new StringBuffer("init");System.out.println("sMain=" + sMain.toString());//sMain=initadd(sMain);System.out.println("sMain=" + sMain.toString());//sMain=init_addchangeRef(sMain);System.out.println("sMain=" + sMain.toString());//sMain=init_add}}

  

  add方法的参数是一个对象,当把sMain传给参数s时,s得到的是sMain的拷贝,所以s和sMain指向同一个对象,因此,使用s操作影响的其实就是sMain指向的对象,故调用add方法后,sMain指向的对象的内容发生了改变。

在changeRef方法中,参数也是对象,当把sMain传给参数s时,s得到的是sMain的拷贝,但与add方法不同的是,在方法体内改变了s指向的对象(也就是s指向了别的对象,牵着气球的绳子换气球了),给s重新赋值后,ssMain已经毫无关联,它和sMain指向了不同的对象,所以不管对s做什么操作,都不会影响sMain指向的对象,故调用changeRef方法前后sMain指向的对象内容并未发生改变。

  对于add方法的调用结果,可能很多人会有这种感觉:这不明明是按引用传递吗?对于这种问题,还是套用Bruce Eckel的话:这依赖于你如何看待引用,最终你会明白,这个争论并没那么重要。真正重要的是,你要理解,传引用使得(调用者的)对象的修改变得不可预期。

参考原文:http://www.cnblogs.com/focusChen/articles/2497768.html

转载于:https://www.cnblogs.com/lyr2015/p/6432170.html

Java 对象引用以及对象赋值相关推荐

  1. Java中ListE对象赋值问题(引用传递和值传递)

    Java中List<E>对象赋值操作问题 业务需求是:取2个集合中的交集对象并返回.如下代码,busMap中key值和stocks中Map中的key值相等的对象则返回继续操作,也就是说剔除 ...

  2. Java中子类对象赋值给父类变量

    1. 在Java中将一个字类对象赋值给父类变量是合法的,这也是实现多态(即方法的动态分派)的前提条件之一. 2. 在Java中父类赋值同样也适用于数组.可以将一个子类数组赋值给一个父类数组变量.但可能 ...

  3. Java对象引用与对象的区别

    本文由广州疯狂软件java培训分享: 为便于说明,我们先定义一个简单的类: class Vehicle { int passengers; int fuelcap; int mpg; } 有了这个模板 ...

  4. java两个对象赋值_一起学Java(二十六)----- 对象之间赋值

    不积跬步,无以至千里:不积小流,无以成江海. Java语言基础 Java对象之间赋值 赋值是用等号运算符" = "进行的,在对对象进行"赋值"时,实际就是将句柄 ...

  5. java对象 引用 原理,java对象引用和对象值得行为

    关于java对象和传值得问题,偶然间在看js的时候,发现的一个无效转换对象数据的问题,自己感觉有点疑惑,以为是js的特性,随机想在java上面证实一下,结果发现并不是js的特性,java也是如此然后查 ...

  6. JAVA移慎_java里面给对象赋值,慎用赋值符号(=) (转)

    java里面给对象赋值,慎用赋值符号(=) (转)[@more@] 对于来说,注意变量名类似于指针,所以请慎用赋值符号(=)! 比如下面的代码: ArrayList alAll = new Array ...

  7. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别

    起因:取一个list给另一个list赋值,然后在另一个list中取出进行修改.list其中类型为对象时,String时,基本数据类型时. [java中的对象类型与基本数据类型的区别] #声明和实例化 ...

  8. java中的对象引用与c++中的对象赋值

    1.java中的的对象引用与c++中的对象赋值比较 1.1在JAVA中用等号对类对象进行赋值,实际上操作的是对象的地址.等号左边的对象名是对象引用,右边可以是对象引用或者对象本身. eg: packa ...

  9. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

最新文章

  1. linux 恢复win7引导,双系统重装win7后恢复ubuntu引导
  2. 使用instsrv.exe+srvany.exe将应用程序安装为windows服务
  3. iOS 系统版本判断
  4. pyqt5 tableview 设置行颜色_Tools Ⅰ:如何用 PyQt5 和 Qt Designer 在 Pycharm 中愉快地开发软件...
  5. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信
  6. 2019大疆PC软件开发笔试——开关和灯泡两个电路板
  7. Apache CXF 3.0:CDI 1.1支持可替代Spring
  8. 物联网:不要幻想今年会突飞猛进,但行业依然亢奋
  9. 网络自由访问 巧解除Win XP文件共享限制
  10. Python--itertools包--groupby使用(分类)
  11. 大话设计模式之爱你一万年:第一章 设计模式基本概念:1.软件设计模式概述
  12. 数学模型:传染病模型
  13. 土法炼钢:服务器定时汇报IP地址给我
  14. 常见面试题及解答|计算机网络
  15. 如何提问,才能让别人回答我们的问题呢?
  16. 收藏:什么是PACD工作法
  17. [转载]转录组测序分析中cufflinks的使用及问题
  18. C语言+EasyX实现数字雨
  19. dmz和端口映射_使用DMZ主机功能代替FTP服务端口映射无法使用的问题
  20. 20200428 线程安全(上)--彻底搞懂volatile关键字

热门文章

  1. 【嵌入式】Libmodbus之RTU模式Master端程序示例
  2. 【STM32】FreeRTOS创建和删除任务示例(静态方法)(了解)
  3. 【C++】 C++标准模板库(三) Map
  4. 登录mysql报错2059_navicat连接mysql报错2059的解决方法
  5. 每天一道LeetCode-----判断数组中是否存在两个位置上面的值相等并且下标的差小于某个值
  6. fortran的bug:Fortran runtime error: Unit number in I/O statement too large
  7. iOS Hacker 重签名实现无需越狱注入动态库 dylib
  8. TeamViewer密码存储
  9. Uart接口的详细解释
  10. 提高效能 自我关怀的六个习惯