উত্তর:
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
আমি জানি আপনার বিভ্রান্তি কী। আমি এখনই সমস্যার মুখোমুখি হয়েছি, তাদের আলাদা করার জন্য এটির একটি বিশেষ দৃশ্য হওয়া উচিত have
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
মধ্যে পার্থক্য দেখতে পাবেন
স্কেলা কনসোল পরীক্ষা:
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
এটি বেনামে নতুন অপারেশনের বাইরে।
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
আমি মনে করি এটি একই জিনিস;a.this
মধ্যেrun()
পড়ুন আবশ্যক এনক্লোজিংa
'sthis
। আমি কি সঠিক? (ওএসএক্স কিন্ডল প্রিভিউভার অ্যাপ্লিকেশনগুলির.jar
ফাইলগুলিতে এইভাবে সংক্ষিপ্ত কোডটি রয়েছে , আমি কী দেখছি তা কেবল বোঝার চেষ্টা করছি))