在方法中使用实例变量时堆和堆栈(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内存)的主要内容,如果未能解决你的问题,请参考以下文章