2010-03-22 30 views
7

Tôi đang đọc một cuốn sách về java. Nó chỉ giải thích cách bạn tạo ra một lớp được gọi là "deck" có chứa một mảng các thẻ như là các biến cá thể của nó. Dưới đây là đoạn mã:Tại sao không phải là "điều này". lệnh cần thiết trong constructor này? (java)

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     cards = new Card[n]; 
    } 
} 

tại sao lệnh this. không được sử dụng?

ví dụ tại sao không phải là mã này:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     this.cards = new Card[n]; 
    } 
} 
+0

Bạn gặp lỗi trong ví dụ thứ hai. Có 2 '['. –

+0

Lưu ý: Nếu bạn muốn thảo luận xem đó là một ý tưởng hay * để sử dụng hoặc bỏ qua 'this.', thì có rất nhiều nơi khác để tranh luận về điều đó. Ví dụ: xem câu hỏi này: http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this-in-java –

Trả lời

12

this. là tiềm ẩn.

Nói chung, đó là phương pháp hay nhất (ít nhất là I xem xét nó một) chỉ sử dụng this khi thật cần thiết. Khi bạn có biến cục bộ có tên là cards và biến thành viên có tên cards, ví dụ: bạn sẽ cần this.cards để tham chiếu biến thành viên, vì cards là biến cục bộ.

Trong trường hợp này, this là một ý tưởng hay (mặc dù có thể nên đổi tên biến thành viên).

Trong mọi trường hợp khác, nơi ẩn ngụ this có thể hoạt động, hãy sử dụng nó.

+0

. luôn luôn bị bỏ qua? hoặc bạn có nghĩa là tác giả dự định nó ở đó nhưng không viết nó bởi vì nó liên quan đến người đọc? – David

+0

@David: Nó luôn luôn có thể được bỏ qua trừ khi bạn cũng có một biến địa phương có cùng tên (như sau đó 'thẻ' ngày của riêng nó sẽ là biến cục bộ không phải biến thể hiện, và bạn cần' this.cards' để tham chiếu rõ ràng cá thể). – Chris

+0

@David, @Chris Smith: Heh ... Tôi đang chỉnh sửa như bạn đã nhận xét. – Randolpho

1

Từ khóa "này" không cần thiết trong trường hợp đó. thẻ đã được xác định ở phạm vi lớp và người khiếu nại biết rằng thành viên là một phần của lớp "này".

2

This được ngụ ý.

Hãy xây dựng:

class Deck { 
    Card[] cards; 
    public Deck (Card[] cards) { 
      this.cards = cards; 
    } 
} 

Trong trường hợp này bạn vượt qua trong một mảng của thẻ mà chia sẻ cùng tên với mảng của đối tượng của thẻ. This đề cập đến datamember của đối tượng của bạn, không phải tham số của hàm tạo.

0

"điều này" được ngụ ý. Không cần sử dụng "cái này". Tôi thường đặt nó ở đó chỉ để làm cho mã có thể đọc được, nhưng một lần nữa nó không cần thiết.

20

Vì không có sự mơ hồ. Chỉ có một biến số cards. this sẽ là cần thiết nếu có hai - một trong số đó là một biến cá thể (một phần của lớp, như hiện tại), và một - một đối số của hàm tạo.

Và btw, this không phải là "lệnh". Đó là "từ khóa".

3

Khi bạn sử dụng mã định danh cards trong hàm tạo, trình biên dịch sẽ thông báo rằng trường (biến thành viên a.k.a.) cards nằm trong phạm vi và sử dụng nó. this.cards sẽ chỉ cần thiết để giải quyết sự mơ hồ, ví dụ nếu bạn cũng có một biến cục bộ hoặc tham số có tên cards.

3

Sẽ có ý nghĩa nếu bạn cũng có thông số có tên cards. Sau đó, this.cards sẽ chỉ định rằng bạn có nghĩa là chính xác trường cards của lớp, không phải tham số.

Nhưng dù sao, cách tính tốt nhất là sử dụng this. trong các trường hợp như được mô tả trong ví dụ của bạn.

+3

Không, thực tiễn không tốt là thêm nhiễu hình ảnh vào mã nguồn của bạn. – Bombe

+2

@ Bombe: Điều đó tùy thuộc vào người bạn yêu cầu. * Một số * mọi người xem xét sử dụng 'this'' để được thực hành tốt, trong khi những người khác thì không. –

+0

Thật vậy. Vì vậy, nó không phải là một thực hành tốt bởi vì không có thực hành tốt, anyway. :) – Bombe

4

tham khảo this của đối tượng được ngụ ý, nhưng nó có thể hữu ích cho rõ ràng (và đó là cần thiết cho việc định hướng giữa thành viên của một đối tượng và một biến địa phương cùng tên, như trong các nhà xây dựng bên dưới):

public class Foo { 
     final private int x; 

     public Foo(int x) { this.x = x; } 

     public int getX() { return this.x; } 
    } 
8

Bạn không cần phải đủ điều kiện truy cập vào các thành viên với từ khóa this. Bạn chỉ cần sử dụng nó bất cứ khi nào một biến khác đang ẩn phương thức thành viên.

Và đó không phải là một tính năng giới hạn ở các nhà xây dựng, nhưng có sẵn trong tất cả các phương pháp:

public class Test 
{ 
    private int member; 
    private int value; 
    public Test(int value) { 
     member = 5; 
     this.value = value; // required to differentiate from the parameter 
    } 
    public void f(int member) { 
     int value = 5 
     this.member = value; // assign local 'value' (5) to member 'member' 
     this.value = member; // assign parameter 'member' to member 'value' 
    } 
} 
0

tôi cố gắng chọn tên biến theo một cách mà không yêu cầu "này" từ khóa. Nghĩa là, nếu tôi có một thuộc tính có tên là "value", tôi sẽ chuyển cho một tham số có tên là val.

Sử dụng tốt từ khóa "này" dành cho quá tải hàm tạo. Hãy xem xét những điều sau đây (Tôi sẽ sử dụng để chứng minh sự khác biệt.):

public class Person 
{ 
    int age; 
    public Person(int age) 
    { 
     this.age=age; 
    } 
    public Person() 
    { 
     this(25); //default age 
    } 
} 

Khi ở tất cả có thể, tôi sẽ cố gắng để tránh việc các tài sản và tham số tên như vậy để tránh những gì bạn nhìn thấy trên dòng 6. Tuy nhiên , việc sử dụng từ khóa này để gọi một hàm tạo khác là một cách hay để ngăn trùng lặp mã. Đây là một ví dụ tầm thường, nhưng khi bạn bắt đầu tìm kiếm chính mình với các nhà xây dựng mà làm rất nhiều công việc tương tự với sự khác biệt nhỏ giữa chúng, nó đến trong khá tiện dụng.

Các vấn đề liên quan