2010-11-02 20 views
102

Tôi đang lập trình Android và đang tìm hiểu về Intents, khi tôi thấy một nhà xây dựng, với tâm trí được đào tạo C# của tôi, có vẻ sôi nổi. Cuộc gọi là:Sử dụng "this" với tên lớp

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class); 

Cả hai thông số đều mới đối với tôi. Làm thế nào là có một ".this" tĩnh của một tên lớp? Đây có phải là một điều Java hay một điều Android? Tôi giả định rằng nó cũng giống như chỉ nói "này", vì tôi đang ở trong bối cảnh của CurrentActivity, nhưng tôi không nhận được cách "này" có thể được gọi tắt của tên lớp chính nó. Cũng thế. ".class" trông giống như nó được sử dụng để phản chiếu, mà tôi đã quen thuộc với C#, nhưng bất kỳ cái nhìn sâu sắc nào về điều này cũng sẽ được hoan nghênh.

Cảm ơn.

Trả lời

122

Thông thường, bạn có thể sử dụng chỉ this. Nhưng, đôi khi this làm tham chiếu đến một lớp bên trong ... do đó, ví dụ:

Button button = (Button)findViewById(R.id.ticket_details_sell_ticket); 
button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // it will be wrong to use only "this", because it would 
     // reference the just created OnClickListener object 
     Intent login = new Intent(ClassName.this, Login.class); 
     startActivityForResult(login, LOGIN_REQUEST); 
    } 
}); 
+16

Tôi hiểu. Vì vậy, tôi đã chỉ nói "điều này" trong Intent mới trong ví dụ của bạn, nó sẽ đề cập đến "điều này" của lớp OnClickListener, nhưng vì tôi cần tham khảo lớp ngoài tôi cần một cách để biểu thị điều đó. – skaz

+6

Phải. 'this' luôn là lớp trong cùng. – Falmarri

+7

Và để trả lời phần khác của câu hỏi: có, đó là một điều java – Decko

8

ClassName.this được sử dụng để tham chiếu phiên bản hiện tại của lớp ngoài từ lớp bên trong.

+0

Và chắc chắn là cách khác? – codymanix

12

Cú pháp "Classname.this" là dành cho các lớp bên trong. Nếu bạn muốn tham chiếu đến thể hiện kèm theo của kiểu "Outerclass" thì bạn thực hiện nó như là "Outerclass.this".

NextActivity.class chỉ đơn giản là đối tượng Lớp mô tả lớp "NextActivity".

9

NextActivity.class trong java nghĩa typeof(NextActivity) trong C#

55

Một tại một thời điểm:

Các cấu trúc đầu tiên được gọi là một qualified this. Mục đích của cú pháp là trong trường hợp bạn đang ở trong một lớp bên trong (thường là một lớp bên trong vô danh) và bạn muốn tham chiếu đến this của lớp bên ngoài thay vì this của lớp bên trong (ẩn danh). "Đủ điều kiện này" chỉ có thể được sử dụng trong ngữ cảnh mà this sẽ không rõ ràng. Trích dẫn JLS "Nó là một lỗi biên dịch thời gian nếu biểu thức xảy ra trong một lớp hoặc giao diện mà không phải là một lớp bên trong của lớp T hoặc T chính nó".

Cấu trúc thứ hai được gọi là class literal là cách để tham chiếu đối tượng Lớp đại diện cho loại đó. Nó có thể được sử dụng trong mọi ngữ cảnh.

+0

Điều đáng chú ý là, nếu câu trả lời này vẫn chưa rõ ràng, nó chỉ hoạt động khi có một lớp kèm theo và bạn đang tham khảo một lớp bên ngoài. Bạn chỉ đơn giản là không thể sử dụng "NotInTheStackOfEnclosings.this". –

+1

@DiegoNunes, đó là sự thật của 'đủ điều kiện này' không phải của 'lớp chữ'. Tôi đã mở rộng câu trả lời của mình để làm rõ hơn. – Yishai

3
<ClassName>.this 

được sử dụng trong các lớp lồng nhau để tham chiếu đến cá thể hiện tại của lớp kèm theo, vì từ khóa `this 'đề cập đến cá thể lớp lồng.

 
public class Siht { 
    class NestedSiht { 
     void demoThis() { 
      System.err.println("this' is an instance of: " + 
          this.getClass().getName()); 
      System.err.println("Siht.this' is an instance of: " + 
          Siht.this.getClass().getName()); 
     } 
    }

void demoThis() { 
    new java.lang.Object() { 
     void demoThis() { 
      System.err.println("`this' is an instance of: " + 
          this.getClass().getName()); 
      System.err.println("`Siht.this' is an instance of: " + 
          Siht.this.getClass().getName()); 
     } 
    }.demoThis(); 
    new NestedSiht().demoThis(); 
} 

public static void main(String [] args) { 
    new Siht().demoThis(); 
} 

}

0

Nó chỉ khó hiểu bởi vì khi bạn sử dụng "MainActivity.this", có vẻ như bạn đang đề cập đến lớp và không phải là đối tượng. Trên thực tế khi bạn sử dụng "này" bạn luôn được đề cập đến đối tượng hiện tại, như java se bang tài liệu:

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

Trong vòng một phương pháp dụ hoặc một constructor, này là một tham chiếu đến objec t 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ó.

Nó chỉ là cú pháp đặc biệt.

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