জাভা - Foo টাইপের কোনও সংযুক্তকরণ অ্যাক্সেসযোগ্য নয়


314

আমার কাছে নিম্নলিখিত কোড রয়েছে:

class Hello {
    class Thing {
        public int size;

        Thing() {
            size = 0;
        }
    }

    public static void main(String[] args) {
        Thing thing1 = new Thing();
        System.out.println("Hello, World!");
    }
}

আমি জানি Thingকিছুই করে না, তবে আমার হ্যালো, ওয়ার্ল্ড প্রোগ্রামটি ছাড়াই ঠিকঠাক সংকলন করে। এটি কেবলমাত্র আমার সংজ্ঞায়িত ক্লাস যা আমার উপর ব্যর্থ হচ্ছে।

এবং এটি সংকলন করতে অস্বীকার করে। আমি No enclosing instance of type Hello is accessible."লাইনে পৌঁছে যা একটি নতুন জিনিস তৈরি করে। আমি অনুমান করছি:

  1. আমার সিস্টেমে স্তরের সমস্যা রয়েছে (হয় ডাঃ জাভা বা আমার জাভা ইনস্টল) বা
  2. জাভাতে একটি ওয়ার্কিং প্রোগ্রাম কীভাবে তৈরি করা যায় সে সম্পর্কে আমার কিছু প্রাথমিক ভুল ধারণা রয়েছে।

কোন ধারনা?


উত্তর:


483

static class Thing আপনার প্রোগ্রাম কাজ করবে।

যেমনটি, আপনি Thingএকটি অভ্যন্তর শ্রেণি হিসাবে পেয়েছেন , যা (সংজ্ঞায়িতভাবে) একটি নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত হয় Hello(এমনকি এটি এটি ব্যবহার করে না বা বোঝায় না এমনকি), যার অর্থ এটি new Thing();একটি নির্দিষ্ট Helloউদাহরণ না রেখে বলা ত্রুটি সুযোগ।

আপনি যদি এটির পরিবর্তে স্থির শ্রেণি হিসাবে ঘোষণা করেন তবে এটি একটি "নেস্টেড" শ্রেণি, যার কোনও নির্দিষ্ট Helloউদাহরণের প্রয়োজন নেই ।


এই অর্থ কি যে যদি আমি instantiate outer class, non-static inner classপাশাপাশি তৈরি করা হবে এমনকি যদি আমি এটা কোথাও ব্যবহার করবেন না?
মিঃ 5

না। অন্তর্গত শ্রেণীর প্রতিটি
জিনিসের

92

আপনি Thingক্লাসটিকে একটি অ-স্থিতিশীল অভ্যন্তর শ্রেণি হিসাবে ঘোষণা করেছেন । এর অর্থ এটি Helloশ্রেণীর কোনও উদাহরণের সাথে যুক্ত হতে হবে ।

আপনার কোডে, আপনি Thingস্থির প্রসঙ্গ থেকে একটি উদাহরণ তৈরি করার চেষ্টা করছেন । সংকলকটি সে সম্পর্কেই অভিযোগ করছে।

কয়েকটি সম্ভাব্য সমাধান রয়েছে। কোন সমাধানটি ব্যবহার করতে হবে তা আপনি কী অর্জন করতে চান তার উপর নির্ভর করে।

  • ক্লাসের Thingবাইরে চলে যান Hello

  • পরিবর্তন Thingএকটি হতে staticনেস্টেড বর্গ।

    static class Thing
  • এর উদাহরণ তৈরির Helloআগে একটি উদাহরণ তৈরি করুন Thing

    public static void main(String[] args)
    {
        Hello h = new Hello();
        Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P
    }

শেষ সমাধান (একটি অ স্থিত নেস্টেড বর্গ) বাধ্যতামূলক হবে যদি কোনও উদাহরণ অর্থবোধক হওয়ার কোনও উদাহরণের উপর Thingনির্ভর করে Hello। উদাহরণস্বরূপ, যদি আমাদের থাকে:

