স্থির পদ্ধতির মধ্যে অ স্থিতিশীল অভ্যন্তর শ্রেণি কীভাবে ইনস্ট্যান্ট করবেন?


122

আমার কাছে কোডের নীচের অংশ রয়েছে:

public class MyClass {

   class Inner {
     int s, e, p;
   }

   public static void main(String args[]) {
     Inner in;
   }
}

এই অংশটি পর্যন্ত কোডটি ঠিক আছে, তবে প্রধান পদ্ধতিতে in = new Inner()যেমন প্রদর্শিত হচ্ছে তেমনভাবে 'ইন' ইনস্ট্যান্ট করতে সক্ষম হচ্ছি না non static field cannot be referenced in static context

আমি কীভাবে এটি করতে পারি? আমি আমার Innerক্লাস স্থির করতে চাই না ।


উত্তর:


201

আপনার অন্যান্য বাইরের শ্রেণীর জন্যও রেফারেন্স থাকতে হবে।

Inner inner = new MyClass().new Inner();

ইনার যদি স্থির থাকে তবে তা হবে

Inner inner = new MyClass.Inner();

53
এই উত্তরটি জীবন সম্পর্কে আমার দৃষ্টিভঙ্গিকে সবেমাত্র পরিবর্তন করেছে। আউটার.নু ইনার ()? এমনকি এটি কখনও সম্ভাবনা হিসাবে বিবেচনা করেনি। O_O
AlbeyAmakiir

1
স্থির অভ্যন্তরের জন্য, আপনি কেবল অভ্যন্তরীণ অভ্যন্তরীণ = নতুন অভ্যন্তর () সহজেই করতে পারবেন না?
লু

1
স্ট্যাটিক নেস্টেড ক্লাসের জন্য একটি আইটেম তৈরি করতে @ কনলু ব্যবহার করুন OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()নেস্টেড ক্লাস
লিটলিটলকিউ

37

একটি "নিয়মিত" অভ্যন্তর শ্রেণীর একটি বহিরাগত শ্রেণীর উদাহরণের জন্য একটি লুকানো (অন্তর্নিহিত) পয়েন্টার থাকে। এটি সংকলকটি আপনাকে টাইপ না করে পয়েন্টারটিকে তাড়া করতে কোড উত্পন্ন করতে সহায়তা করে। উদাহরণস্বরূপ, যদি বাইরের শ্রেণিতে "a" পরিবর্তনশীল থাকে তবে আপনার অভ্যন্তর শ্রেণীর কোডটি কেবল "a = 0" করতে পারে, তবে সংকলক "বহিরাগত পয়েন্টার.এ = 0" এর জন্য গোপন পয়েন্টারটি বজায় রাখার জন্য কোড উত্পন্ন করবে কভার।

এর অর্থ আপনি যখন কোনও অভ্যন্তর শ্রেণীর উদাহরণ তৈরি করেন আপনার সাথে এটির লিঙ্ক করার জন্য কোনও বহিরাগত শ্রেণীর উদাহরণ থাকতে হবে। আপনি যদি বাহ্যিক শ্রেণীর কোনও পদ্ধতির ভিতরে এই সৃষ্টিটি করেন তবে সংকলক অন্তর্ভুক্ত পয়েন্টার হিসাবে "এটি" ব্যবহার করতে জানে। আপনি যদি অন্য কোনও বাহ্যিক উদাহরণের সাথে লিঙ্ক করতে চান তবে আপনি একটি বিশেষ "নতুন" বাক্য গঠন ব্যবহার করুন (নীচের কোড স্নিপেট দেখুন)।

আপনি যদি নিজের অভ্যন্তর শ্রেণিকে "স্থিতিশীল" করেন তবে কোনও গোপন পয়েন্টার নেই এবং আপনার অভ্যন্তর শ্রেণি বাইরের শ্রেণীর সদস্যদের উল্লেখ করতে পারে না। একটি স্থিতিশীল অভ্যন্তর শ্রেণি নিয়মিত শ্রেণীর মতো, তবে এর নামটি পিতামাতার অভ্যন্তরে sc

এখানে কোডের একটি স্নিপেট রয়েছে যা স্থির এবং অ স্থিতিশীল অভ্যন্তর শ্রেণি তৈরির জন্য সিনট্যাক্স প্রদর্শন করে:

public class MyClass {

    int a,b,c; // Some members for MyClass

    static class InnerOne {
        int s,e,p;
        void clearA() {
            //a = 0;  Can't do this ... no outer pointer
        }
    }

    class InnerTwo {
        //MyClass parentPointer;      Hidden pointer to outer instance
        void clearA() {         
            a = 0;
            //outerPointer.a = 0      The compiler generates this code
        }       
    }

    void myClassMember() {
        // The compiler knows that "this" is the outer reference to give
        // to the new "two" instance.
        InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
    }

    public static void main(String args[]) {

        MyClass outer = new MyClass();

        InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
        InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer
        InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope

    }

}

4

আপনি যদি new Inner()কোনও পদ্ধতির মধ্যে থেকে তৈরি করতে চান তবে শ্রেণীর উদাহরণ পদ্ধতি থেকে এটি করুন MyClass:

public void main(){
  Inner inner = new Inner();
}

public static void main(String args[]){
  new MyClass().main();
}

0

আলেক্সি কাইগোরডভের সঠিক উত্তর is তার সমাধান আপনাকে স্থির পদ্ধতির মধ্যে যেমন একই শ্রেণীর একটি প্রধান () থেকে অভ্যন্তরীণ ক্লাসগুলি ইনস্ট্যান্ট করতে দেয়। অন্যথায়, আপনি স্থির পদ্ধতিতে কোনও অভ্যন্তর শ্রেণি ইনস্ট্যান্ট করতে পারবেন না। এটি সংকলন করে না। আলেকসির সমাধানটি সংকলন করে এবং এটি আপনাকে স্থিতিশীল পদ্ধতি থেকে অভ্যন্তরীণ ক্লাসগুলি ইনস্ট্যান্ট করতে দেয়। অন্যান্য উত্তরগুলি আকর্ষণীয় পার্শ্ব-নোট, তবে আমি এগুলিকে প্রকৃত প্রশ্নের প্রতিক্রিয়া পাই না।

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class Example {
    public class InnerClass extends JPanel {
        public void paint(Graphics g) {
            g.setColor(Color.BLACK);
            g.fillRect(getX(),getY(),getWidth(),getHeight());
            g.setColor(Color.RED);
            g.fillRect(5, 20, 195, 20);
            g.setColor(Color.BLACK);
            g.drawString("This was written by an inner class.", 10, 35);
        }
    }

    public void demonstrate() {
        InnerClass sc = new InnerClass();//<---this is key
        JFrame jf = new JFrame();
        jf.add(sc);
        jf.setSize(220, 130);
        jf.setLocation(450, 450);
        jf.show();
    }

    public static void main(String[] params) {
        Example e = new Example();//<---so is this
        e.demonstrate();//<---and this is also key
    }
}

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