Sử dụng tiếng Anh này với tên lớp


115

Tôi đang làm lập trình Android và đang tìm hiểu về Ý định, 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ẻ vui nhộn. Cuộc gọi là:

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

Cả hai tham số đều mới đối với tôi. Làm thế nào có một ".this" tĩnh của Tên lớp? Đây là một thứ Java hay một thứ Android? Tôi giả định rằng nó giống như chỉ nói "cái này", vì tôi đang ở trong bối cảnh CurrentActivity, nhưng tôi không hiểu làm thế nào "cái này" có thể được gọi ra khỏi tên Class. Cũng thế. ". Class" trông giống như được sử dụng để phản chiếu, điều mà tôi quen thuộc trong 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.

Câu trả lời:


138

Thông thường, bạn chỉ có thể sử dụng this. Nhưng, đôi khi thislàm cho tham chiếu đến một lớp bên trong ... vì vậy, 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);
    }
});

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

7
Đúng. thisluôn luôn là lớp trong cùng.
Falmarri

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

1
Tôi đã tự hỏi tại sao MyClass.this và không chỉ điều này khi đăng ký một người nghe! Cảm ơn
luigi7up

3
Buồn cười! Ai biết rằng Java thisrất giống với JavaScript this? Tôi đoán đó là những gì bạn nhận được khi không có chức năng hạng nhất hoặc lambdas :-)
Pat

61

Cùng một lúc:

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

Cấu trúc thứ hai được gọi là a class literallà cách để tham chiếu đối tượng Class đại diện cho kiểu đó. Nó có thể được sử dụng trong bất kỳ bối cảnh.


Điều đáng chú ý, 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".
diego nunes 21/07/2015

1
@DiegoNunes, điều đó đúng với sự qualified thiskhông phải của class literal. Tôi đã mở rộng câu trả lời của mình để làm cho điều đó rõ ràng hơn.
Yishai

14

Cú pháp "Classname.this" dành cho các lớp bên trong. Nếu bạn muốn tham khảo trường hợp kèm theo của loại "Outerclass" thì bạn thực hiện nó dưới dạng "Outerclass.this".

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


11

NextActivity.classtrong java có nghĩa là typeof(NextActivity)trong C #


8

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


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

5
<ClassName>.this

được sử dụng trong các lớp lồng nhau để chỉ trường hợp hiện tại của lớp kèm theo, vì từ khóa 'this' dùng để chỉ thể hiện của lớp lồng.

lớp công cộng Siht { lớp Siht {  
    lớp NestedSiht {lớp NestedSiht {  
        void demo This () {void demo This () { 
            System.err.println (" Siht.this 'là một ví dụ của:" +Hệ thống . err . println ( " +this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            Siht.this.getClass (). GetName ());Siht . này . 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

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

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

Trong một phương thức cá thể hoặc một hàm tạo, đâ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 chiếu đến 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 cá thể hoặc hàm tạo bằng cách sử dụng phương thức này.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.