जवाबों:
LocalScreen.this
this
एनक्लोजिंग क्लास को संदर्भित करता है ।
इस उदाहरण को इसे समझाना चाहिए:
public class LocalScreen {
public void method() {
new Runnable() {
public void run() {
// Prints "An anonymous Runnable"
System.out.println(this.toString());
// Prints "A LocalScreen object"
System.out.println(LocalScreen.this.toString());
// Won't compile! 'this' is a Runnable!
onMake(this);
// Compiles! Refers to enclosing object
onMake(LocalScreen.this);
}
public String toString() {
return "An anonymous Runnable!";
}
}.run();
}
public String toString() { return "A LocalScreen object"; }
public void onMake(LocalScreen ls) { /* ... */ }
public static void main(String[] args) {
new LocalScreen().method();
}
}
आउटपुट:
An anonymous Runnable!
A LocalScreen object
a.this
आपके उदाहरण में परिभाषित नहीं है। मुझे नहीं पता कि यह बाधा बायटेकोड के लिए सही है या नहीं। शायद नहीं।
इसका अर्थ है this
बाहरी LocalScreen
वर्ग का उदाहरण ।
this
क्वालीफ़ायर के बिना लिखना उस आंतरिक वर्ग का उदाहरण लौटाएगा जो कॉल अंदर है।
संकलक कोड लेता है और इसके साथ कुछ ऐसा करता है:
public class LocalScreen
{
public void method()
{
new LocalScreen$1(this).run;
}
public String toString()
{
return "A LocalScreen object";
}
public void onMake(LocalScreen ls) { /* ... */ }
public static void main(String[] args)
{
new LocalScreen().method();
}
}
class LocalScreen$1
extends Runnable
{
final LocalScreen $this;
LocalScreen$1(LocalScreen $this)
{
this.$this = $this;
}
public void run()
{
// Prints "An anonymous Runnable"
System.out.println(this.toString());
// Prints "A LocalScreen object"
System.out.println($this.toString());
// Won't compile! 'this' is a Runnable!
//onMake(this);
// Compiles! Refers to enclosing object
$this.onMake($this);
}
public String toString()
{
return "An anonymous Runnable!";
}
}
जैसा कि आप देख सकते हैं, जब कंपाइलर एक आंतरिक वर्ग लेता है तो इसे एक बाहरी वर्ग में परिवर्तित कर देता है (यह एक डिज़ाइन निर्णय था जो एक लंबे समय पहले किया गया था ताकि वीएम को आंतरिक कक्षाओं को समझने के लिए बदलने की आवश्यकता न हो)।
जब एक गैर-स्थिर आंतरिक वर्ग बनाया जाता है, तो उसे माता-पिता के संदर्भ की आवश्यकता होती है ताकि वह बाहरी वर्ग के तरीकों / पहुंच चर को कॉल कर सके।
यह जो भीतर का वर्ग था, वह उचित प्रकार नहीं है, आपको ऑनमेक विधि को कॉल करने के लिए सही प्रकार प्राप्त करने के लिए बाहरी वर्ग तक पहुंच प्राप्त करने की आवश्यकता है।
new LocalScreen$1().run;
होना चाहिए new LocalScreen$1(this).run;
?
Class.this
बाहरी वर्ग के उदाहरण तक पहुँच की अनुमति देता है। निम्न उदाहरण देखें।
public class A
{
final String name;
final B b;
A(String name) {
this.name = name;
this.b = new B(name + "-b");
}
class B
{
final String name;
final C c;
B(String name) {
this.name = name;
this.c = new C(name + "-c");
}
class C
{
final String name;
final D d;
C(String name) {
this.name = name;
this.d = new D(name + "-d");
}
class D
{
final String name;
D(String name) {
this.name = name;
}
void printMe()
{
System.out.println("D: " + D.this.name); // `this` of class D
System.out.println("C: " + C.this.name); // `this` of class C
System.out.println("B: " + B.this.name); // `this` of class B
System.out.println("A: " + A.this.name); // `this` of class A
}
}
}
}
static public void main(String ... args)
{
final A a = new A("a");
a.b.c.d.printMe();
}
}
तब आपको मिलेगा।
D: a-b-c-d
C: a-b-c
B: a-b
A: a
मुझे पता है कि आपका भ्रम क्या है। मैं अभी समस्या का सामना कर रहा हूं, इसमें उन्हें अलग करने के लिए विशेष दृश्य होना चाहिए।
class THIS {
def andthen = {
new THIS {
println(THIS.this.## + ":inner-THIS.this.##")
println(this.## + ":inner-this.##")
new THIS {
println(THIS.this.## + ":inner-inner-THIS.this.##")
println(this.## + ":inner-this.##")
}
}
}
def getInfo = {
println(THIS.this.## + ":THIS.this.##")
println(this.## + ":this.##")
}
}
आप हैशकोड द्वारा (और। ##) के बीच THIS.this
और this
नए THIS ऑपरेशन में अंतर देख सकते हैं
स्केला कंसोल में परीक्षण:
scala> val x = new THIS
x: THIS = THIS@5ab9b447
scala> val y = x.andthen
1522119751:inner-THIS.this.##
404586280:inner-this.##
1522119751:inner-inner-THIS.this.##
2027227708:inner-this.##
y: THIS = THIS$$anon$1@181d7f28
scala> x.getInfo
1522119751:THIS.this.##
1522119751:this.##
THIS.this
हमेशा बाहरी THIS वर्ग की ओर इशारा करते हैं, जो कि वैल x द्वारा संदर्भित होता है, लेकिन this
अनाम नए ऑपरेशन से परे है।
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
मैं मान रहा हूं कि यह वही मामला है;a.this
भीतरrun()
का उल्लेख करना चाहिए संलग्नितa
'एसthis
। क्या मैं सही हू? (OSX किंडल प्रीव्यूअर ऐप की.jar
फ़ाइलों में यह मिनिमाइज्ड कोड कैसे है , मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि मैं क्या देख रहा हूं।)