java中的堆和栈
来源:互联网 发布:网络设备搜索软件 编辑:程序博客网 时间:2024/06/05 19:07
对于引用变量的深层含义,未必在初学的时候就能深刻理解,
所以理解好下面这两句话的真正含义非常重要
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
1.先搞清楚什么是堆,什么是栈。
Java开辟了两类存储区域,对比二者的特点
堆栈的存储特点决定了其中存储的数据类型。
注意,栈内存储的除了基本类型的变量(String, int 这种类型的变量)还会存储对象的引用变量。java中,引用变量实际上是一个指针,它指向的是堆内存中对象实例。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
2.给引用变量赋值
回过头再来看代码
实际上里面分解成了四个步骤。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
这样我们就明确了:
- Java中,这里的“=”并不是赋值的意思,而是把对象的地址传递给变量;
- 对象创建出来,其实连名字都没有,因此必须通过引用变量来对其进行操作。
为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球
紧接着就会问,引用变量是怎么传递的呢?
这就涉及到Java唯一的参数传递方式——按值传递
看下面一段代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
看这里,给人的感觉是传递过来的明明是对象的引用,为什么就是值得传递呢?
因为传递之前,被传的就是个引用啊,我们所谓的“传地址”,在传之前,那可是一个实例,传过来的是实例的地址。这里传递的值,从始至终就是个地址,sMain就是个地址,传给s还是个地址。你们感受下:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
以上输出的结果会是“init_add”
而这里,s引用了一个新的对象,根本没有进行参数的传递,它和之前的sMain没有关系了。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
以上输出的结果会是“Java”
.
.
引用《Java编程思想》中的一段话:
倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方:
阅读全文
0 0
- java中的栈和堆
- Java中的堆和栈
- Java中的堆和栈
- java中的栈和堆
- java中的堆和栈
- Java 中的堆和栈
- Java 中的堆和栈
- Java中的堆和栈
- Java中的堆和栈
- Java 中的堆和栈
- Java 中的堆和栈
- java中的栈和堆
- java 中的 堆 和 栈
- java中的堆和栈
- java 中的堆和栈
- Java 中的堆和栈
- Java 中的堆和栈
- Java 中的堆和栈
- 简单的webpack- 引入bootstrap
- 【LeetCode】convert-sorted-link-to-binary-search-tree & convert-sorted-array-to-binary-search-tree
- ZigZag Conversion
- C++ 模板学习总结(三)模板参数的三种形式
- Merge Into 语句代替Insert/Update在Oracle中的应用实战
- java中的堆和栈
- Mysql Cluster水平扩展-添加数据节点
- 什么是游标
- 问题记录
- redis结合springMVC配置和使用二
- 连接MySQL时区bug: The server time zone value '�й���ʱ��' is unrecognized or represents more
- 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf
- 第一个springboot
- 最大熵模型