这个引用在构造函数中

时间:2013-03-16 16:10:56

标签: java constructor stack this

我正在观看编程方法论(斯坦福大学)(CS106A)关于Java的课程。在lecture 14教授 Sahami 讲述了Java中用于堆栈和堆上的函数和对象的内存分配。

他告诉对于任何调用对象的方法,都会分配一个堆栈,并且在stacke上为参数列表和这个引用分配空间。通过存储 this refernece ,Java可以引用对象的正确实例变量。

stack--when method is called

但是对于构造函数no ,此引用与对象列表一起存储 建造。 stack -- when constructor is called

我的问题是,如果构造函数没有这个引用,那么我们如何在构造函数中使用它为ex

public class foo {
private int i;
public foo(int i)
{this.i = i;// where this reference came from}
                 }

2 个答案:

答案 0 :(得分:1)

this只是一个Java关键字,允许您引用当前对象。它可以在任何类中使用。

使用this关键字的目的是防止引用局部变量。

在您的示例中需要它,因为i = i绝对不会执行任何操作,因为它们都是对同一局部变量(不是类变量)的引用:

From here

  

在实例方法或构造函数中,这是对当前对象的引用 - 正在调用其方法或构造函数的对象。您可以使用此方法在实例方法或构造函数中引用当前对象的任何成员。

修改

我意识到你可能一直在询问实际的内存地址。

我想象

class Point
{
  int x, y;
  Point(int x, int y) { this.x = x; this.y = y; }
  void move(int a, int b) { x = a; y = b; }
}
Point p = new Point(3,4);
p.move(1,2);

可能会被翻译成:(使this显式)

class Point
{
  int x, y;
  static Point getPoint(int x, int y)
    { Point this = allocateMemory(Point); this.x = x; this.y = y; }
  static void move(Point this, int a, int b) { this.x = a; this.y = b; }
}
Point p = Point.getPoint(3,4);
Point.move(p, 1, 2);

但是这一切都会处于更低的水平,所以它实际上看起来并不像这样,但它可能只是你思考它的一种方式。

答案 1 :(得分:0)

这一切都是引用当前对象的类级别变量 如果未使用this关键字,则变量将存储在方法级别变量中。

public class foo {
    private int i;

    public foo(int i) {
        this.i = i; // stores the argument i into the class level variable i
    }

    public foo2(int i) {
        i = i;    // stores the argument i into the argument i
    }
}