Java对象及其引用

先搞清楚什么是堆,什么是栈。 
Java开辟了两类存储区域,对比二者的特点

存储区域 存储内容 优点 缺点 回收
基本类型的变量和对象的引用变量 存取速度比堆要快,仅次于寄存器,栈数据可以共享 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量 当超过变量的作用域后,Java会自动释放掉该变量,内存空间可以立即被另作他用
由new等指令创建的对象和数组 可以动态地分配内存大小,生存期也不必事先告诉编译器 由于要在运行时动态分配内存,存取速度较慢 由Java虚拟机的自动垃圾回收器来回收不再使用的数据

堆栈的存储特点决定了其中存储的数据类型。

注意,栈内存储的除了基本类型的变量(int 这种类型的变量)还会存储对象的引用变量。java中,引用变量实际上是一个指针,它指向的是堆内存中对象实例。

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

以下分解成了四个步骤。

Case cc; '''在栈内存里面开辟了空间给引用变量cc,这时cc=null'''
cc=new Case();
'''
1. new Case()在堆内存里面开辟了空间给Case类的对象,这个对象没有名字
2. Case()随即调用了Case类的构造函数
3. 把对象的地址在堆内存的地址给引用变量cc
'''

这样我们就明确了:

  • Java中,这里的“=”并不是赋值的意思,而是把对象的地址传递给变量;
  • 对象创建出来,其实连名字都没有,因此必须通过引用变量来对其进行操作。

为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球

关于对象与引用之间的一些基本概念。

初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象和对象的引用混为一谈。可是,如果我分不清对象与对象引用,

那实在没法很好地理解下面的面向对象技术。把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。

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

class Vehicle {

int passengers;

int fuelcap;

int mpg;

}

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

Vehicle veh1 = new Vehicle();

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

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

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

3)左边的“Vehicle veh 1”创建了一个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对象与对象引用变量相关推荐

  1. Java对象和引用变量

    对于引用变量的深层含义,未必在初学的时候就能深刻理解, 所以理解好下面这两句话的真正含义非常重要 Case cc=new Case();Case cc; cc=new Case(); 1.先搞清楚什么 ...

  2. JNI-获取Java对象的成员变量-GeInttField()

    例: 在Java中定义一个属性,然后用C语言将其设置成另外的值,并输出出来. Java代码: Person.java package com.yuneec.demo;public class Pers ...

  3. java对象命名用变量_在Java语言中,所有的变量、常量、对象和类都是用【 】来命名的。...

    语言中有的用单选(3分) 对于以下代码: int i=6; if ( i<= 6 ) printf(\"hello\\n\");; else printf(\"by ...

  4. 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优

    67.Java垃圾收集机制 67.1.对象引用 67.2.垃圾对象的判定 67.3.垃圾收集算法 67.3.1.标记-清除算法 67.3.2.标记-整理算法 67.3.3.分代收集 67.4.垃圾收集 ...

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

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

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

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

  7. java对象创建与引用变量的详解

    创建对象与引用变量 创建对象 基本类型变量和引用类型变量的区别 存储的值 赋值 引用数据和NULL 创建对象 ClassName objectRefVar = new ClassName(); 这条语 ...

  8. Java对象的存活判定与对象引用

    文章目录 Java对象的存活判定与对象引用 对象的存活判定 引用计数算法 可达性分析算法 对象的引用 强引用 软应用 弱引用 虚引用 终结器引用 Java对象的存活判定与对象引用 对象的存活判定 在堆 ...

  9. java中String对象和String变量

    2019独角兽企业重金招聘Python工程师标准>>> java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看 ...

最新文章

  1. 案发设计与分析 试验一
  2. 强化学习(三)—— 策略学习(Policy-Based)及策略梯度(Policy Gradient)
  3. php抓取页面400错误
  4. Struts2中ActionContext和ServletActionContext
  5. 如何使用 一行代码 搞定一组数据的(极值、平均值、中位数、四分位数、数量统计和标准差)
  6. 为什么需要架构图,怎么画?
  7. apt-get更新软件包_如何使用Apt-fast加速软件包下载和更新
  8. linux查看一小时之内的日志,linux – 在[timespan]内(例如最后一小时)查找日志文件中的条目...
  9. Z-BlogPHP导航主题模版源码 绿色完美版
  10. Spring.NET 中的 ADO.NET 数据访问的示例
  11. U盘加载硬盘控制卡驱动安装Windows 2003 指南
  12. 谷歌披露利用 Windows 和安卓双平台的高阶攻击活动
  13. redis数据类型之hash入门
  14. Git 和 SVN之间的五个基本区别
  15. windows程序介绍
  16. visio如何粘附或取消粘附连接线
  17. macos复制粘贴快捷键 快速_mac复制粘贴快捷键
  18. html新浪短域名api,新浪短网址官方api接口
  19. 计算机组成原理DROM,最新版 计算机组成原理试题及答案a
  20. StringBuffer 拼接字符串时,删除最后一个逗号

热门文章

  1. vue使用xe-utils通用函数库
  2. 智能家居DIY之智能吸顶灯
  3. MySQL图形化用户界面客户端的安装与介绍(SQLyog)
  4. Chrome技巧-如何精准搜索
  5. CSDN博客搬家知乎
  6. 【c语言中的运算符】
  7. C语言实现模拟用户登录
  8. EXCEL如何设置,使表格能自动调整列宽以适应文字长度
  9. 微信小程序低功耗蓝牙BLE快速开发js
  10. java 抽象final_java抽象、接口 和final