জাভা: Class.this


112

আমার একটি জাভা প্রোগ্রাম রয়েছে যা দেখতে এটির মত দেখাচ্ছে।

public class LocalScreen {

   public void onMake() {
       aFuncCall(LocalScreen.this, oneString, twoString);
   }
}

এর LocalScreen.thisঅর্থ কী aFuncCall?

উত্তর:


169

LocalScreen.thisthisসংলগ্ন বর্গ বোঝায় ।

এই উদাহরণে এটি ব্যাখ্যা করা উচিত:

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

এই পোস্টটি এখানে একটি নিবন্ধ হিসাবে আবার লেখা হয়েছে


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

জাভাতে কোনও অভ্যন্তরীণ বর্গের কোনও এটির ঘেরযুক্ত ক্লাসের (জেএলএস 8.1) হিসাবে একই নাম নাও থাকতে পারে, সুতরাং a.thisআপনার উদাহরণে সংজ্ঞায়িত করা হয়নি। আমি জানি না বাইটকোডের জন্য এই সীমাবদ্ধতাটি সত্য কিনা। হয়তো না.
আইওউব

56

এর অর্থ thisবাইরের LocalScreenশ্রেণীর উদাহরণ ।

thisকোনও যোগ্যতা ছাড়াই লেখা কলটি অভ্যন্তরীণ শ্রেণীর উদাহরণটি ফিরে আসবে যা কলটির মধ্যে রয়েছে।


4
তবুও বেশ বুঝতে পারছি না। "এই" এর তুলনায় আমি যখন "লোকালস্ক্রিন.টিস" হিসাবে কোড করি তখন কী পার্থক্য রয়েছে? আমি উভয়ই পরীক্ষা করেছিলাম এবং সংকলকটি কেবল "লোকালস্ক্রিন.থটিজ" স্বীকৃত। AFuncCall এর প্রথম প্যারামিটারটি "স্যামথিগ" এর পিতামাতার ক্লাস হিসাবে অভিভাবক শ্রেণীর প্রত্যাশা করে।
জনি জ্যাজ

1
আমি এই সম্পর্কে কৌতূহলী। এর অর্থ কী আপনি কিছু বিশদ সরবরাহ করতে পারেন? আমি উপরের কোডে সংজ্ঞায়িত কোনও অভ্যন্তরীণ ক্লাস দেখতে পাচ্ছি না; প্রতিটি জাভা ফাংশনের কি কোনও সম্পর্কিত বেনাম শ্রেণীর ক্লাস থেকে পৃথক থাকে এটির সদস্য?
poundifdef

4
@ রাশার: অভ্যন্তরীণ ক্লাস রয়েছে ব্যবহারে; ওপি কোড স্নিপেটে তাদের অন্তর্ভুক্ত করে না। এই বাক্য গঠনটি কেবল একটি অ স্থিতিশীল অভ্যন্তর শ্রেণিতে সমর্থিত।
স্ল্যাक्स

দুর্দান্ত যে আপনি অফিসিয়াল জাভা ডকুমেন্টেশনের লিঙ্ক সরবরাহ করেছেন।
ক্রিজিসটফ টমাসজেউস্কি 12

14

সংকলক কোডটি নেয় এবং এর সাথে এটির মতো কিছু করে:

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;?
ডিস্কুট্যান্ট

এটি প্রশ্নের একটি আন্ডাররেটেড উত্তর। আকর্ষণীয় জিনিস।
পিঙ্কারটন

12

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 এটি বাইরের শ্রেণীর এটিকে অ্যাক্সেসের অনুমতি দেয়" নয় things একটি শ্রেণীর কোনও "এটি" নেই, কেবলমাত্র তাদের উল্লেখের জন্য উদাহরণ রয়েছে ...
ojবাবোজ

-2

আমি জানি আপনার বিভ্রান্তি কী। আমি এখনই সমস্যার মুখোমুখি হয়েছি, তাদের আলাদা করার জন্য এটির একটি বিশেষ দৃশ্য হওয়া উচিত 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এটি বেনামে নতুন অপারেশনের বাইরে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.