การใช้ "this" กับชื่อคลาส


115

ฉันกำลังเขียนโปรแกรม Android และกำลังเรียนรู้เกี่ยวกับ Intents เมื่อฉันเห็นตัวสร้างที่สำหรับจิตใจที่ฝึกฝน C # ของฉันดูเหมือนจะขี้ขลาด การโทรคือ:

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

พารามิเตอร์ทั้งสองใหม่สำหรับฉัน จะมี ".this" แบบคงที่จากชื่อคลาสอย่างไร นี่คือสิ่งที่ Java หรือ Android? ฉันสมมติว่ามันเหมือนกับแค่พูดว่า "this" เนื่องจากฉันอยู่ในบริบทของCurrentActivityแต่ฉันไม่เข้าใจว่า "this" สามารถเรียกออกจากชื่อคลาสได้อย่างไร ด้วย ".class" ดูเหมือนว่าใช้สำหรับการสะท้อนซึ่งฉันคุ้นเคยในภาษา C # แต่ยินดีรับข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้เช่นกัน

ขอบคุณ

คำตอบ:


138

thisโดยปกติแล้วคุณสามารถใช้เท่านั้น แต่บางครั้งก็thisอ้างถึงคลาสภายใน ... ตัวอย่างเช่น:

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
ฉันเห็น. ดังนั้นฉันเพิ่งพูดว่า "this" ใน Intent ใหม่ในตัวอย่างของคุณมันจะหมายถึง "this" ของคลาส OnClickListener แต่เนื่องจากฉันต้องการอ้างอิงคลาสชั้นนอกฉันจึงต้องการวิธีที่จะแสดงความหมายนั้น
skaz

7
ขวา. thisเป็นชั้นในสุดเสมอ
Falmarri

7
และเพื่อตอบส่วนอื่น ๆ ของคำถาม: ใช่มันเป็นสิ่งที่จาวา
Decko

1
ฉันสงสัยว่าทำไมMyClass นี่ไม่ใช่แค่นี้เมื่อลงทะเบียนผู้ฟัง! ขอบคุณ
luigi7up

3
ตลก! ใครจะรู้ว่า Java thisนั้นเหมือนกับ JavaScript มากthis? ฉันเดาว่านั่นคือสิ่งที่คุณได้รับจากการไม่มีฟังก์ชั่นชั้นหนึ่งหรือแลมบ์ดาส :-)
Pat

61

ครั้งละหนึ่งรายการ:

สร้างครั้งแรกเรียกว่านี้มีคุณสมบัติ จุดประสงค์ของไวยากรณ์คือในกรณีที่คุณอยู่ในคลาสภายใน (โดยทั่วไปจะเป็นคลาสภายในที่ไม่ระบุชื่อ) และคุณต้องการอ้างอิงthisคลาสชั้นนอกแทนที่จะเป็นthisคลาสภายใน (ไม่ระบุชื่อ) "คุณสมบัตินี้" สามารถใช้ได้เฉพาะในบริบทที่thisมีความคลุมเครือ ข้อความอ้างอิง JLS "เป็นข้อผิดพลาดเวลาคอมไพล์หากนิพจน์เกิดขึ้นในคลาสหรืออินเทอร์เฟซซึ่งไม่ใช่คลาสภายในของคลาส T หรือ T เอง"

โครงสร้างที่สองเรียกว่า a class literalเป็นวิธีการอ้างอิงคลาสอ็อบเจ็กต์ที่แสดงถึงประเภทนั้น สามารถใช้ในบริบทใดก็ได้


เป็นที่น่าสังเกตว่าหากคำตอบนี้ยังไม่ชัดเจนเพียงพอก็จะใช้ได้เฉพาะเมื่อมีคลาสปิดล้อมและคุณกำลังอ้างถึงคลาสภายนอก คุณไม่สามารถใช้ "NotInTheStackOfEnclosings.this" ได้
diego nunes

1
@DiegoNunes นั่นคือความจริงของการqualified thisไม่class literal. ฉันได้ขยายคำตอบเพื่อให้ชัดเจนขึ้น
Yishai

14

ไวยากรณ์ "Classname.this" สำหรับคลาสภายใน หากคุณต้องการอ้างถึงอินสแตนซ์ที่แนบมาของประเภท "Outerclass" คุณจะเรียกมันว่า "Outerclass.this"

NextActivity.class เป็นเพียงคลาสออบเจ็กต์ที่อธิบายคลาส "NextActivity"



8

ClassName.this ใช้เพื่ออ้างอิงอินสแตนซ์ปัจจุบันของคลาสชั้นนอกจากคลาสภายใน


และอีกทางหนึ่งอย่างแน่นอน?
codymanix

5
<ClassName>.this

ถูกใช้ในคลาสที่ซ้อนกันเพื่ออ้างถึงอินสแตนซ์ปัจจุบันของคลาสที่ปิดล้อมเนื่องจากคีย์เวิร์ด `` this 'หมายถึงอินสแตนซ์คลาสรัง

คลาสสาธารณะSiht { คลาสNestedSiht { void demoThis () { System . ทำผิดพลาด println ( " Siht.this" เป็นตัวอย่างของ: " + Siht . this . getClass (). getName ()); } }   
      
         
            this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            
        
    

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

มันสับสนเพียงเพราะเมื่อคุณใช้ " MainActivity.this " ดูเหมือนว่าคุณกำลังอ้างถึงคลาสไม่ใช่วัตถุ ในความเป็นจริงเมื่อคุณใช้ "this" คุณมักจะอ้างถึงวัตถุปัจจุบันตามที่เอกสาร java se ระบุ:

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

ภายในเมธอดอินสแตนซ์หรือคอนสตรัคเตอร์นี่คือการอ้างอิงถึง objec t ปัจจุบันซึ่งเป็นอ็อบเจ็กต์ที่เมธอดหรือตัวสร้างถูกเรียกใช้ คุณสามารถอ้างถึงสมาชิกใด ๆ ของอ็อบเจ็กต์ปัจจุบันจากภายในวิธีการอินสแตนซ์หรือตัวสร้างโดยใช้สิ่งนี้

มันเป็นเพียงวากยสัมพันธ์ที่แปลกประหลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.