JAVA中的引用与对象详解
发布时间 - 2026-01-10 23:04:33 点击率:次Thinking in Java 一书中提到,引用和对象就像瑶控器和电视机。用瑶控器(引用)来操作电视机(对象),想换频道什么的直接操作瑶控器就可以了,瑶控器再来调控电视机。如果你在房间里面走动,同时还想操作电视换频道,你只需要携带瑶控器就可以了。我觉得这个比较非常好,引用是用来操作对象的,对象是由你来创建的。通常用new关键字来创建一个对象。那么这些对象是怎样存储的,内存又是怎样分配的呢?

存储在什么地方?
1.寄存器(register):由于寄存器是在CPU内部的,所以它的速度最快,但是数量有限,所以由编译器根据需求进行分配。
2.栈(stack):位于通用RAM中,通过栈指针的移动来分配和释放内存,指针向下移动分配新的内存;指针向上移动则释放内存。速度仅次于寄存器。创建程序时,Java编译器必须知道存储在栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动栈指针,这就限制了程序的灵活性。所以java中的对象并不存放在栈当中,但对象的引用存放在栈中。
3.堆(heap):也是位于RAM中的内存池,用于存放所有的JAVA对象。编译器不需要知道要从堆里分配多少存储区域,也不需要知道存储的数据在堆里面存活多长时间,因此堆要比栈灵活很多。当你new创建一个对象时,编译器会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用栈进行存储存储需要更多的时间。
4.静态存储(static storage):这里的“静态”是指“在固定的位置”(也在RAM里)。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,即存放类中的静态成员,但JAVA对象本身从来不会存放在静态存储空间里。
5. 常量存储(constant storage):存放字符串常量和基本类型常量(public static final)。常量值通常直接存放在程序代码内部,它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。
简单描述下垃圾回收机制
垃圾回收回收的是无任何引用的对象占据的内存空间(堆)而不是对象本身,要注意以下3点:
1)对象可能不会被回收,即垃圾回收不一定会执行;
2)垃圾回收并不等于析构;
3)垃圾回收只与内存有关。
引用计数器:一种简单但是速度很慢的垃圾回收策略。即每个对象都有一个引用计数器,当有引用连接至对象时计数器加1;当引用离开时计数器减1。垃圾回收器会在含有全部对象的列表中遍历,发现某个对象的引用计数器为0时,就释放其占用的内存。
优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。
缺点:无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0。
自适应、分代的、停止——复制、标记——清扫 垃圾回收方法:
停止——复制:先暂停程序的运行,然后将所有活的对象从当前堆复制到另一个堆,没有被复制的都是垃圾。当对象从一个堆复制到另一个堆,它们的排列是一个挨着一个的,所以新堆保持紧凑排列。
标记——清扫:遍历所有的引用,找出所有活的对象,然后对它们进行标记,这个过程不会回收任何对象,只有全部标记工作完成时才开始清除工作。没有被标记的对象将会被释放,不发生任何复制动作,所以剩下的堆空间不是连续的。
创建了几个对象?
String s="abc"; 创建了几个对象?
毫无疑问,这里面只创建了一个对象——“abc";
String s1="abc"; String s2=s1;创建了几个对象?
仍然只有一个对象——“abc";
String s1="abc"; String s2=”abc";创建了几个对象?
这里仍然只有一个对象——“abc";
String s="abc"+"def";创建了几个对象?
注意,这里创建了三个对象:“abc"、”def"、“abcdef";
String s=new String("abc");创建了几个对象?
大家也都知道是两个对象。实际上是"abc"本身就是文字池中的一个对象,在运行new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的应用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。
String s1=new String("abc");String s2=new String("abc");创建了几个对象?
三个对象。"abc"是文字池中的一个对象,然后又在堆中用new String()创建了两个对象。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# 引用和对象
# 对象引用
# Java返回可变引用对象问题整理
# Java对象的四种引用方式实例分析
# 面试官:详细谈谈Java对象的4种引用方式
# 详解Java对象的强、软、弱和虚引用+ReferenceQueue
# Java中的对象和引用详解
# Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)
# 对Java的面对对象编程中对象和引用以及内部类的理解
# 解析Java的JNI编程中的对象引用与内存泄漏问题
# Java中的对象和对象引用实例浅析
# Java基础教程之对象引用
# 浅析Java 对象引用和对象本身
# 几个
# 放在
# 时计
# 遍历
# 只有一个
# 创建一个
# 就可以
# 堆里
# 池中
# 的是
# 都是
# 是一个
# 堆中
# 他们的
# 也不
# 是在
# 都有
# 就像
# 我觉得
# 又是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
利用JavaScript实现拖拽改变元素大小
高端智能建站公司优选:品牌定制与SEO优化一站式服务
EditPlus中的正则表达式 实战(1)
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
C语言设计一个闪闪的圣诞树
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
网页设计与网站制作内容,怎样注册网站?
网站制作壁纸教程视频,电脑壁纸网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Java遍历集合的三种方式
简单实现Android文件上传
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
网站建设保证美观性,需要考虑的几点问题!
实例解析Array和String方法
如何快速查询域名建站关键信息?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
无锡营销型网站制作公司,无锡网选车牌流程?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何在香港服务器上快速搭建免备案网站?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel distinct去重查询_Laravel Eloquent去重方法
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何快速搭建高效香港服务器网站?
怎样使用JSON进行数据交换_它有什么限制
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
高防服务器租用如何选择配置与防御等级?
Laravel如何配置和使用缓存?(Redis代码示例)
PHP正则匹配日期和时间(时间戳转换)的实例代码
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何快速搭建支持数据库操作的智能建站平台?
想要更高端的建设网站,这些原则一定要坚持!
如何续费美橙建站之星域名及服务?
如何在香港免费服务器上快速搭建网站?
制作公司内部网站有哪些,内网如何建网站?
高端建站如何打造兼具美学与转化的品牌官网?
如何用搬瓦工VPS快速搭建个人网站?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
JS经典正则表达式笔试题汇总
Laravel怎么判断请求类型_Laravel Request isMethod用法
如何快速生成凡客建站的专业级图册?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
音乐网站服务器如何优化API响应速度?
上一篇:laravel api是什么意思
上一篇:laravel api是什么意思

