java对象引用和回收

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

初学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 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 关于指针的详解(对象引用 Java 中,指针的概念主要体现在对象引用上。对象引用存储的是对象的内存地址,通过对象引用可以访问操作对象。指针在 Java 中的作用包括对象引用、数组操作方法传递等。理解 Java 中指针的概念操作,有助于我们更好地理解使用 Java 对象模型,提高编程效率代码质量。希望本文的讲解示例对您有所帮助,如果您对 Java 中的指针或其他相关概念有任何疑问,欢迎随时交流探讨! 阅读详情

相关推荐

STM32+ESP32+UCOSII智能小车:双MCU架构与微信小程序远程控制实践

实时操作系统(RTOS)是嵌入式系统实现多任务管理与实时响应的核心软件架构,其通过任务调度、同步与通信机制,确保关键任务能在确定时间内执行。在物联网与智能硬件领域,RTOS的价值在于高效管理传感器数据采集、电机控制、无线通信等并发任务,提升系统可靠性与响应速度。典型应用场景包括智能家居、工业控制与移动机器人平台。本文聚焦于基于UCOSII实时操作系统的智能小车项目,深入探讨了STM32与ESP32双MCU架构下的任务划分、串口通信协议设计,并结合微信小程序实现了远程蓝牙控制,为嵌入式开发从裸机迈向RTOS、

weixin_33811539的博客 1683

Java对象及其引用

        初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象对象的引用混为一谈。可是,如果我分不清对象对象引用,那实在没法很好地理解下面的面向对象技术。把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。       为便于说明,我们先定义一个简单的类:       class Vehicle {int passe

beepbug的专栏 6106

使用GitLab+Drone CI持续集成自动部署web项目,图文详细

kind: pipeline # 定义对象类型,还有secretsignature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库

4080

Java创建对象的5种方式

可以随意的调用构造器。

weixin_41979002的博客 968

js vm报错_js vm报错

我们都知道JVM的内存管理是自动化的,Java语言的程序指针也不需要开发人员手工释放,JVM的GC会自动的进行回收,但是,如果编程不当,JVM仍然会发生内存泄露,导致Java程序产生了OutOfMemoryError(OOM)错误。产生OutOfMemoryError错误的原因包括:java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOf...

weixin_32239523的博客 890

JAVA包装临时对象

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> 包装临时对象一个方法需要返回两个及以上字段时,我们一般会封装成一个临时对象返回,现在有了PairTriple就不需..

kaige8312的博客 815

java springboot 在测试类中声明临时Bean对象

先 SpringBootTest 声明这是个测试类 然后 Import 导入我们刚刚写的 configBean。这里 我们用Configuration声明 我们这是个配置类 然后 里面配置一个Bean。因为 我们String本身是个字符串对象 所以 它也可以被设置为Bean。这样配置 是不会运行到其他地方的 仅作用于我们当前测试类 非常的好用。这样 我们声明了一个bean 字符串类型 叫 msg。中 我们讲了怎么在测试类中设置临时属性。然后 我们测试类代码编写如下。然后 我们条件装配msg。

weixin_45966674的博客 388

Java 垃圾回收对象引用

一、垃圾回收 Java中垃圾回收算法是可达性分析,要真正...

M_Andrain的博客 141

java对象回收过程_Java对象引用回收

1、垃圾回收器需要关注的内容ava运行时内存区域的各个部分中,程序计数器、虚拟机栈、本地方法栈这三个区域的生命周期线程相关,栈中的栈帧随着方法的进入退出执行着进栈出栈,每一个栈帧分配多少内存基本上在类的结构确定下来的时候就已经知道了,因此这3各区域的内存分配回收都是确定的,因此不必过多考虑这三个区域的内存回收问题,因为方法结束后或者线程结束时,内存就会被自然回收java方法区则不一样...

weixin_42517649的博客 543

对象引用JAVA 各种reference垃圾回收机制

时间紧张,先记一笔,后续优化与完善。     明天好好学习了一下java中的各种reference.     一共分为以下几种:          1. 强引用      2. 软引用 SoftReference     3. 弱引用 WeakReference     4. 虚引用 PhantomReference          5. FinalReference 全部实现...

weixin_34375251的博客 151

Python 对象引用、垃圾回收的详解

Python 对象引用、垃圾回收的详解 一、对象引用: Python Java中的变量本质不一样,Java的变量可以理解为一个盒子,用来容纳我们的对象,使用前需要声明,好分配给我们合适的内存空间。Python的变量可以理解为一个便利贴,先构造处对象,再将变量贴在对象上。 Python变量没有类型,对象才有,本质上是指针,同一个变量可以表示不同对象 举个栗子: a = 6 实际分为三个步骤: ...

Fe_cow的博客 663

ps scavenge java_Java垃圾回收机制

垃圾回收机制垃圾回收(GC)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用对象占据的内存空间的一种机制。PS:Java 中的垃圾回收一般是在 Java 堆中进行,因为堆中几乎存放了 Java 中所有的对象实例。垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身。换言之,垃圾回收只会负责释放那些对象占有的内存。对象是个抽象的词,包括引用其占据的内存...

weixin_34562922的博客 4714

Java基础11 对象引用

Java基础11 对象引用 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式。这方面的讨论将引出“对象引用”(object reference)这一重要概念。 对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test { public static void main(String[] args) {

江叶的博客 233

java中stack heap的区别,java中的垃圾回收机制

#. 在java中有两类内存。分别称为stack(栈)heap(堆)。 stack是程序内存空间,因此所有的基本类型对象的引用是存在stack中。 heap是java虚拟机储存对象的,它是一个巨大的内存,当你创造一个对象java虚拟机把对象放入heap中,把创造的对象的地址放入stack中。 因此,基本类型、对象的引用储存在stack中;对象储存在heap中。 #. java中的垃圾

吧啦吧啦F 1万+

java对象引用_Java基础11 对象引用

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式。这方面的讨论将引出“对象引用”(object reference)这一重要概念。对象引用我们沿用之前定义的Human类,并有一个Test类:public classTest{public static void...

weixin_30420175的博客 277

【JVM】垃圾回收机制

垃圾回收机制、方法区的回收、堆回收、基本介绍、五种对象引用、垃圾回收算法 标记清除算法、复制算法、标记整理算法、分代垃圾回收算法、垃圾回收器 、Serial 收集器、ParNew 收集器、Parallel Scavenge 收集器、CMS 收集器、Serial Old 收集器、Parallel Old 收集器、G1垃圾回收器、总结、相关面试题

Yinin.的博客 1352

Java 内存结构分配回收规则

目录

Jesse的专栏 455

浅谈JVM垃圾回收机制

垃圾回收机制: Java中引入垃圾自动回收机制,将不再被引用的对象进行回收,所以垃圾回收机制主要作用于堆内存。由于GC操作需要消耗一定的时间,java在对对象的生命周期进行分析后,按照新生代,老年代的划分对垃圾进行回收。对新生代的回收称为minor,对老年代的回收称为FULL,GC程序中调用System.gc()强制执行的GC为full,GC不同的对象引用类型,GC采用不同的方法进行回收。 jav...

weixin_43243916的博客 329
上一篇: Java 理论与实践: 线程池与工作队列
下一篇: java参数值和返回值是值还是引用
hanxinis
博客等级 码龄21年 8粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值