创建对象并调用其公共方法之一时,可以使用local属性。它们存放在哪里?我的意思是,在像C这样的语言中,一切都很清楚:要使用的变量必须作为参数传递给函数(或者必须是全局的)。
Java(以及其他OO语言)会发生什么?本地方法如何使用实例的属性?
简而言之:当我们说this.variable
时,方法如何找到自己的变量? “this”指针是否作为函数参数隐式传递?
答案 0 :(得分:5)
你是对的:每个实例方法都是一个函数,它声明的参数多于显式声明的参数。第一个参数始终是隐式this
引用(指针)。这只是Java语法的伪装:
firstArg.method(secondArg, thirdArg)
只是另一种写作方式
method(firstArg, secondArg, thirdArg)
并注意第一个参数的特殊性:它是唯一一个在其类型上发生动态调度的方法。
答案 1 :(得分:3)
Primitives → Stack
References to Objects → Stack
Objects → Heap
Strings → heap
String Literals → String Pool (part of heap)
答案 2 :(得分:2)
这取决于局部变量类型。如果变量是一个对象,它将被存储在Heap中,但如果它是一个原语,它将被存储在堆栈中。
public class Storage{
//as fields or instance variables on the object they are also stored on heap
public int y;
public MyObject obj2 = new MyObject();
public static void main(String[] args){
Storage storage = new Storage(); //This is an object, it is stored on the heap
}
public void do(){
int x = 1; //stored on stack;
MyObject obj = new MyObject(); //stored on heap
}
}
class MyObject{
}
答案 3 :(得分:0)
我认为人们不应该忘记escape analysis。正如在文档中所说,
转义分析是Java Hotspot Server的一种技术 编译器可以分析新对象的使用范围并做出决定 是否在Java堆上分配它。
(src)
除了,现在它不是那个新的