在方法中使用实例变量时堆和堆栈(Java内存)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在方法中使用实例变量时堆和堆栈(Java内存)相关的知识,希望对你有一定的参考价值。

public class Main {
    private String sampleName= "Sample";
    public void show() {
        System.out.println(sampleName);
    }
}

我知道“Sample”作为对象位于堆部分,但Where“sampleName”作为参考变量?如果它位于堆中,是否在堆栈中我有另一个名称为“sampleName”的引用,该引用引用堆中的“sampleName”?

答案

我知道“Sample”作为对象位于堆部分

正确。

但是“sampleName”在哪里作为参考变量?

Main对象中,根据定义在堆中。

如果它位于堆中,是否在堆栈中我有另一个名称为“sampleName”的引用,该引用引用堆中的“sampleName”

是的,作为对println()的争论的临时性。

另一答案

你的线程只会持有对封闭的Main对象的引用。它指向堆中分配的Main对象。 sampleName引用是Main对象的一个​​字段,因此也在堆上,指向String "Sample",它在java常量字符串池(堆中的另一部分)中维护。堆栈上不能有sampleName引用,因为它是私有字段;否则,您将能够在Main类之外的代码中访问它,这违反了java语言语义。如果你将sampleName字段定义为public,并且在你的代码中你做了

Main main = new Main();
String copyOfSampleName = main.sampleName;

那么你将在你的堆栈上有一个String引用,它与原始的sampleName引用一起指向常量池中的String对象。

以上是关于在方法中使用实例变量时堆和堆栈(Java内存)的主要内容,如果未能解决你的问题,请参考以下文章

堆和堆栈内存是如何管理、实现和分配的?

C# 中结构的实例和成员的堆和堆栈如何工作?

java 堆栈内存分析详解

浅谈Java中的栈和堆

JVM 运行时堆内存如何分代?

堆栈Java堆和栈的区别