2013-03-16 32 views
5

Tôi đang xem Phương pháp lập trình (Stanford) (CS106A) khóa học về Java. Trong lecture 14, Giáo sư Sahami nói về phân bổ bộ nhớ trong Java cho các chức năng và đối tượng trên ngăn xếp và đống.tham chiếu này bên trong construstor

Ông nói rằng đối với bất kỳ phương pháp nào được gọi trên một đối tượng, một ngăn xếp được phân bổ và danh sách đối số và tham chiếu này được cấp không gian trên stacke. Thông qua tham chiếu này được lưu trữ, Java có thể tham chiếu đến các biến mẫu chính xác của một đối tượng.

stack--when method is called

nhưng đối với nhà xây dựng không thông tin này được lưu trữ cùng với danh sách đối số là đối tượng đang được xây dựng. stack -- when constructor is called

ques của tôi là nếu nhà xây dựng không có có refernece này thì làm sao chúng ta có thể sử dụng nó bên trong constructor cho ex

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

Trả lời

1

this chỉ đơn giản là một từ khóa Java cho phép bạn để tham khảo các đối tượng hiện hành. Nó có thể được sử dụng trong bất kỳ lớp học nào.

Mục đích của việc sử dụng từ khóa this là để ngăn tham chiếu biến cục bộ.

Nó là cần thiết trong ví dụ của bạn, vì i = i sẽ làm hoàn toàn không có gì, vì cả hai đều tham chiếu đến cùng một biến địa phương (không phải là biến lớp):

From here:

Trong vòng một phương pháp dụ hoặc một hàm tạo, đây là một tham chiếu đến đối tượng hiện tại - đối tượng có phương thức hoặc hàm tạo đang được gọi. Bạn có thể tham khảo bất kỳ thành viên nào của đối tượng hiện tại từ bên trong một phương thức thể hiện hoặc một hàm tạo bằng cách sử dụng nó.

EDIT:

Tôi nhận ra rằng bạn có thể đã được hỏi về địa chỉ bộ nhớ thực tế.

Tôi tưởng tượng

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); 

có thể được dịch sang một cái gì đó như: (làm this rõ ràng)

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); 

nhưng tất cả điều này sẽ là về mặt kĩ thấp hơn nhiều, vì vậy nó sẽ không thực sự nhìn từ xa như thế này, nhưng nó có thể chỉ là một cách để bạn suy nghĩ về nó.

+0

bạn có biết điều chính xác không ??? bằng cách cảm ơn nó đã nhận nó .... –

+0

@ T.J. Không, tôi không biết chính xác điều gì xảy ra, chỉ là ý tưởng cơ bản. – Dukeling

0

tất cả những điều này là tham chiếu biến cấp lớp của đối tượng hiện tại.
Nếu từ khóa this không được sử dụng thì biến sẽ được lưu trữ trong biến cấp phương thức.

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 
    } 
} 
Các vấn đề liên quan