本文由广州疯狂软件java培训分享:

  为便于说明,我们先定义一个简单的类:

  class Vehicle {

  int passengers;

  int fuelcap;

  int mpg;

  }

  有了这个模板,就可以用它来创建对象:

  Vehicle veh1 = new Vehicle();

  通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。

  1)右边的“new Vehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。

  2)末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。

  3)左边的“Vehicle veh1”创建了一个Vehicle类引用变量。所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。

  4)“=”操作符使对象引用指向刚创建的那个Vehicle对象。

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

  Vehicle veh1;

  veh1 = new Vehicle();

  效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。

  在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,我们仔细研究一下第二句,找找刚创建的对象叫什么名字?有人说,它叫“Vehicle”。不对,“Vehicle”是类(对象的创建模板)的名字。一个Vehicle类可以据此创建出无数个对象,这些对象不可能全叫“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的垃圾回收机制回收了。这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。

  由此看来,下面的语句应该不合法吧?至少是没用的吧?

  new Vehicle();

  不对。它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象,就不需要用引用变量来系住它。最常见的就是打印字符串:

  System.out.println(“I am Java!”);

  字符串对象“I am Java!”在打印后即被丢弃。有人把这种对象称之为临时对象。

  对象与引用的关系将持续到对象回收。但是,关于这一点,打算在下文“简述Java回收机制”再说。

  疯狂软件教育中心依托开发团队的强大技术实力,把企业最新技术融入实训课程,打造金牌的品质,才能给予学员黄金的未来,疯狂软件凭借过硬的技术实力与丰富的项目开发经验,赢得了社会的肯定。疯狂软件Java培训师资力量强大,课程内容深入,为学员高薪就业做了很好的铺垫,拥有丰富就业指导经验的就业团队也成为了学员高薪就业的先天优势。地址:广州天河区车陂沣宏大厦3楼。

转载于:https://www.cnblogs.com/gojava/p/3615513.html

Java对象引用与对象的区别相关推荐

  1. Java 对象引用以及对象赋值

    一.Vehicle veh1 = new Vehicle(); 通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作. 1.new Vehicle  :表示在堆空间内创建了一个Vehicle ...

  2. 怎么来理解java类和对象的区别

    对象在需求中的使用 在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. 以把大象装冰箱为例进行分析: 在针对具体的需求,可以使用名词提炼的办法进行分析,寻找具体的对象. 需求:把大象装冰箱里 ...

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

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

  4. java几种对象的区别(PO,POJO,VO,BO,DAO)

    PO(persistant object 持久对象) :与数据库中的表相映射的java对象,每个属性基本都对应数据库表里面某个字段: 可以理解为一个PO就是数据库中的一条记录,一条记录即为一个对象. ...

  5. 【微信小程序】java中类和对象的区别

    目录 Kafka的基本介绍 Kafka的设计原理分析 Kafka数据传输的事务特点 Kafka消息存储格式 副本(replication)策略 Kafka消息分组,消息消费原理 Kafak顺序写入与数 ...

  6. 复习Java类与对象Java字符串面试题生活【记录一个咸鱼大学生三个月的奋进生活】003

    记录一个咸鱼大学生三个月的奋进生活003 复习Java(类与对象) 学习Java面试题 初步规划软件测试课设 健身 照片分享 复习Java(类与对象) 既然要说类与对象那就要明确 面向对象 这个概念: ...

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

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

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

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

  9. 练习-Java类和对象之对象引用之模拟手机功能

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 任务: 实现手机的基本功能. 手机具有属性:品牌(brand).型号(type).价格(price).操作系统(os)和内存( ...

最新文章

  1. .NET Core如何为项目提供高性能解决方案?
  2. sqlite在c++中的使用方法
  3. css3让元素自适应高度
  4. ORA-01658:无法为表空间XXX中的段创建initial区
  5. java 死锁种类_用java写一个死锁
  6. 安装完SqlServer2008,wamp服务器无法启动的问题
  7. 博士考试考完了,庆祝一下
  8. 微信Windows 3.3.0内测发布 可以刷朋友圈了
  9. Retinex算法介绍
  10. C/C++ 程序员的编程修养
  11. python分析《水浒传》小说,对文本数据内容清洗、分词、统计、词云可视化展示
  12. Canvas递归画一棵树
  13. AI穿墙而过?MIT最新研究发现AI能跟踪行动轨迹
  14. 大数据以及Hadoop相关概念介绍
  15. 马云坦然不懂计算机,来自马云的绝望:三角函数让我彻底失去学数学的信心
  16. 微服务ServiceMesh及三种服务发现机制
  17. 临近2022年末: Android 开发者的出路在哪?转行还是进阶?
  18. 江苏省计算机二级c语言题型分值,计算机二级C语言题型和评分标准
  19. 4核8g mysql 配置_Mysql配置文件 4c8g优化
  20. html表格怎么控制文字大小,如何用html设置文本输入框输入字体的大小

热门文章

  1. multipart/form-data ajax 提交问题(未解决)
  2. Java那些事之Berkeley DB
  3. SqlServer2012清除日志文件
  4. 初学者如何学习Vim
  5. word经常用到的技巧
  6. python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题
  7. 海量数据处理_国家重点研发计划“面向异构体系结构的高性能分布式数据处理技术与系统”简介...
  8. .sh文件是什么语言_shell命令在C语言程序中的调用
  9. UVA10970大块巧克力
  10. hdu2167 方格取数 状态压缩dp