public class Hello {
    public int enormous;

    public Hello(int n) {
        enormous = n;
    }

    public class Thing {
        public int size;

        public Thing(int m) {
            if (m > enormous)
                size = enormous;
            else
                size = m;
        }
    }
    ...
}

শ্রেণীর অবজেক্ট তৈরির যে কোনও কাঁচা প্রচেষ্টা Thing, যেমন:

Thing t = new Thing(31);

সমস্যাযুক্ত হবে, যেহেতু এর enormousবিপরীতে 31 পরীক্ষা করার কোনও সুস্পষ্ট মান থাকবে না । একটি দৃষ্টান্ত hএর Helloবাইরের শ্রেণী এই প্রদান করা প্রয়োজন h.enormousমান:

...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...

কারণ এটির অর্থ একটি নয় Thingতবে এটির একটি নেই Hello

নেস্টেড / অভ্যন্তরীণ ক্লাস সম্পর্কে আরও তথ্যের জন্য: নেস্টেড ক্লাস (জাভা টিউটোরিয়াল)


আপনার উত্তরটি ব্যাপক এবং সিন্থেটিক উভয়ই। এমনকি এটি অদ্ভুত মনে হলেও (কমপক্ষে আমার কাছে) সিনট্যাক্সটি সঠিক।
গুল্ম

যদি এখনও কেউ ত্রুটি পেতে থাকে তবে সিনট্যাক্সটি Thing thing1 <<HelloInstantiation>>.new Thing()মূল। আমি সিনট্যাক্স ব্যবহার করে কয়েক মিনিট বিভ্রান্ত হয়ে কাটিয়েছি Thing thing1 new <<HelloInstantiation>>.Thing()। = পি
skia.heliou

1
@ skia.heliou ধন্যবাদ! আমি একটি সহায়ক শ্রেণি এবং স্থিতিশীল ভেরিয়েবলগুলি তৈরি করছিলাম (বা ক্লাসগুলি) কেবল সুযোগকে সরিয়ে দেয় না, তবে তারা প্রায়শই অক্ষম থাকে। রানটাইম আর্গুমেন্ট সরবরাহ করার প্রয়োজন একটি মূল পদ্ধতি ব্যবহার করা বিরক্তিকর করে তোলে। এটিই আমার প্রয়োজন ছিল এবং ঠিক আমি যা খুঁজছিলাম।
পরিত্যক্ত কার্ট

25

ভাল ... অনেক ভাল উত্তর কিন্তু আমি এটিতে আরও যুক্ত করতে চাই। জাভা-জাভাতে অন্তর্গত শ্রেণীর উপর একটি সংক্ষিপ্ত বিবরণ আমাদের অন্য শ্রেণীর মধ্যে একটি শ্রেণির সংজ্ঞা দিতে দেয় এবং এইভাবে বাসা বাঁধতে সক্ষম হওয়ার কিছু সুবিধা রয়েছে:

  1. এটি অন্যান্য ক্লাস থেকে ক্লাসটি (এটি এনক্যাপসুলেশন বৃদ্ধি করে) আড়াল করতে পারে - বিশেষত প্রাসঙ্গিক যদি শ্রেণিটি কেবলমাত্র শ্রেণীর মধ্যে ব্যবহৃত হয় তবে এটি অন্তর্ভুক্ত থাকে। এক্ষেত্রে বাইরের বিশ্ব সম্পর্কে এটি জানার দরকার নেই।

  2. এটি কোডকে আরও রক্ষণাবেক্ষণযোগ্য করে তুলতে পারে কারণ ক্লাসগুলি যেখানে প্রয়োজন সেখানে চারদিকে যুক্তিযুক্তভাবে একত্রিত করা হয়েছিল।

  3. অভ্যন্তরীণ বর্গের এটির ক্লাসের উদাহরণ ভেরিয়েবল এবং পদ্ধতিগুলির অ্যাক্সেস রয়েছে ।

