方法如何在运行时查找其对象的实例变量

时间:2014-01-08 09:45:32

标签: java object jvm

创建对象并调用其公共方法之一时,可以使用local属性。它们存放在哪里?我的意思是,在像C这样的语言中,一切都很清楚:要使用的变量必须作为参数传递给函数(或者必须是全局的)。

Java(以及其他OO语言)会发生什么?本地方法如何使用实例的属性?

简而言之:当我们说this.variable时,方法如何找到自己的变量? “this”指针是否作为函数参数隐式传递?

4 个答案:

答案 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

除了,现在它不是那个新的