JAVA对象的引用 --《JAVA编程思想》05

每种编程语言都会直接(C++通过指针)或者间接(JAVA通过引用)操作内存。

当我们使用 new 来创建对象时,new Square()会在内存中创建一个对象, squeare 通过 “=” 号获得对象内存地址的引用。

 Square square = new Square();

square变量 和 Square对象之间好比“遥控器”和“电视机”的关系,square 作为“遥控器”可以脱离“电视机”单独存在,不指向任何 Square对象(但这通常是不安全的,最好在声明引用时初始化对象,避免运行时出现 java.lang.NullPointerException 空指针错误)。

Square square = null;

也可以在 square 引用某个 Square 对象后,重新引用另一个 Square 对象。

 Square square = new Square();
        square = new Square();

程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎么进行分配的呢?对这方面有所了解,会对你有很多帮助,有五个不同的地方可以存储数据:

1.寄存器
寄存器是最快的存储区,它位于处理器内部,因寄存器的数量非常有限,故并不能直接控制,寄存器会根据需求进行分配。

2.
栈位于通用RAM(随机访问存储器)中,当栈指针向下移动,分配新的内存;若向上移动,则释放内存。这是一种快速有效分配存储的方法,仅次于寄存器。使用栈必须确定知道栈内所有项的确切生命周期,以便上下移动指针来分配内存,但这一约束限制了程序的灵活性,所以JAVA只是将对象引用存储在栈,JAVA对象并不在其中。

3.
堆也位于RAM区,是一种通用的内存池,用于存放JAVA对象。

堆和栈的区别在于:

(1)申请方式的不同。栈由系统自动分配,而堆是人为申请开辟;

(2)申请大小的不同。栈获得的空间较小,而堆获得的空间较大;

(3)申请效率的不同。栈由系统自动分配,速度较快,而堆一般速度比较慢。

(4)存储内容的不同。栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆中的具体内容通常是人为安排,一般在头部用一个字节存放堆的大小。

(5)底层不同。栈是连续的空间,而堆是不连续的空间。

堆的空间比栈大,编译器不需要关心存储的数据要在堆里存活多长时间,故程序的灵活性得到了提升,但这种灵活性也付出了相应的代价:用堆进行存储分配和清理可能会比栈进行存储分配需要更多的时间。

4.常量存储
常量值通常存储在程序代码内部,这样做是安全的,因为它们永远不会被改变,也可以选择将它们存储在ROM(只读存储器)中。

5.非RAM存储
如果数据想完全脱离程序的控制,在程序没运行时也可以存在。两个最典型的例子是流对象和持久化对象。

流对象:对象转出成字节流,通常被发送之给另一台机器。

持久化对象:对象被存放于磁盘上,因此即使程序终止,它们仍然可以保持自己的状态,在需要的时候又可以转换成RAM的对象。

参考资料:
1.《堆和栈的区别》https://m.tianqijun.com/shenghuo/audio/5140.html

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值