আমাদের প্রধানত তিন প্রকারের রয়েছে Inner Classes

  1. স্থানীয় অভ্যন্তরীণ
  2. স্ট্যাটিক ইনার ক্লাস
  3. নামবিহীন অভ্যন্তর শ্রেণি

কিছু গুরুত্বপূর্ণ বিষয় মনে রাখতে হবে

  • স্থানীয় অভ্যন্তরীণ শ্রেণীর যেখানে এটি বিদ্যমান তা অ্যাক্সেস করতে আমাদের শ্রেণীর অবজেক্টের প্রয়োজন।
  • স্ট্যাটিক ইনার ক্লাসটি একই শ্রেণীর যে কোনও স্ট্যাটিক পদ্ধতিতে বিদ্যমান রয়েছে তার মতোই সরাসরি অ্যাক্সেস পায়।
  • অজ্ঞাতনামা অভ্যন্তরীণ শ্রেণি বহির্মুখী বিশ্বের পাশাপাশি একই শ্রেণীর অন্যান্য পদ্ধতি বা ক্লাসগুলির (যা এটি বিদ্যমান) এর জন্য দৃশ্যমান নয় এবং এটি যে ঘোষিত হয়েছে সেখানে এটি ব্যবহৃত হয়।

আসুন উপরের ধারণাগুলি ব্যবহারিকভাবে দেখার চেষ্টা করি_

public class MyInnerClass {

public static void main(String args[]) throws InterruptedException {
    // direct access to inner class method
    new MyInnerClass.StaticInnerClass().staticInnerClassMethod();

    // static inner class reference object
    StaticInnerClass staticInnerclass = new StaticInnerClass();
    staticInnerclass.staticInnerClassMethod();

    // access local inner class
    LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass();
    localInnerClass.localInnerClassMethod();

    /*
     * Pay attention to the opening curly braces and the fact that there's a
     * semicolon at the very end, once the anonymous class is created:
     */
    /*
     AnonymousClass anonymousClass = new AnonymousClass() {
         // your code goes here...

     };*/
 }

// static inner class
static class StaticInnerClass {
    public void staticInnerClassMethod() {
        System.out.println("Hay... from Static Inner class!");
    }
}

// local inner class
class LocalInnerClass {
    public void localInnerClassMethod() {
        System.out.println("Hay... from local Inner class!");
    }
 }

}

আমি আশা করি এটি সবার জন্য সহায়তা করবে। দয়া করে আরো অনেক কিছুর জন্য পড়ুন


প্রস্তাবিত উন্নতিগুলি: প্রথম শ্রেণীর মাইআউটারক্লাসের নাম দিন, বেনামে ক্লাসের কাছ থেকে মন্তব্যগুলি সরিয়ে ফেলুন।
নুমেনন

9

Thingএকটি হল ভেতরের বর্গ একটি দৃষ্টান্ত একটি স্বয়ংক্রিয় সংযোগ সহ Hello। আপনি একটি সংকলন ত্রুটি পান কারণ Helloএটি সংযুক্ত করার কোনও উদাহরণ নেই । আপনি কোনও স্ট্যাটিক নেস্টেড ক্লাসে পরিবর্তন করে এটি খুব সহজেই ঠিক করতে পারেন যার কোনও সংযোগ নেই:

static class Thing

9

নীচের সাধারণ উদাহরণ সহ এটি বুঝতে দিন। এটি হ'ল কারণ এটি নন-স্ট্যাটিক ইনার ক্লাস। আপনার বাইরের শ্রেণীর উদাহরণ প্রয়োজন।

 public class PQ {

    public static void main(String[] args) {

        // create dog object here
        Dog dog = new PQ().new Dog();
        //OR
        PQ pq = new PQ();
        Dog dog1 = pq.new Dog();
    }

    abstract class Animal {
        abstract void checkup();
    }

    class Dog extends Animal {
        @Override
        void checkup() {
            System.out.println("Dog checkup");

        }
    }

    class Cat extends Animal {
        @Override
        void checkup() {
            System.out.println("Cat Checkup");

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