java - java中方法引用副本存储在哪里?
问题描述
当您使用传递的字段调用方法时,会在堆栈中创建该字段值的副本。这意味着如果它是原始类型,通过更改此变量的值,您将不会更改传递的字段的值。但是,如果您更改堆中的值,则引用将是副本,但仍引用相同的内存,这意味着您可以传递字段的值。
我的问题是这些临时变量存储在哪里?如果它们是引用,它们应该正确存储在堆栈中吗?但是堆栈具有静态内存分配,如果在代码运行时调用方法,它们必须存储在动态分配的内存中对吗?所以这是一个矛盾。
抱歉,如果这个问题听起来很愚蠢,我是一名新手程序员,并且正在尝试正确理解程序如何与内存一起工作。
解决方案
...但是堆栈具有静态内存分配,如果在代码运行时调用方法,它们必须存储在动态分配的内存中,对吗?
不正确。堆栈上的分配不是静态的。它是动态的。调用方法时添加堆栈帧,退出方法调用时删除堆栈帧。
所有局部变量都保存在线程堆栈上相应方法调用的堆栈帧中。无论变量具有原始类型还是引用类型,这都是正确的。
我不完全确定您所说的“方法参考副本”是什么意思。
Java 8 及更高版本支持称为“方法引用”的东西,所以我不确定您是在谈论这些还是在谈论具有引用类型的方法的局部变量。
如果您在谈论“方法引用”,那么答案是这些是引用类型,并且像其他引用类型一样表示。有一个引用(指针)指向堆中的一个节点,该节点保存“方法引用”的状态。引用(指针)可以保存在堆栈上的局部变量、静态变量或其他一些堆驻留对象的字段/元素中。
最后:
我是一名新手程序员,正在尝试正确理解程序如何与内存一起工作。
我的建议是不要。您无需了解 Java 程序如何“与内存一起工作”即可成为一名有效且精通的 Java 程序员。Java 运行时系统处理所有这些东西......所以你不需要理解它。
我的建议是:
- 等到您成为一名经验丰富的 Java 程序员。
- 等到你完成了计算机硬件架构和编译器写作的学位课程。
- 等到你需要明白这一点。
推荐阅读
- c# - 向 COM 接口添加方法后出现 COM 异常 [过程编号超出范围]
- python - Anaconda Python 对隔离环境的支持
- ruby-on-rails - 创建对象时传递参数没有控制器问题的模型
- spring-boot - 我正在使用 Spring Jpa Repository 来执行所有数据库操作。我不知道如何在不使用任何查询的情况下从表中选择特定值
- macos - 在沙盒(电子)应用程序中执行 qlmanage 不起作用
- netty - correct usage of AUTO_READ in netty SimpleChannelInboundHandler
- android - Kotlin aar Android 库崩溃
- keras - 如何在 keras 中强制执行特征正交性
- java - 在 javafx 中,即使删除了第二个默认按钮,第一个默认按钮也不起作用
- jquery - 如何设置表格的滚动条正确位置?