【问题标题】:Where are method reference copies stored in java?java中方法引用副本存储在哪里?
【发布时间】:2020-10-24 23:26:02
【问题描述】:

当您使用传递的字段调用方法时,会在堆栈中创建该字段值的副本。这意味着如果它是原始类型,通过更改此变量的值,您将不会更改传递的字段的值。但是,如果您更改堆中的值,则引用将是副本,但仍然引用相同的内存,这意味着您可以传递字段的值。

我的问题是这些临时变量存储在哪里?如果它们是引用,它们应该正确存储在堆栈中吗?但是堆栈具有静态内存分配,如果在代码运行时调用方法,它们必须存储在动态分配的内存中对吗?所以是矛盾的。

对不起,如果这个问题听起来很愚蠢,我是一名新手程序员,并且正在尝试正确理解程序如何使用内存。

【问题讨论】:

  • "我是一名新手程序员,正在尝试正确理解程序如何与内存一起工作" 我的建议是:不要花费(有限的)努力去尝试去理解它。反正还没有。 Java 尽其所能有意抽象出内存管理方式的确切细节。理解它对你没有帮助,对于新手来说更是如此。
  • '堆栈有静态内存分配'是这里唯一的矛盾。元素被动态地压入堆栈并从堆栈中弹出。引用与原语相同。不要过于复杂。
  • 请勿在此发表个人言论。我正在努力帮助你。我不需要你的建议。

标签: java memory


【解决方案1】:

...但是堆栈具有静态内存分配,如果在代码运行时调用方法,它们必须存储在动态分配的内存中对吗?

不正确。堆栈上的分配不是静态的。它是动态的。调用方法时添加栈帧,退出方法调用时移除栈帧。

所有局部变量都保存在线程堆栈上相应方法调用的堆栈帧中。无论变量是原始类型还是引用类型,这都是正确的。


我不完全确定您所说的“方法参考副本”是什么意思。

Java 8 及更高版本支持称为“方法引用”的东西,所以我不确定您是在谈论这些还是在谈论具有引用类型的方法的局部变量。

如果您在谈论“方法引用”,那么答案是这些是引用类型,并且像其他引用类型一样表示。有一个引用(指针)指向堆中的一个节点,该节点保存“方法引用”的状态。引用(指针)可以保存在堆栈上的局部变量、静态变量或其他一些堆驻留对象的字段/元素中。


最后:

我是一名新手程序员,正在尝试正确理解程序如何使用内存。

我的建议是不要。您无需了解 Java 程序如何“与内存一起工作”即可成为一名有效且精通的 Java 程序员。 Java 运行时系统处理所有这些东西......所以你不需要理解它。

我的建议是:

  1. 等到您成为经验丰富的 Java 程序员。
  2. 等到您完成有关计算机硬件架构和编译器编写的学位课程。
  3. 等到您需要了解这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2012-01-13
    相关资源
    最近更新 更多