জাভা ইনার ক্লাস এবং স্ট্যাটিক নেস্টেড ক্লাস


1764

জাভাতে কোনও অভ্যন্তর শ্রেণি এবং স্থির নেস্টেড শ্রেণীর মধ্যে প্রধান পার্থক্য কী? ডিজাইন / বাস্তবায়ন এর মধ্যে একটি চয়ন করতে ভূমিকা রাখে?


65
জশুয়া ব্লচ এর উত্তর হল মধ্যে কার্যকর জাভা পড়া item 22 : Favor static member classes over non static
রেমন্ড Chenon

4
রেকর্ডের জন্য, এটি একই বইয়ের তৃতীয় সংস্করণে আইটেম 24।
জিরোকুল

উত্তর:


1696

থেকে জাভা টিউটোরিয়াল :

নেস্টেড ক্লাসগুলি দুটি বিভাগে বিভক্ত: স্থির এবং অ-স্থিতিশীল। স্থিত ঘোষিত নেস্টেড ক্লাসগুলিকে কেবল স্ট্যাটিক নেস্টেড ক্লাস বলা হয়। অ-স্থির নেস্টেড ক্লাসগুলিকে ইনার ক্লাস বলে।

স্ট্যাটিক নেস্টেড ক্লাসগুলি বদ্ধ শ্রেণীর নাম ব্যবহার করে অ্যাক্সেস করা হয়:

OuterClass.StaticNestedClass

উদাহরণস্বরূপ, স্ট্যাটিক নেস্টেড ক্লাসের জন্য একটি অবজেক্ট তৈরি করতে, এই সিনট্যাক্সটি ব্যবহার করুন:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

অভ্যন্তরীণ শ্রেণীর উদাহরণস্বরূপ অবজেক্টগুলি বাইরের শ্রেণীর উদাহরণের মধ্যে উপস্থিত থাকে। নিম্নলিখিত ক্লাস বিবেচনা করুন:

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

ইনারক্লাসের একটি উদাহরণ কেবলমাত্র আউটারক্লাসের একটি উদাহরণের মধ্যেই উপস্থিত থাকতে পারে এবং এর সংলগ্ন উদাহরণের পদ্ধতি এবং ক্ষেত্রগুলিতে সরাসরি অ্যাক্সেস থাকতে পারে।

একটি অভ্যন্তরীণ বর্গ ইনস্ট্যান্ট করতে, আপনাকে প্রথমে বাইরের শ্রেণিটি ইনস্ট্যান্ট করতে হবে। তারপরে, এই সিনট্যাক্সটি দিয়ে বাইরের অবজেক্টের অভ্যন্তরীণ বস্তুটি তৈরি করুন:

OuterClass outerObject = new OuterClass()
OuterClass.InnerClass innerObject = outerObject.new InnerClass();

দেখুন: জাভা টিউটোরিয়াল - নেস্টেড ক্লাসগুলি

সম্পূর্ণতার জন্য লক্ষ্য করুন যে কোনও অভ্যন্তরীন উদাহরণ ছাড়াই অভ্যন্তর শ্রেণীর মতো জিনিস রয়েছে :

class A {
  int t() { return 1; }
  static A a =  new A() { int t() { return 2; } };
}

এখানে, একটি স্থিতিশীল প্রসঙ্গে সংজ্ঞায়িতnew A() { ... } করা একটি অভ্যন্তরীণ শ্রেণি এবং এর কোনও সংযুক্তি উদাহরণ নেই।


130
মনে রাখবেন যে আপনি সরাসরি একটি স্ট্যাটিক নেস্টেড ক্লাসও আমদানি করতে পারেন, যেমন আপনি করতে পারেন (ফাইলের শীর্ষে): import OuterClass.StaticNestedClass; তারপরে ক্লাসটি কেবল আউটারক্লাস হিসাবে উল্লেখ করুন।
ক্যামিলো দাজ রেপকা

4
@ মার্টিন একটি অভ্যন্তর শ্রেণি তৈরির এই প্রতিমাটির জন্য কোনও নির্দিষ্ট প্রযুক্তিগত নাম আছে OuterClass.InnerClass innerObject = outerObject.new InnerClass();?
গীক

7
তাহলে বেসরকারী স্ট্যাটিক নেস্টেড ক্লাসের ব্যবহার কী? আমি মনে করি আমরা এটি আউটারক্লাসের মতো বাইরে থেকে ইনস্ট্যান্ট করতে পারি না St স্ট্যাটিক নেস্টড ক্লাস নেস্টডবজেক্ট = নতুন আউটারক্লাস.স্ট্যাটিক নেস্টড ক্লাস ();
রোবোক্লেক্স

1
ইলিয়া কোগান: আমার অর্থ এই ছিল যে আমি জানি যে আমরা পিতামাতার শ্রেণীর ক্ষেত্রগুলি স্থিতিশীল বা অ-স্থিতাবস্থায় অ্যাক্সেস করতে পারি (যদি শিশু শ্রেণিটি অ স্থির শ্রেণি হয়) আমি তাদের বৈশিষ্ট্যগুলি কয়েকবার ব্যবহার করেছি, তবে আমি ভাবছিলাম যে কী ধরণের মেমরি মডেল? তারা অনুসরণ করে? ওওপি ধারণাগুলি কী তাদের আলাদা ধারণা হিসাবে আচ্ছাদন করে? যদি না হয় তারা ওওপি-র মধ্যে সত্যিই ফিট করে। আমার কাছে বন্ধু শ্রেণির মতো মনে হচ্ছে :)
মুবাশার

4
@ মার্টিন, আমি জানি আমি এই থ্রেডটিতে অবিশ্বাস্যভাবে দেরিতে আসছি তবে: এটি আপনার পরিবর্তনশীল, ক, এটি শ্রেণীর একটি স্থির ক্ষেত্র, এ। এর অর্থ এই নয় যে 'বেনামে বর্গ' নতুন এ () {ইন্ট টি দ্বারা নির্মিত () {রিটার্ন 2; I} 'স্থির ক্ষেত্রের জন্য আমি অন্য কোনও অবজেক্টকে কেবল সারণিযুক্ত স্থিতিযুক্ত, ক হিসাবে স্থিতিশীল: ক্লাস বি {স্ট্যাটিক শূন্য মূল (স্ট্রিং) {আ = নতুন এ ())} (এ এবং বি একইভাবে) প্যাকেজ) এটি এটিকে একটি স্ট্যাটিক ক্লাস করে না। আপনার সাথে সংযুক্ত থ্রেডে উদ্ধৃত রেফারেন্সে "স্থির প্রসঙ্গ" বাক্যাংশটি অবিশ্বাস্যভাবে অস্পষ্ট। আসলে, এই থ্রেডের অনেক মন্তব্যে এটি উল্লেখ করা হয়েছিল।
গ্রান্টরোবার্টসন

599

জাভা টিউটোরিয়াল বলেছেন :

পরিভাষা: নেস্টেড ক্লাসগুলি দুটি বিভাগে বিভক্ত: স্থির এবং অ-স্থিতিশীল। স্থিত ঘোষিত নেস্টেড ক্লাসগুলিকে কেবল স্ট্যাটিক নেস্টেড ক্লাস বলা হয়। অ-স্থির নেস্টেড ক্লাসগুলিকে ইনার ক্লাস বলা হয়।

সাধারণ আলোচনাতে, বেশিরভাগ প্রোগ্রামাররা "নেস্টেড" এবং "ইনার" শব্দের আন্তঃবিন্যাস হিসাবে ব্যবহার করেন তবে আমি "নেস্টেড ক্লাস" শব্দটি ব্যবহার করব যা অভ্যন্তরীণ এবং স্থির উভয়ই জুড়ে।

শ্রেণিগুলিকে নেস্টেড অ্যাড ইনফিনিটাম বলা যেতে পারে, উদাহরণস্বরূপ ক্লাস এ ক্লাস বি ধারণ করতে পারে যা ক্লাস সি ধারণ করে যা ক্লাস ডি ইত্যাদি রয়েছে। তবে, শ্রেণি বাসা বাঁধার একাধিক স্তরের বিরল কারণ এটি সাধারণত খারাপ নকশা হয়।

আপনি নেস্টেড ক্লাস তৈরি করতে পারেন এমন তিনটি কারণ রয়েছে:

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

আছে জাভা নেস্টেড ক্লাসের চার ধরণের । সংক্ষেপে, তারা হলেন:

  • স্ট্যাটিক ক্লাস : অন্য শ্রেণির স্থির সদস্য হিসাবে ঘোষিত
  • অভ্যন্তর শ্রেণি : অন্য শ্রেণির উদাহরণস্বরূপ সদস্য হিসাবে ঘোষিত
  • স্থানীয় অভ্যন্তর শ্রেণি : অন্য শ্রেণির উদাহরণ পদ্ধতির অভ্যন্তরে ঘোষণা করা
  • বেনামে অভ্যন্তর শ্রেণি : স্থানীয় অভ্যন্তর শ্রেণীর মতো, তবে একটি অভিব্যক্তি হিসাবে লিখিত যা একটি অফ-অবজেক্টকে ফেরত দেয়

আমাকে আরও বিশদ বিবরণ দিন।


স্ট্যাটিক ক্লাস

স্ট্যাটিক ক্লাসগুলি বোঝার জন্য সহজতম ধরণের কারণ তাদের ধারণক্ষম শ্রেণীর উদাহরণগুলির সাথে কোনও সম্পর্ক নেই।

স্ট্যাটিক ক্লাস হল এমন একটি শ্রেণি যা অন্য শ্রেণীর স্থির সদস্য হিসাবে ঘোষিত হয়। শুধু অন্যান্য স্ট্যাটিক সদস্যদের মত, এই ধরনের একটি বর্গ সত্যিই ঠিক যে ব্যবহারসমূহ তার নামস্থান, যেমন ধারণকারী ক্লাসের মধ্যে জল্লাদ হয় যেমন বর্গ ছাগল শ্রেণীর একটি স্ট্যাটিক সদস্য হিসেবে ঘোষণা গণ্ডার প্যাকেজের মধ্যে পিজা নাম দ্বারা পরিচিত হয় pizza.Rhino.Goat

package pizza;

public class Rhino {

    ...

    public static class Goat {
        ...
    }
}

স্পষ্টতই, স্ট্যাটিক ক্লাসগুলি একটি দুর্দান্ত মূল্যহীন বৈশিষ্ট্য কারণ ক্লাসগুলি ইতিমধ্যে প্যাকেজগুলির মাধ্যমে নামের জায়গাগুলিতে বিভক্ত। স্ট্যাটিক ক্লাস তৈরির একমাত্র আসল অনুমানযোগ্য কারণ হ'ল এই জাতীয় শ্রেণীর নিজস্ব ক্লাসের ব্যক্তিগত স্ট্যাটিক সদস্যদের অ্যাক্সেস রয়েছে তবে আমি স্থির শ্রেণীর বৈশিষ্ট্যটি বিদ্যমান থাকার পক্ষে এটি একটি লম্পট ন্যায়সঙ্গত বলে মনে করি।


ইনার ক্লাস

একটি অভ্যন্তর শ্রেণি হল এমন একটি শ্রেণি যা অন্য শ্রেণীর অ স্থিতিশীল সদস্য হিসাবে ঘোষিত হয়:

package pizza;

public class Rhino {

    public class Goat {
        ...
    }

    private void jerry() {
        Goat g = new Goat();
    }
}

স্থির শ্রেণীর মতোই, অভ্যন্তরীণ শ্রেণিটি তার প্যাকেজযুক্ত পিজ্জা.রাইনো.গোটযুক্ত শ্রেণীর নাম অনুসারে যোগ্য হিসাবে পরিচিত , তবে ধারণকৃত শ্রেণীর অভ্যন্তরে এটি এর সাধারণ নাম দিয়ে পরিচিত হতে পারে। যাইহোক, ইনার ক্লাসের প্রতিটি উদাহরণের তার ধারণকারী বর্গ একটি নির্দিষ্ট উদাহরণস্বরূপ আবদ্ধ থাকে: উপরে, ছাগল এর মধ্যে তৈরি করা জেরি , পরোক্ষভাবে আবদ্ধ থাকে গণ্ডার উদাহরণস্বরূপ এই মধ্যে জেরি । অন্যথায়, আমরা ছাগল ইনস্ট্যান্ট করার সময় আমরা সম্পর্কিত রাইনো উদাহরণটি স্পষ্ট করে তুলি :

Rhino rhino = new Rhino();
Rhino.Goat goat = rhino.new Goat();

(খেয়াল করুন আপনি অদ্ভুত নতুন বাক্য গঠনতে কেবল ছাগল হিসাবে অভ্যন্তরীণ প্রকারটি উল্লেখ করেছেন : জাভা গন্ডার অংশ থেকে অন্তর্ভুক্ত প্রকারটি অনুমান করে And এবং হ্যাঁ নতুন গন্ডার.গোট () আমার কাছেও আরও উপলব্ধি করতে পারে have)

তাহলে এটি আমাদের কী লাভ করে? ঠিক আছে, অভ্যন্তরীণ শ্রেণীর উদাহরণটি সহ শ্রেণীর উদাহরণ সহ সদস্যদের অ্যাক্সেস রয়েছে। এই এনক্লোজিং উদাহরণস্বরূপ সদস্যদের ভেতরের শ্রেণীর ভিতরের উল্লেখ করা হয় মাধ্যমে , শুধু তাদের সরল নাম না মাধ্যমে এই ( এই ভেতরের ক্লাসে ভেতরের বর্গ উদাহরণস্বরূপ, সম্পর্কযুক্ত না ধারণকারী বর্গ উদাহরণস্বরূপ বোঝায়):

public class Rhino {

    private String barry;

    public class Goat {
        public void colin() {
            System.out.println(barry);
        }
    }
}

ভেতরের বর্গ, আপনি উল্লেখ করতে পারেন এই যেমন ধারণকারী ক্লাসের Rhino.this , এবং আপনি ব্যবহার করতে পারেন এই তার সদস্যদের, উল্লেখ করতে যেমন Rhino.this.barry


স্থানীয় অভ্যন্তরীণ ক্লাস

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

একটি স্থানীয় অভ্যন্তর শ্রেণি না হয় কোনও শ্রেণি বা প্যাকেজের সদস্য না, এটি অ্যাক্সেস স্তর দিয়ে ঘোষণা করা হয় না। (তবে পরিষ্কার হয়ে নিন যে এর নিজস্ব সদস্যদের একটি সাধারণ শ্রেণীর মতো অ্যাক্সেসের স্তর রয়েছে))

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


নামবিহীন অন্তর্গত শ্রেণি

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

new *ParentClassName*(*constructorArgs*) {*members*}

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

বিকল্পভাবে, আপনি প্রয়োগের জন্য একটি ইন্টারফেস নির্দিষ্ট করতে পারেন:

new *InterfaceName*() {*members*}

এই জাতীয় ঘোষণাটি নামবিহীন শ্রেণীর একটি নতুন উদাহরণ তৈরি করে যা অবজেক্টকে প্রসারিত করে এবং ইন্টারফেসনাম প্রয়োগ করে । আবার আপনি নিজের নির্মাণকারীর সরবরাহ করতে পারবেন না; এই ক্ষেত্রে, জাভা সুস্পষ্টভাবে একটি নো-আরগ, ডু-কিছুই কনস্ট্রাক্টর সরবরাহ করে (তাই এই ক্ষেত্রে কখনও কনস্ট্রাক্টরের যুক্তি থাকতে হবে না)।

যদিও আপনি কোনও বেনামে অভ্যন্তরীণ শ্রেণিকে একটি নির্মাণকারী দিতে পারেন না, আপনি এখনও কোনও ইনিশিয়াল ব্লক (যে কোনও পদ্ধতির বাইরে রাখা একটি ব্লক) ব্যবহার করতে চান কোনও সেটআপ করতে পারেন।

পরিষ্কার হয়ে নিন যে একটি বেনামি অভ্যন্তর শ্রেণি একটি উদাহরণ সহ স্থানীয় আভ্যন্তরীণ শ্রেণি তৈরির সহজতর নমনীয় উপায়। আপনি যদি কোনও স্থানীয় অভ্যন্তরীণ শ্রেণি চান যা একাধিক ইন্টারফেস প্রয়োগ করে বা ইন্টারফেস প্রয়োগ করে যখন অবজেক্ট ব্যতীত অন্য কোনও শ্রেণি প্রসারিত করে বা এটির নিজস্ব নির্মাতা নির্দিষ্ট করে, আপনি একটি নিয়মিত স্থানীয় স্থানীয় অভ্যন্তর শ্রেণি তৈরি করতে আটকে রয়েছেন।


39
দুর্দান্ত গল্প, ধন্যবাদ। যদিও এটির একটি ভুল আছে। আপনি রাইনো.থিস.ভরিয়েবলনেম দ্বারা একটি উদাহরণ অভ্যন্তরীণ শ্রেণী থেকে একটি বাহ্যিক শ্রেণীর ক্ষেত্রগুলি অ্যাক্সেস করতে পারেন।
30:47

2
আপনি বেনামে অভ্যন্তর শ্রেণীর জন্য আপনার নিজের নির্মাতা সরবরাহ করতে পারবেন না, আপনি ডাবল ব্রেস সূচনাটি ব্যবহার করতে পারেন। c2.com/cgi/wiki?DoubleBraceInitialization
কেসব্যাশ

30
দুর্দান্ত ব্যাখ্যা, তবে আমি স্থির অভ্যন্তর শ্রেণীর মূল্যহীন হওয়ার সাথে একমত নই। স্থির অভ্যন্তর শ্রেণীর ব্যবহারের উপর নির্ভর করে নির্মাতা প্যাটার্নের দুর্দান্ত পরিবর্তনের জন্য rwhansen.blogspot.com/2007/07/… দেখুন ।
মনসুর সিদ্দিকী

9
স্থির অভ্যন্তর শ্রেণিটি মূল্যহীন বলে আমিও একমত নই: আপনি যদি অভ্যন্তরীণ শ্রেণিতে একটি এনাম চান তবে আপনাকে অভ্যন্তরীণ বর্গকে অচল করতে হবে।
কেউ কেউ কোথাও

9
প্রাইভেট স্ট্যাটিক নেস্টেড ক্লাসগুলিও বেশ দরকারী: আপনি সেগুলি রাখতে চান তবে আপনি সেগুলি প্রকাশ করতে চান না। লিংকডলিস্টে <T> এন্ট্রি পছন্দ করুন <টি>, বা কোনও ক্রিয়াকলাপের (অ্যান্ড্রয়েড) ইত্যাদির ভিতরে অ্যাসিঙ্কটাস্ক ইত্যাদি ...
লরেঞ্জো ডিম্যাট

150

আমি মনে করি না উপরের উত্তরগুলিতে আসল পার্থক্য পরিষ্কার হয়ে গেছে।

শর্তাবলী সঠিকভাবে পেতে প্রথমে:

  • নেস্টেড ক্লাসটি এমন একটি ক্লাস যা সোর্স কোড স্তরে অন্য শ্রেণিতে থাকে।
  • আপনি যদি স্থির পরিবর্তনকারী দিয়ে এটি ঘোষণা করেন তবে এটি স্থিতিশীল
  • একটি অ স্থিত নেস্টেড ক্লাসকে ইনার ক্লাস বলে। (আমি অ স্থিত নেস্টেড ক্লাসের সাথে থাকি))

মার্টিনের উত্তর এখন পর্যন্ত ঠিক আছে। তবে আসল প্রশ্নটি হল: নেস্টেড বর্গ স্থির ঘোষণার উদ্দেশ্য কী?

তুমি ব্যাবহার কর স্থির নেস্টেড ক্লাসগুলি যদি আপনি কেবল নিজের ক্লাসগুলি একত্রে রাখতে চান তবে সেগুলি টপিকালিভাবে একত্রে অন্তর্ভুক্ত থাকে বা যদি নেস্টেড ক্লাসটি একচেটিয়া ক্লাসে একচেটিয়াভাবে ব্যবহৃত হয়। স্ট্যাটিক নেস্টেড ক্লাস এবং অন্যান্য প্রতিটি ক্লাসের মধ্যে কোনও অর্থগত পার্থক্য নেই।

অ-স্থির নেস্টেড ক্লাস একটি আলাদা জন্তু। বেনামে অভ্যন্তর শ্রেণীর মতো, এ জাতীয় নেস্টেড ক্লাসগুলি আসলে ক্লোজার। এর অর্থ তারা তাদের আশেপাশের সুযোগ এবং তাদের সংলগ্ন দৃষ্টান্তটি ক্যাপচার করে এবং এটিকে অ্যাক্সেসযোগ্য করে তোলে। সম্ভবত একটি উদাহরণ এটি পরিষ্কার করে দেবে। একটি ধারকটির এই স্টাবটি দেখুন:

public class Container {
    public class Item{
        Object data;
        public Container getContainer(){
            return Container.this;
        }
        public Item(Object data) {
            super();
            this.data = data;
        }

    }

    public static Item create(Object data){
        // does not compile since no instance of Container is available
        return new Item(data);
    }
    public Item createSubItem(Object data){
        // compiles, since 'this' Container is available
        return new Item(data);
    }
}

এই ক্ষেত্রে আপনি সন্তানের আইটেম থেকে পিতামাত্রে ধারক হিসাবে একটি রেফারেন্স পেতে চান। অ-স্থিত নেস্টেড ক্লাস ব্যবহার করে, এটি কিছু কাজ ছাড়াই কাজ করে। আপনি সিনট্যাক্সের সাহায্যে ধারকটির এনকোলেসিং ইভেন্টটি অ্যাক্সেস করতে পারেনContainer.this

নিম্নলিখিত আরও কঠোর ব্যাখ্যা:

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

// class version 49.0 (49)
// access flags 33
public class Container$Item {

  // compiled from: Container.java
  // access flags 1
  public INNERCLASS Container$Item Container Item

  // access flags 0
  Object data

  // access flags 4112
  final Container this$0

  // access flags 1
  public getContainer() : Container
   L0
    LINENUMBER 7 L0
    ALOAD 0: this
    GETFIELD Container$Item.this$0 : Container
    ARETURN
   L1
    LOCALVARIABLE this Container$Item L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 1
  public <init>(Container,Object) : void
   L0
    LINENUMBER 12 L0
    ALOAD 0: this
    ALOAD 1
    PUTFIELD Container$Item.this$0 : Container
   L1
    LINENUMBER 10 L1
    ALOAD 0: this
    INVOKESPECIAL Object.<init>() : void
   L2
    LINENUMBER 11 L2
    ALOAD 0: this
    ALOAD 2: data
    PUTFIELD Container$Item.data : Object
    RETURN
   L3
    LOCALVARIABLE this Container$Item L0 L3 0
    LOCALVARIABLE data Object L0 L3 2
    MAXSTACK = 2
    MAXLOCALS = 3
}

আপনি দেখতে পাচ্ছেন যে সংকলক একটি গোপন ক্ষেত্র তৈরি করে Container this$0 । এটি কনস্ট্রাক্টরে সেট করা হয়েছে যার সাথে এনকোলেসিং উদাহরণটি নির্দিষ্ট করতে কনটেনারের ধরণের অতিরিক্ত পরামিতি রয়েছে। আপনি উত্সটিতে এই প্যারামিটারটি দেখতে পাচ্ছেন না তবে সংকলক নিখুঁতভাবে নেস্টেড শ্রেণীর জন্য এটি তৈরি করে।

মার্টিন এর উদাহরণ

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

সুতরাং (বাইটোকোডে) এর মতো কোনও কলটিতে সংকলিত হবে

new InnerClass(outerObject)

শেষ করার জন্য:

নাম প্রকাশে অনিচ্ছুক একজন বর্গ হয় একটি অ-স্ট্যাটিক নেস্টেড বর্গ যা শুধু এটির সাথে সম্পর্কযুক্ত কোন নাম এবং পরে রেফারেন্সড করা যাবে না একটি নিখুঁত উদাহরণ।


17
"স্ট্যাটিক নেস্টেড ক্লাস এবং অন্য প্রতিটি ক্লাসের মধ্যে কোনও অর্থগত পার্থক্য নেই।" নেস্টেড শ্রেণি ব্যতীত পিতামাতার ব্যক্তিগত ক্ষেত্র / পদ্ধতিগুলি দেখতে পারা যায় এবং পিতামাতা শ্রেণি নীড়ের ব্যক্তিগত ক্ষেত্র / পদ্ধতিগুলি দেখতে পারে।
ব্র্যাড কাপিট

অ স্থিতিশীল অভ্যন্তর শ্রেণিটি সম্ভাব্যভাবে বিশাল মেমরি ফাঁসের কারণ হবে না? যেমনটি প্রতিবার আপনি শ্রোতা তৈরি করার সময়, আপনি একটি ফাঁস তৈরি করেন?
G_V

3
@ জি_ভি মেমরির ফাঁস হওয়ার স্পষ্টত সম্ভাবনা রয়েছে কারণ অভ্যন্তরীণ শ্রেণীর একটি উদাহরণ বাইরের শ্রেণীর একটি রেফারেন্স রাখে। এটি প্রকৃত সমস্যা কিনা তা নির্ভর করে বাইরের এবং অভ্যন্তরীণ শ্রেণীর উদাহরণগুলির জন্য কোথায় এবং কীভাবে রেফারেন্স হয়।
jrudolph

94

আমি মনে করি যে উপরের উত্তরের কোনও উত্তরই আপনাকে আবেদনের নকশার ক্ষেত্রে নেস্টেড বর্গ এবং একটি স্থির নেস্টেড শ্রেণীর মধ্যে আসল পার্থক্য ব্যাখ্যা করে না:

ওভারভিউ

নেস্টেড ক্লাসটি ননস্ট্যাটিক বা স্ট্যাটিক হতে পারে এবং প্রতিটি ক্ষেত্রেই অন্য শ্রেণীর মধ্যে সংজ্ঞায়িত শ্রেণি হয়কোনও নেস্টেড বর্গটি কেবল পরিবেষ্টনের ক্লাসে পরিবেশন করার জন্য উপস্থিত থাকতে হবে , যদি কোনও নেস্টেড শ্রেণি অন্য শ্রেণীর দ্বারা (কেবল ঘের লাগানো নয়) দরকারী হয় তবে একটি শীর্ষ স্তরের শ্রেণি হিসাবে ঘোষণা করা উচিত।

পার্থক্য

ননস্ট্যাটিক নেস্টেড বর্গ : অন্তর্নিহিত শ্রেণীর সংলগ্ন দৃষ্টান্তের সাথে স্পষ্টভাবে যুক্ত, এর অর্থ এই যে এটি ঘেরের উদাহরণের পদ্ধতিগুলি এবং অ্যাক্সেসের ভেরিয়েবলগুলি অ্যাক্সেস করা সম্ভব। ননস্ট্যাটিক নেস্টেড ক্লাসের একটি সাধারণ ব্যবহার হ'ল অ্যাডাপ্টার ক্লাসটি সংজ্ঞায়িত করা।

স্ট্যাটিক নেস্টেড ক্লাস : এনক্লোজিং ক্লাস ইনস্ট্যান্স অ্যাক্সেস করতে পারে না এবং এর জন্য পদ্ধতিগুলি আহ্বান করতে পারে না, তাই নীস্টযুক্ত শ্রেণীর যখন ঘেরের ক্লাসের কোনও অ্যাক্সেসের প্রয়োজন না হয় তখন ব্যবহার করা উচিত। স্ট্যাটিক নেস্টেড ক্লাসের একটি সাধারণ ব্যবহার হ'ল বাইরের অবজেক্টের একটি উপাদান প্রয়োগ করা।

উপসংহার

সুতরাং একটি নকশার অবস্থান থেকে উভয়ের মধ্যে প্রধান পার্থক্য হ'ল: ননস্ট্যাটিক নেস্টেড ক্লাস কনটেইনার শ্রেণির উদাহরণ অ্যাক্সেস করতে পারে, যখন স্থির থাকতে পারে না


: আপনার উপসংহার থেকে "স্থির থাকতে পারে না", এমনকি ধারকটির স্থির উদাহরণও নয়? নিশ্চিত?
ভিডিএক্স

স্ট্যাটিক নেস্টেড ক্লাসের একটি সাধারণ ব্যবহার হ'ল রিসাইকেলভিউ এবং লিস্টভিউতে ভিউহোল্ডার ডিজাইন প্যাটার্ন।
হামজেহ সোবহ

1
অনেক ক্ষেত্রে সংক্ষিপ্ত উত্তরটি আরও পরিষ্কার এবং আরও ভাল। এটি যেমন একটি উদাহরণ।
এরিক ওয়াং

32

সহজ ভাষায় আমাদের প্রাথমিকভাবে নেস্টেড ক্লাসগুলির প্রয়োজন কারণ জাভা ক্লোজার সরবরাহ করে না।

নেস্টেড ক্লাসগুলি অন্য সংলগ্ন শ্রেণীর দেহের অভ্যন্তরে সংজ্ঞায়িত ক্লাস। এগুলি দুটি ধরণের - স্থির এবং অ-স্থির।

তারা পরিক্ষেপ বর্গ সদস্য হিসেবে গণ্য করা হয়, অত আপনি চারটি এক্সেস নির্দিষ্টকরী কোন নির্দিষ্ট করতে পারেন - private, package, protected, public। শীর্ষ স্তরের শ্রেণি সহ আমাদের এই বিলাসিতা নেই, যা কেবলমাত্র ঘোষণা publicবা প্যাকেজ-ব্যক্তিগত হিসাবে ঘোষণা করা যেতে পারে ।

অভ্যন্তরীণ ক্লাস ওরফে নন-স্ট্যাক ক্লাসের শীর্ষ শ্রেণির অন্যান্য সদস্যদের অ্যাক্সেস রয়েছে, এমনকি তারা ব্যক্তিগত হিসাবে ঘোষিত হলেও স্ট্যাটিক নেস্টেড ক্লাসগুলির শীর্ষ শ্রেণির অন্যান্য সদস্যদের অ্যাক্সেস নেই।

public class OuterClass {
    public static class Inner1 {
    }
    public class Inner2 {
    }
}

Inner1আমাদের স্থিতিশীল অভ্যন্তর শ্রেণি এবং Inner2এটি আমাদের অভ্যন্তর শ্রেণি যা স্থির নয়। তাদের মধ্যে মূল পার্থক্য, আপনি Inner2একটি আউটার ছাড়া কোনও উদাহরণ তৈরি করতে পারবেন না যেখানে আপনি এটি তৈরি করতে পারেনInner1 স্বাধীনভাবে অবজেক্ট ।

আপনি কখন ইনার ক্লাস ব্যবহার করবেন?

এমন পরিস্থিতি সম্পর্কে চিন্তাভাবনা করুন যেখানে সম্পর্কিত Class Aএবং Class Bসম্পর্কিত, সদস্যদের Class Bঅ্যাক্সেস করা দরকার Class Aএবং Class Bএটি কেবল এর সাথে সম্পর্কিত Class A। ইনার ক্লাসগুলি ছবিতে আসে।

অভ্যন্তর শ্রেণীর উদাহরণ তৈরি করার জন্য আপনাকে আপনার বাহ্যিক শ্রেণীর উদাহরণ তৈরি করতে হবে।

OuterClass outer = new OuterClass();
OuterClass.Inner2 inner = outer.new Inner2();

অথবা

OuterClass.Inner2 inner = new OuterClass().new Inner2();

আপনি কখন স্ট্যাটিক ইনার ক্লাস ব্যবহার করবেন?

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

উদাহরণস্বরূপ, স্ট্যাটিক নেস্টেড ক্লাসের জন্য একটি অবজেক্ট তৈরি করতে, এই সিনট্যাক্সটি ব্যবহার করুন:

OuterClass.Inner1 nestedObject = new OuterClass.Inner1();

স্ট্যাটিক নেস্টেড ক্লাসের সুবিধা হ'ল এটির জন্য কাজ করার জন্য এটি সমন্বিত বর্গ / শীর্ষ শ্রেণীর কোনও জিনিসের প্রয়োজন নেই। এটি আপনাকে রানটাইমে আপনার অ্যাপ্লিকেশনটির তৈরি সংখ্যাগুলিকে হ্রাস করতে সহায়তা করতে পারে।


3
তুমি কি বোঝাতে OuterClass.Inner2 inner = outer.new Inner2();চাও?
এরিক কাপলুন

4
static innerপদ হিসাবে একটি বৈপরীত্য হয়।
ব্যবহারকারী 207421

এবং অভ্যন্তরীণ ক্লাসগুলি 'নন-স্ট্যাক ক্লাস' নামেও পরিচিত নয়। কোড নয় এমন পাঠ্যের জন্য কোড ফর্ম্যাটিং ব্যবহার করবেন না এবং এটি পাঠ্যের জন্য ব্যবহার করবেন না।
ব্যবহারকারী 207421

30

জাভা অভ্যন্তরীণ বর্গ এবং স্থির নেস্টেড শ্রেণীর মধ্যে মূল পার্থক্য এবং সাদৃশ্য এখানে।

আশা করি এটা সাহায্য করবে!

ইনার ক্লাস

  • উদাহরণস্বরূপ এবং স্থিতিশীল পদ্ধতি এবং ক্ষেত্র উভয়ই বাইরের শ্রেণিতে অ্যাক্সেস করতে পারে
  • বেষ্টন বর্গের উদাহরণের সাথে যুক্ত যাতে তা ইনস্ট্যান্ট করতে প্রথমে বাইরের শ্রেণীর উদাহরণ প্রয়োজন ( নতুন কীওয়ার্ডের স্থানটি নোট করুন ):

    Outerclass.InnerClass innerObject = outerObject.new Innerclass();
  • কোনও স্থির সদস্য নিজেই সংজ্ঞায়িত করা যায় না

  • ক্লাস বা ইন্টারফেসের ঘোষণা থাকতে পারে না

স্ট্যাটিক নেস্টেড ক্লাস

  • বাইরের শ্রেণীর উদাহরণ পদ্ধতি বা ক্ষেত্রগুলি অ্যাক্সেস করতে পারে না

  • বেষ্টন বর্গের কোনও ঘটনার সাথে সম্পর্কিত নয় তাই এটি তাত্পর্যপূর্ণ করার জন্য:

    OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

মিল

  • উভয় ইনার ক্লাস এমনকি অ্যাক্সেস করতে পারেন ব্যক্তিগত ক্ষেত্র ও পদ্ধতি এর বাইরের শ্রেণী
  • এছাড়াও বাইরের বর্গ এক্সেস আছে ব্যক্তিগত ক্ষেত্র ও পদ্ধতি এর ভেতরের শ্রেণীর
  • উভয় শ্রেণিতেই ব্যক্তিগত, সুরক্ষিত বা পাবলিক অ্যাক্সেস সংশোধক থাকতে পারে

নেস্টেড ক্লাস কেন ব্যবহার করবেন?

ওরাকল ডকুমেন্টেশন অনুযায়ী বিভিন্ন কারণ রয়েছে ( সম্পূর্ণ ডকুমেন্টেশন ):

  • এটি যৌক্তিকভাবে শ্রেণিবদ্ধ করার একটি উপায় যা কেবলমাত্র এক জায়গায় ব্যবহৃত হয়: কোনও শ্রেণি যদি কেবলমাত্র অন্য এক শ্রেণির জন্য দরকারী হয় তবে সেটিকে এই শ্রেণিতে এম্বেড করা এবং দুটিকে একসাথে রাখা যৌক্তিক। এই জাতীয় "সহায়ক শ্রেণি" বাসা বাঁধাই তাদের প্যাকেজটিকে আরও সুচলিত করে তোলে।

  • এটি এনক্যাপসুলেশন বাড়ায়: দুটি শীর্ষ-স্তরের শ্রেণি, এ এবং বি বিবেচনা করুন, যেখানে বি এর এ সদস্যদের অ্যাক্সেস প্রয়োজন যা অন্যথায় ব্যক্তিগত হিসাবে ঘোষণা করা হবে। এ ক্লাস এ এর ​​মধ্যে ক্লাস বি লুকিয়ে রাখলে এ এর ​​সদস্যদের ব্যক্তিগত ঘোষণা করা যেতে পারে এবং বি এগুলি অ্যাক্সেস করতে পারে। এছাড়াও, খ নিজেই বাইরের বিশ্ব থেকে আড়াল হতে পারে।

  • এটি আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য কোডের দিকে নিয়ে যেতে পারে: শীর্ষ স্তরের শ্রেণির মধ্যে ছোট ছোট ক্লাসগুলিতে বাসা বাঁধাই কোডটি যেখানে ব্যবহৃত হয় তার কাছাকাছি রাখে।


26

আমি মনে করি, সাধারণত যে সম্মেলন হয় তা হ'ল:

  • শীর্ষ স্তরের শ্রেণীর মধ্যে স্ট্যাটিক ক্লাস হল নেস্টেড ক্লাস
  • শীর্ষ স্তরের শ্রেণির মধ্যে অ স্থিত শ্রেণি একটি অভ্যন্তর শ্রেণি , যা আরও দুটি ফর্ম রয়েছে:
    • স্থানীয় ক্লাস - নামক শ্রেণিগুলি কোনও পদ্ধতির বা নির্মাণকারী সংস্থার মতো একটি ব্লকের ভিতরে ঘোষিত
    • বেনাম শ্রেণি - নামবিহীন শ্রেণি যার উদাহরণগুলি প্রকাশ এবং বিবৃতিতে তৈরি করা হয়

তবে মনে রাখার মতো আরও কয়েকটি বিষয় হ'ল :

  • শীর্ষ স্তরের ক্লাস এবং স্ট্যাটিক নেস্টেড ক্লাস অর্থহীনভাবে একই তবে স্ট্যাটিক নেস্টেড ক্লাসের ক্ষেত্রে এটি তার আউটার [প্যারেন্ট] শ্রেণির প্রাইভেট স্ট্যাটিক ফিল্ডস / পদ্ধতিগুলির স্থিতিশীল রেফারেন্স করতে পারে এবং এর বিপরীতে।

  • অভ্যন্তরীণ ক্লাসগুলিতে বহিরাগত [অভিভাবক] শ্রেণীর সংযুক্তকরণের দৃষ্টান্তের ভেরিয়েবলগুলিতে অ্যাক্সেস রয়েছে। যাইহোক, সমস্ত অভ্যন্তর শ্রেণীর সংলগ্ন দৃষ্টান্ত নেই, উদাহরণস্বরূপ স্থিতিক প্রসঙ্গে অভ্যন্তর শ্রেণি যেমন স্ট্যাটিক আরম্ভকারী ব্লকে ব্যবহৃত বেনাম শ্রেণীর মতো না class

  • অজ্ঞাতনামা শ্রেণি ডিফল্টরূপে প্যারেন্ট ক্লাসটি প্রসারিত করে বা পিতা-মাতার ইন্টারফেস প্রয়োগ করে এবং অন্য কোনও শ্রেণি বাড়াতে বা আরও কোনও ইন্টারফেস প্রয়োগ করার জন্য আর কোনও ধারা নেই। সুতরাং,

    • new YourClass(){}; মানে class [Anonymous] extends YourClass {}
    • new YourInterface(){}; মানে class [Anonymous] implements YourInterface {}

আমি অনুভব করি যে বড় প্রশ্নটি কোনটি কখন ব্যবহার করবেন এবং কখন খোলা থাকবে? ভাল এটি বেশিরভাগের উপর নির্ভর করে আপনি কোন দৃশ্যের সাথে লেনদেন করছেন কিন্তু @ জ্রুডলফের দেওয়া উত্তরটি পড়া আপনাকে কিছু সিদ্ধান্ত নিতে সহায়তা করতে পারে।


15

নেস্টেড ক্লাস: ক্লাসের ভিতরে ক্লাস

প্রকার:

  1. স্ট্যাটিক নেস্টেড ক্লাস
  2. অ স্থির নেস্টেড শ্রেণি [অভ্যন্তর শ্রেণি]

পার্থক্য:

অ স্থির নেস্টেড শ্রেণি [অভ্যন্তর শ্রেণি]

বহিরাগত শ্রেণীর অবজেক্টের মধ্যে অন-স্ট্যাটিক নেস্টেড ক্লাসের অবজেক্টের অভ্যন্তর শ্রেণীর উপস্থিতি রয়েছে। যাতে বহিরাগত শ্রেণীর ডেটা সদস্য অভ্যন্তর শ্রেণিতে প্রবেশযোগ্য। সুতরাং অভ্যন্তর শ্রেণীর অবজেক্ট তৈরি করতে আমাদের অবশ্যই প্রথম বাহ্যিক শ্রেণীর অবজেক্ট তৈরি করতে হবে।

outerclass outerobject=new outerobject();
outerclass.innerclass innerobjcet=outerobject.new innerclass(); 

স্ট্যাটিক নেস্টেড ক্লাস

স্ট্যাটিক নেস্টেড ক্লাস অবজেক্ট ইন ইনার ক্লাসের বাইরের ক্লাসের অবজেক্টের দরকার হয় না, কারণ "স্ট্যাটিক" শব্দটি অবজেক্ট তৈরি করার প্রয়োজনের ইঙ্গিত দেয় না।

class outerclass A {
    static class nestedclass B {
        static int x = 10;
    }
}

আপনি যদি এক্স অ্যাক্সেস করতে চান তবে নীচের অভ্যন্তরীণ পদ্ধতিটি লিখুন

  outerclass.nestedclass.x;  i.e. System.out.prinltn( outerclass.nestedclass.x);

13

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

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

স্ট্যাটিক নেস্টেড ক্লাসগুলি বাইরের অবজেক্টের সাথে মিলিত হয় না, সেগুলি দ্রুত হয় এবং তারা গাদা / স্ট্যাক মেমরি নেয় না, কারণ এই জাতীয় শ্রেণীর উদাহরণ তৈরি করা প্রয়োজনীয় নয়। সুতরাং থাম্বের নিয়মটি হ'ল যথাসম্ভব সীমিত সুযোগ (প্রাইভেট> = শ্রেণী> = সুরক্ষিত> = পাবলিক) সহ স্থির নেস্টেড শ্রেণীর সংজ্ঞা দেওয়ার চেষ্টা করা, এবং তারপরে এটিকে অভ্যন্তরীণ শ্রেণিতে রূপান্তর করা ("স্থিতিশীল" সনাক্তকারীকে অপসারণ করে) এবং আলগা করুন সুযোগ, যদি এটি সত্যিই প্রয়োজন হয়।


2
প্রথম বাক্যটি ভুল। হিসাবে 'যেমন জিনিস আছে ভেতরের ক্লাসের নিদর্শনের সঙ্গে', এবং এটি দৃষ্টান্ত যে কোনো সময় পর বাইরের বর্গ instantiated হয়েছে তৈরি করা যায়। দ্বিতীয় বাক্যটি প্রথম বাক্য থেকে অনুসরণ করে না।
ব্যবহারকারী 207421

11

নেস্টেড স্থিত শ্রেণীর ব্যবহার সম্পর্কে একটি সূক্ষ্মতা রয়েছে যা কিছু পরিস্থিতিতে কার্যকর হতে পারে।

ক্লাসটি তার নির্মাণকারীর মাধ্যমে ইনস্ট্যান্ট করার আগে স্ট্যাটিক বৈশিষ্ট্যগুলি তত্ক্ষণিত হয়ে যায়, তবে নেস্টেড স্ট্যাটিক ক্লাসের অভ্যন্তরে স্থির বৈশিষ্ট্যগুলি ক্লাসের নির্মাণকারীর আহ্বান না হওয়া পর্যন্ত তত্ক্ষণাতীত বলে মনে হয় না, বা কমপক্ষে বৈশিষ্ট্যগুলি প্রথমে রেফারেন্স হওয়ার পরেও হয় না, এমনকি যদি তারা 'চূড়ান্ত' হিসাবে চিহ্নিত করা হয়।

এই উদাহরণ বিবেচনা করুন:

public class C0 {

    static C0 instance = null;

    // Uncomment the following line and a null pointer exception will be
    // generated before anything gets printed.
    //public static final String outerItem = instance.makeString(98.6);

    public C0() {
        instance = this;
    }

    public String makeString(int i) {
        return ((new Integer(i)).toString());
    }

    public String makeString(double d) {
        return ((new Double(d)).toString());
    }

    public static final class nested {
        public static final String innerItem = instance.makeString(42);
    }

    static public void main(String[] argv) {
        System.out.println("start");
        // Comment out this line and a null pointer exception will be
        // generated after "start" prints and before the following
        // try/catch block even gets entered.
        new C0();
        try {
            System.out.println("retrieve item: " + nested.innerItem);
        }
        catch (Exception e) {
            System.out.println("failed to retrieve item: " + e.toString());
        }
        System.out.println("finish");
    }
}

যদিও 'নেস্টেড' এবং 'ইনটার্ন আইটেম' উভয়ই 'স্ট্যাটিক ফাইনাল' হিসাবে ঘোষিত হয়েছে। ক্লাসটি ইনস্ট্যান্ট হওয়ার পরে (বা কমপক্ষে নেস্টেড স্ট্যাটিক আইটেমটি প্রথম উল্লেখ করার পরে না হওয়া পর্যন্ত) নেস্টেড.ইনার আইটেমের সেটিংটি সংঘটিত হয় না, কারণ আমি যে রেখাগুলি উল্লেখ করছি তাতে মন্তব্য করে এবং আপত্তিহীন নিজেরাই দেখতে পাচ্ছেন, উপরে। 'বহির্মুখী আইটেম' এর ক্ষেত্রে এটি একই সত্য নয়।

কমপক্ষে এটি আমি জাভা 6.0 এ দেখছি।


10

পদগুলি বিনিময়যোগ্যভাবে ব্যবহৃত হয়। আপনি এটি সম্পর্কে সত্যিই গোঁড়া হতে চান, তাহলে আপনি পারে একটি স্ট্যাটিক ভেতরের বর্গ, এক যা কোন এনক্লোজিং উদাহরণস্বরূপ হয়েছে উল্লেখ করতে "নেস্টেড শ্রেণী" নির্ধারণ করুন। কোডে আপনার কাছে এরকম কিছু থাকতে পারে:

public class Outer {
    public class Inner {}

    public static class Nested {}
}

যদিও এটি আসলে একটি বহুল স্বীকৃত সংজ্ঞা নয়।


2
'স্ট্যাটিক ইনার' শর্তে একটি বৈপরীত্য।
ব্যবহারকারী 207421

5
এটি এমন কনভেনশন নয় যা অভ্যন্তর শ্রেণিকে অ স্থিত নেস্টেড শ্রেণি হিসাবে সংজ্ঞায়িত করে, তবে জেএলএস। docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3
ব্লচ

1
এবং পদগুলি 'বিনিময়যোগ্যভাবে ব্যবহৃত হয় না '।
ব্যবহারকারী 207421

উপরের উদাহরণে স্থির কেন
আদর্শে

10

উদাহরণ তৈরির ক্ষেত্রে, অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণটি বাইরের শ্রেণীর অবজেক্টের রেফারেন্সের সাথে তৈরি করা হয় যেখানে এটি সংজ্ঞায়িত করা হয়। এর অর্থ এটি অন্তর্ভুক্তকারী উদাহরণ রয়েছে। কিন্তু স্থির অভ্যন্তর শ্রেণীর উদাহরণ বহিরাগত শ্রেণীর রেফারেন্স দিয়ে তৈরি করা হয়, বাইরের শ্রেণীর অবজেক্টের রেফারেন্স দিয়ে নয়। এর অর্থ এটি অন্তর্ভুক্তকারী উদাহরণ নেই।

উদাহরণ স্বরূপ:

class A
{
  class B
  {
    // static int x; not allowed here…..    
  }
  static class C
  {
    static int x; // allowed here
  }
}

class Test
{
  public static void main(String str)
  {
    A o=new A();
    A.B obj1 =o.new B();//need of inclosing instance

    A.C obj2 =new A.C();

    // not need of reference of object of outer class….
  }
}

1
'স্ট্যাটিক ইনার' শর্তে একটি বৈপরীত্য। নেস্টেড বর্গ হয় স্থির বা অভ্যন্তরীণ।
ব্যবহারকারী 207421

9

আমি এখানে যুক্ত করার মতো অনেক কিছুই মনে করি না, বেশিরভাগ উত্তরগুলি স্থির নেস্টেড শ্রেণি এবং অভ্যন্তর শ্রেণীর মধ্যে পার্থক্যকে পুরোপুরি ব্যাখ্যা করে। যাইহোক, অভ্যন্তরীণ ক্লাস বনাম নেস্টেড ক্লাসগুলি ব্যবহার করার সময় নিম্নলিখিত সমস্যাটি বিবেচনা করুন। উত্তর দুটি উল্লেখ করার সাথে সাথে অভ্যন্তরীণ ক্লাসগুলি তাদের বন্ধক শ্রেণীর উদাহরণ ছাড়াই ইনস্ট্যান্ট করা যায় না যার অর্থ তারা জিএসসি বাস্তবতার কারণে মেমরির ওভারফ্লো বা স্ট্যাক ওভারফ্লো ব্যতিক্রমকে ডেকে আনতে পারে এমন তাদের ক্লোসিং ক্লাসের উদাহরণটির জন্য একটি পয়েন্টার রাখে the আবদ্ধ ক্লাসগুলি আর ব্যবহার না করা হলেও আবর্জনা সংগ্রহ করতে সক্ষম হবে না। এই পরিষ্কার করার জন্য নিম্নলিখিত কোডটি পরীক্ষা করে দেখুন:

public class Outer {


    public  class Inner {

    }


    public Inner inner(){
        return new Inner();
    }

    @Override
    protected void finalize() throws Throwable {
    // as you know finalize is called by the garbage collector due to destroying an object instance
        System.out.println("I am destroyed !");
    }
}


public static void main(String arg[]) {

    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();

    // out instance is no more used and should be garbage collected !!!
    // However this will not happen as inner instance is still alive i.e used, not null !
    // and outer will be kept in memory until inner is destroyed
    outer = null;

    //
    // inner = null;

    //kick out garbage collector
    System.gc();

}

আপনি যদি // inner = null;প্রোগ্রামটির মন্তব্যটি সরিয়ে ফেলেন তবে " আমি ধ্বংস হয়ে গেছি! " রেখে দেবে, তবে এই মন্তব্যটি রাখলে তা হবে না।
কারণটি হ'ল সাদা অভ্যন্তরীন দৃষ্টান্তটি এখনও জিসি এটি সংগ্রহ করতে পারে না এবং এটি বাহ্যিক উদাহরণগুলিকে রেফারেন্স দেয় (যার একটি পয়েন্টার থাকে) এটি খুব বেশি সংগ্রহ করা হয় না। আপনার প্রকল্পে এই বস্তুর যথেষ্ট পরিমাণে থাকার এবং স্মৃতিশক্তি শেষ হতে পারে।
স্থির অভ্যন্তর শ্রেণীর তুলনায় যা অভ্যন্তর শ্রেণীর উদাহরণগুলিতে কোনও পয়েন্ট রাখে না কারণ এটি উদাহরণ সম্পর্কিত নয় তবে শ্রেণি সম্পর্কিত। উপরের প্রোগ্রামটি " আমি ধ্বংস হয়ে গেছি! " মুদ্রণ করতে পারেন যদি আপনি অভ্যন্তরীণ শ্রেণিকে স্থিতিশীল করেন এবং এর সাথে তাত্ক্ষণিক করে তোলেনOuter.Inner i = new Outer.Inner();



8

নেস্টেড ক্লাস একটি খুব সাধারণ শব্দ: প্রতিটি শ্রেণি যা শীর্ষ স্তরের নয় তা নেস্টেড শ্রেণি। একটি অভ্যন্তর শ্রেণি একটি অ স্থিত নেস্টেড বর্গ। জোসেফ ডারসি নেস্টেড, ইনার, সদস্য, এবং টপ-লেভেল ক্লাস সম্পর্কে খুব সুন্দর ব্যাখ্যা লিখেছেন ।


8

উম্মম ... একটি অভ্যন্তর শ্রেণি একটি নেস্টেড ক্লাস ... আপনি বেনাম শ্রেণি এবং অভ্যন্তর শ্রেণি বলতে চান?

সম্পাদনা করুন: আপনি যদি অভ্যন্তরীণ বনাম বেনামে বোঝাতে চেয়েছিলেন ... তবে একটি অভ্যন্তর শ্রেণি কেবল শ্রেণীর মধ্যে সংজ্ঞায়িত একটি শ্রেণি যেমন:

public class A {
    public class B {
    }
}

বেনামে বেনামে সংজ্ঞায়িত ক্লাসের বর্ধিতাংশের ফলে কোনও প্রকৃত "শ্রেণি নির্ধারিত হয় না, যেমন:

public class A {
}

A anon = new A() { /* you could change behavior of A here */ };

আরও সম্পাদনা:

উইকিপিডিয়া দাবি করেছে যে জাভাতে পার্থক্য রয়েছে, তবে আমি জাভা নিয়ে ৮ বছর ধরে কাজ করছি, এবং এটিই প্রথম শুনলাম যে এইরকম পার্থক্য আছে ... দাবির ব্যাক আপ করার জন্য এখানে কোনও রেফারেন্স নেই উল্লেখ করার জন্য নয় ... নীচে লাইন, একটি অভ্যন্তর শ্রেণি একটি শ্রেণীর মধ্যে সংজ্ঞায়িত একটি শ্রেণি (স্থির বা না), এবং নেস্টেড একই জিনিস বোঝার জন্য কেবল অন্য একটি শব্দ।

স্থিতিশীল এবং অ স্থিত নেস্টেড শ্রেণীর মধ্যে একটি সূক্ষ্ম পার্থক্য আছে ... মূলত অ স্থির অভ্যন্তরীণ শ্রেণীর সংলগ্ন শ্রেণীর উদাহরণ ক্ষেত্র এবং পদ্ধতিগুলির অন্তর্নিহিত অ্যাক্সেস রয়েছে (সুতরাং এগুলি স্থির প্রসঙ্গে তৈরি করা যায় না, এটি সংকলক হবে) ত্রুটি). অন্যদিকে, স্থির নেস্টেড ক্লাসগুলির উদাহরণ ক্ষেত্র এবং পদ্ধতিগুলির মধ্যে অন্তর্নিহিত অ্যাক্সেস নেই এবং স্থির প্রসঙ্গে বিল্ড তৈরি করা যেতে পারে।


3
জাভা ডকুমেন্টেশন অনুসারে, একটি অভ্যন্তরীণ বর্গ এবং একটি স্ট্যাটিক নেস্টেড শ্রেণীর মধ্যে পার্থক্য রয়েছে - স্থির নেস্টেড ক্লাসগুলির তাদের ঘেরযুক্ত শ্রেণির উল্লেখ নেই এবং এটি মূলত সংগঠনের উদ্দেশ্যে ব্যবহৃত হয়। আরও গভীর-বর্ণনার জন্য আপনার জেগশেমেশের জবাবটি দেখতে হবে।
মিপাদি

1
আমি মনে করি অর্থগত পার্থক্য বেশিরভাগ historicalতিহাসিক। আমি যখন একটি সি # -> জাভা 1.1 সংকলক লিখেছি তখন জাভা ভাষার উল্লেখটি খুব স্পষ্ট ছিল: নেস্টেড বর্গ স্থিতিশীল, অভ্যন্তরীণ শ্রেণিটি নেই (এবং এভাবে এটি $ 0 রয়েছে)। যে কোনও হারে এটি বিভ্রান্তিকর এবং আমি আনন্দিত যে এটি আর কোনও সমস্যা নয়।
টমর গ্যাবেল

2
জেএলএস ডকস.অরাকল . com/javase/specs/jls/se8/html/jls - 8.html#jls - 8.1.3 এ "অভ্যন্তরীণ শ্রেণি" সংজ্ঞায়িত করেছে এবং এজন্যই কোনও স্থিতিশীল "অভ্যন্তরীণ" থাকা অসম্ভব জাভা "ক্লাস"। "নেস্টেড" "একই জিনিস বোঝার জন্য কেবলমাত্র অন্য একটি শব্দ" নয় এবং এটি সত্য নয় যে "একটি অভ্যন্তরীণ শ্রেণি একটি শ্রেণীর মধ্যে সংজ্ঞায়িত একটি শ্রেণি (স্থির বা না)" "। এটি সঠিক তথ্য।
লিউ ব্লাচ

6

লক্ষ্যবস্তু শিক্ষানবিশ, যারা জাভা এবং / অথবা নেস্টেড ক্লাসের নবাগত

নেস্টেড ক্লাসগুলি হ'ল:
১. স্ট্যাটিক নেস্টেড ক্লাস।
2. অ স্ট্যাটিক নেস্টেড ক্লাস। ( ইনার ক্লাস নামেও পরিচিত ) => দয়া করে এটি মনে রাখবেন


1. অভ্যন্তরীণ ক্লাস
উদাহরণ:

class OuterClass  {
/*  some code here...*/
     class InnerClass  {  }
/*  some code here...*/
}


অভ্যন্তরীণ ক্লাসগুলি নেস্টেড ক্লাসগুলির সাবসেট:

  • অভ্যন্তর শ্রেণি একটি নির্দিষ্ট ধরণের নেস্টেড বর্গ
  • অভ্যন্তরীণ ক্লাসগুলি নেস্টেড ক্লাসগুলির উপগঠন
  • আপনি বলতে পারেন যে একটি অভ্যন্তর শ্রেণিও একটি নেস্টেড বর্গ, তবে আপনি বলতে পারবেন না যে নেস্টেড বর্গটিও একটি অভ্যন্তর শ্রেণি

অভ্যন্তর শ্রেণীর বিশেষত্ব:

  • অভ্যন্তরীণ শ্রেণীর উদাহরণের বাইরের শ্রেণীর সমস্ত সদস্যের অ্যাক্সেস রয়েছে , এমনকি "ব্যক্তিগত" হিসাবে চিহ্নিত


২.স্ট্যাটিক নেস্টেড ক্লাস:
উদাহরণ:

class EnclosingClass {
  static class Nested {
    void someMethod() { System.out.println("hello SO"); }
  }
}

কেস 1: একটি নন-এনকোলেসিং ক্লাস থেকে একটি স্ট্যাটিক নেস্টেড ক্লাস ইনস্ট্যান্ট করছে

class NonEnclosingClass {

  public static void main(String[] args) {
    /*instantiate the Nested class that is a static
      member of the EnclosingClass class:
    */

    EnclosingClass.Nested n = new EnclosingClass.Nested(); 
    n.someMethod();  //prints out "hello"
  }
}

কেস 2: একটি বদ্ধ ক্লাস থেকে একটি স্ট্যাটিক নেস্টেড ক্লাস ইনস্ট্যান্ট করছে

class EnclosingClass {

  static class Nested {
    void anotherMethod() { System.out.println("hi again"); } 
  }

  public static void main(String[] args) {
    //access enclosed class:

    Nested n = new Nested(); 
    n.anotherMethod();  //prints out "hi again"
  }

}

স্ট্যাটিক ক্লাসগুলির বিশেষত্ব:

  • স্থির অভ্যন্তর শ্রেণীর কেবলমাত্র বহিরাগত শ্রেণীর স্থির সদস্যদের অ্যাক্সেস থাকবে এবং অ স্থিতিশীল সদস্যদের অ্যাক্সেস থাকবে না।

উপসংহার:
প্রশ্ন: জাভাতে একটি অভ্যন্তর শ্রেণি এবং স্থির নেস্টেড শ্রেণীর মধ্যে প্রধান পার্থক্য কী?
উত্তর: উপরে বর্ণিত প্রতিটি শ্রেণীর সুনির্দিষ্ট বিবরণ দিয়ে যান।



6

ইনার ক্লাস এবং নেস্টেড স্ট্যাটিক ক্লাসজাভাতে উভয়ই অন্য শ্রেণীর ভিতরে ঘোষিত ক্লাস, যা জাভা শীর্ষ স্তরের শ্রেণি হিসাবে পরিচিত। জাভা পরিভাষায়, যদি আপনি কোনও নেস্টেড ক্লাস স্ট্যাটিক ঘোষণা করেন তবে এটি জাভাতে নেস্টেড স্ট্যাটিক ক্লাস বলা হবে যখন অ স্ট্যাটিক নেস্টেড ক্লাসকে কেবল ইনার ক্লাস হিসাবে চিহ্নিত করা হয়।

জাভা ইনার ক্লাস কি?

কোনও শ্রেণি যা শীর্ষ স্তরের নয় বা অন্য শ্রেণীর অভ্যন্তরে ঘোষিত হয় সেগুলি নেস্টেড শ্রেণি হিসাবে পরিচিত এবং those নেস্টেড শ্রেণীর মধ্যে যে শ্রেণিটি অ স্থির হিসাবে ঘোষিত হয় সেগুলি জাভার অভ্যন্তর শ্রেণি হিসাবে পরিচিত। জাভাতে তিন ধরণের ইনার ক্লাস রয়েছে:

1) স্থানীয় অভ্যন্তর শ্রেণি - একটি কোড ব্লক বা পদ্ধতির ভিতরে ঘোষণা করা হয়।
2) বেনামি অভ্যন্তর শ্রেণি - এমন একটি শ্রেণী যা রেফারেন্সের নাম নেই এবং যেখানে এটি তৈরি হয় সেখানে একই জায়গায় সূচনা হয়।
3) সদস্য অভ্যন্তরীণ শ্রেণি - বহিরাগত শ্রেণীর অ স্থিতিশীল সদস্য হিসাবে ঘোষিত হয়।

public class InnerClassTest {
    public static void main(String args[]) {      
        //creating local inner class inside method i.e. main() 
        class Local {
            public void name() {
                System.out.println("Example of Local class in Java");

            }
        }      
        //creating instance of local inner class
        Local local = new Local();
        local.name(); //calling method from local inner class

        //Creating anonymous inner class in Java for implementing thread
        Thread anonymous = new Thread(){
            @Override
            public void run(){
                System.out.println("Anonymous class example in java");
            }
        };
        anonymous.start();

        //example of creating instance of inner class
        InnerClassTest test = new InnerClassTest();
        InnerClassTest.Inner inner = test.new Inner();
        inner.name(); //calling method of inner class
    }

     //Creating Inner class in Java
    private class Inner{
        public void name(){
            System.out.println("Inner class example in java");
        }
    }
}

জাভা নেস্টেট স্ট্যাটিক ক্লাস কি?

নেস্টেড স্ট্যাটিক ক্লাস হল আরও একটি ক্লাস যা ক্লাসের ভিতরে সদস্য হিসাবে ঘোষণা করা হয় এবং স্ট্যাটিক করা হয়। নেস্টেড স্ট্যাটিক ক্লাসকে বাইরের শ্রেণির সদস্য হিসাবেও ঘোষণা করা হয় এবং অন্য কোনও সদস্যের মতোই ব্যক্তিগত, পাবলিক বা সুরক্ষিত করা যায়। অভ্যন্তরীণ শ্রেণীর উপরে নেস্টেড স্ট্যাটিক ক্লাসের অন্যতম প্রধান সুবিধা হ'ল নেস্টার্ড স্ট্যাটিক ক্লাসের উদাহরণটি বাইরের শ্রেণীর কোনও সংযুক্তকরণের সাথে সংযুক্ত নয়। আপনার জাভাতে নেস্টেড স্ট্যাটিক ক্লাসের উদাহরণ তৈরি করতে আউটার ক্লাসের কোনও উদাহরণ প্রয়োজন নেই

1) এটি ব্যক্তিগত সহ বাইরের শ্রেণীর স্থিতিশীল ডেটা সদস্যদের অ্যাক্সেস করতে পারে ।
2) স্ট্যাটিক নেস্টেড বর্গ অ স্থিতিশীল (উদাহরণস্বরূপ) ডেটা সদস্য বা পদ্ধতি অ্যাক্সেস করতে পারে না ।

public class NestedStaticExample {
    public static void main(String args[]){  
        StaticNested nested = new StaticNested();
        nested.name();
    }  
    //static nested class in java
    private static class StaticNested{
        public void name(){
            System.out.println("static nested class example in java");
        }
    }
}

রেফ: উদাহরণ সহ জাভায় অভ্যন্তর শ্রেণি এবং নেস্টেড স্ট্যাটিক ক্লাস


2
"স্ট্যাটিক নেস্টেড বর্গ অ স্থিতিশীল (উদাহরণস্বরূপ) ডেটা সদস্য বা পদ্ধতিতে অ্যাক্সেস করতে পারে না" " ভুল, এবং বিভ্রান্তি সৃষ্টি করে । তারা একেবারে ব্যক্তিগত উদাহরণের তথ্য অ্যাক্সেস করতে পারে - তবে তারা সেই উদাহরণটি অ্যাক্সেস করার জন্য কোনও উদাহরণ তৈরি করে। তাদের অভ্যন্তরীণ ক্লাসগুলির মতো কোনও সংযুক্তকরণ উদাহরণ নেই, তবে তাদের ঘেরের ক্লাসের উদাহরণ ব্যক্তিগত সদস্যদের কাছে তাদের অ্যাক্সেস রয়েছে।
টিজে ক্রাউডার

5

আমি মনে করি এখানকার লোকদের পোস্টারের প্রতি লক্ষ্য করা উচিত যে: স্ট্যাটিক নেস্ট ক্লাস কেবল প্রথম প্রথম অভ্যন্তর শ্রেণি। উদাহরণ স্বরূপ:

 public static class A {} //ERROR

 public class A {
     public class B {
         public static class C {} //ERROR
     }
 }

 public class A {
     public static class B {} //COMPILE !!!

 }

সুতরাং, সংক্ষেপে বলুন, স্থির শ্রেণি নির্ভর করে না যে এটিতে কোন শ্রেণি রয়েছে। সুতরাং, তারা সাধারণ শ্রেণিতে পারে না। (কারণ সাধারণ শ্রেণীর জন্য উদাহরণ প্রয়োজন)।


2
এটি সব অযৌক্তিক। এই সমস্ত শোটি হ'ল কোনও অভ্যন্তর শ্রেণিতে স্থির শ্রেণি থাকতে পারে না। নিম্নলিখিত বাক্যটি যেমন 'কোন শ্রেণীর অন্তর্ভুক্ত রয়েছে তা নির্ভর করে না' সম্পর্কিত অংশটি অর্থহীন।
ব্যবহারকারী 207421

5

আমরা যখন কোনও শ্রেণীর অভ্যন্তরে স্থিতিশীল সদস্য শ্রেণি ঘোষণা করি তখন এটি শীর্ষ স্তরের নেস্টেড শ্রেণি বা স্ট্যাটিক নেস্টেড শ্রেণি হিসাবে পরিচিত। এটি নীচে হিসাবে প্রদর্শিত হতে পারে:

class Test{
    private static int x = 1;
        static class A{
        private static int y = 2;
        public static int getZ(){
            return B.z+x;
        }
    }
    static class B{
        private static int z = 3;
        public static int getY(){
            return A.y;
        }
    }
}

class TestDemo{
     public static void main(String[] args){
        Test t = new Test();
        System.out.println(Test.A.getZ());
        System.out.println(Test.B.getY());
    }
}

যখন আমরা ক্লাসের মধ্যে অ স্থিতিশীল সদস্য শ্রেণি ঘোষণা করি তখন এটি অভ্যন্তর শ্রেণি হিসাবে পরিচিত। অভ্যন্তর শ্রেণিটি নীচের মতো প্রদর্শিত হতে পারে:

    class Test{
        private int i = 10;
        class A{
            private int i =20;
            void display(){
            int i = 30;
            System.out.println(i);
            System.out.println(this.i);
            System.out.println(Test.this.i);
        }
    }
}

"আমরা যখন ক্লাসের মধ্যে স্ট্যাটিক মেম্বার ক্লাস ঘোষণা করি তখন এটি শীর্ষ স্তরের নেস্টেড ক্লাস হিসাবে পরিচিত" এটির কোনও মানে হয় না। "একটি শীর্ষ স্তরের শ্রেণি এমন একটি শ্রেণী যা নেস্টেড শ্রেণি নয়" " "শীর্ষ স্তরের নেস্টেড ক্লাস" বলে কিছুই নেই।
রেডিওডেফ 8'18

3

নীচে static nested classএবং এর উদাহরণ রয়েছে inner class:

OuterClass.java

public class OuterClass {
     private String someVariable = "Non Static";

     private static String anotherStaticVariable = "Static";  

     OuterClass(){

     }

     //Nested classes are static
     static class StaticNestedClass{
        private static String privateStaticNestedClassVariable = "Private Static Nested Class Variable"; 

        //can access private variables declared in the outer class
        public static void getPrivateVariableofOuterClass(){
            System.out.println(anotherStaticVariable);
        }
     }

     //non static
     class InnerClass{

         //can access private variables of outer class
         public String getPrivateNonStaticVariableOfOuterClass(){
             return someVariable;
         }
     }

     public static void accessStaticClass(){
         //can access any variable declared inside the Static Nested Class 
         //even if it private
         String var = OuterClass.StaticNestedClass.privateStaticNestedClassVariable; 
         System.out.println(var);
     }

}

OuterClassTest:

public class OuterClassTest {
    public static void main(String[] args) {

        //access the Static Nested Class
        OuterClass.StaticNestedClass.getPrivateVariableofOuterClass();

        //test the private variable declared inside the static nested class
        OuterClass.accessStaticClass();
        /*
         * Inner Class Test
         * */

        //Declaration

        //first instantiate the outer class
        OuterClass outerClass = new OuterClass();

        //then instantiate the inner class
        OuterClass.InnerClass innerClassExample =  outerClass. new InnerClass();

        //test the non static private variable
        System.out.println(innerClassExample.getPrivateNonStaticVariableOfOuterClass()); 

    }

}

3

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

আসুন আমরা নীচের দুটি উদাহরণ একবার দেখে নিই।

স্ট্যাটিক নেস্ট ক্লাস: স্ট্যাটিক নেস্টেড ক্লাস ব্যবহারের একটি ভাল উদাহরণ হ'ল বিল্ডার প্যাটার্ন ( https://dzone.com/articles/design-patterns-the-builder-pattern )।

ব্যাংক অ্যাকাউন্টের জন্য আমরা একটি স্ট্যাটিক নেস্টেড ক্লাস ব্যবহার করি, মূলত এটি কারণেই

  1. স্থির নেস্ট ক্লাসের উদাহরণটি বাইরের শ্রেণীর আগে তৈরি করা যেতে পারে।

  2. বিল্ডার প্যাটার্নে, বিল্ডার হেল্পার ক্লাস যা ব্যাংক অ্যাকাউন্টে তৈরি করতে ব্যবহৃত হয়।

  3. BankAccount.Builder কেবলমাত্র ব্যাংক অ্যাকাউন্টে জড়িত। অন্য কোনও ক্লাস ব্যাংকঅ্যাকউন্ট.বিল্ডারের সাথে সম্পর্কিত নয়। সুতরাং নাম কনভেনশনটি ব্যবহার না করে এগুলি একসাথে করা ভাল better
public class BankAccount {

    private long accountNumber;
    private String owner;
    ...

    public static class Builder {

    private long accountNumber;
    private String owner;
    ...

    static public Builder(long accountNumber) {
        this.accountNumber = accountNumber;
    }

    public Builder withOwner(String owner){
        this.owner = owner;
        return this; 
    }

    ...
    public BankAccount build(){
            BankAccount account = new BankAccount(); 
            account.accountNumber = this.accountNumber;
            account.owner = this.owner;
            ...
            return account;
        }
    }
}

অভ্যন্তর শ্রেণি: একটি ইভেন্ট হ্যান্ডলার সংজ্ঞায়িত করার জন্য অভ্যন্তরীণ ক্লাসগুলির একটি সাধারণ ব্যবহার। https://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html

মাইক্লাসের জন্য, আমরা অভ্যন্তর শ্রেণিটি ব্যবহার করি, মূলত:

  1. ইনার ক্লাস মাইএডাপ্টারের বাইরের শ্রেণীর সদস্য অ্যাক্সেস করতে হবে।

  2. উদাহরণস্বরূপ, মাইএডাপ্টার কেবল মাই ক্লাসের সাথে সম্পর্কিত। অন্য কোনও ক্লাস মাইএডাপ্টার সম্পর্কিত নয়। সুতরাং নাম কনভেনশন না ব্যবহার করে এগুলি একত্রিত করা ভাল

public class MyClass extends Applet {
    ...
        someObject.addMouseListener(new MyAdapter());
    ...
    class MyAdapter extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
            ...// Event listener implementation goes here...
            ...// change some outer class instance property depend on the event
        }
    }
}

2

একটি চিত্র

এখানে চিত্র বর্ণনা লিখুন

static nestedএবং non-static nestedশ্রেণীর মধ্যে প্রধান পার্থক্য হ'ল অ স্থিতিশীল বাইরের শ্রেণীর সদস্যদের অ্যাক্সেস static nested নেই


0

সবার আগে স্ট্যাটিক ক্লাস নামে এই ধরণের শ্রেণি নেই। অভ্যন্তরীণ শ্রেণীর সাথে স্ট্যাটিক সংশোধক ব্যবহার (নেস্টেড ক্লাস নামে পরিচিত) বলে যে এটি আউটার ক্লাসের একটি স্ট্যাটিক সদস্য যার অর্থ আমরা অন্যান্য স্ট্যাটিক সদস্যদের মতো এটিতেও অ্যাক্সেস করতে পারি এবং কোনও ছাড়াই আউটার ক্লাসের উদাহরণ (যা মূলত স্থির লাভের benefit

নেস্টেড ক্লাস এবং নিয়মিত ইনার ক্লাস ব্যবহারের মধ্যে পার্থক্য হ'ল:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();

প্রথমে আমরা আউটস্ক্রাস্ট ইনস্ট্যান্ট করতে পারি তারপরে আমরা ইনারটি অ্যাক্সেস করতে পারি।

তবে ক্লাস যদি নেস্টেড হয় তবে সিনট্যাক্সটি হ'ল:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

যা স্ট্যাটিক সিনট্যাক্সটিকে স্ট্যাটিক কীওয়ার্ডের সাধারণ প্রয়োগ হিসাবে ব্যবহার করে।


1
"... বলে যে এটি আউটার ক্লাসের স্থিতিশীল সদস্য যার অর্থ ....": স্ট্যাটিক নেস্টেড ক্লাসটিকে আউটার ক্লাসের "সদস্য শ্রেণি" হিসাবে ভাবা ভুল হবে না, তবে স্থির ক্ষেত্রের সাথে মিল এবং পদ্ধতিগুলি এখানেই শেষ হয়। একটি স্ট্যাটিক নেস্টেড ক্লাস আউটার ক্লাসের সাথে "সম্পর্কিত" হয় না। প্রায় প্রতিটি ক্ষেত্রেই, স্থিতিশীল নেস্ট ক্লাস হ'ল একটি মুক্ত স্থিতিশীল শীর্ষ স্তরের শ্রেণি যার ক্লাসের সংজ্ঞা প্যাকেজিং সুবিধার জন্য আউটার ক্লাসের অভ্যন্তরে বাসা বেঁধেছে (এবং আশা করি, কারণ নেস্টেড ক্লাস এবং আউটার ক্লাসের মধ্যে একটি যৌক্তিক সমিতি রয়েছে ... যদিও সেখানে এক হওয়ার দরকার নেই)।
স্কটব

1
'স্ট্যাটিক ইনার' শর্তে একটি বৈপরীত্য। প্রথম বাসা বাঁধার স্তরে স্থিত শ্রেণীর উপস্থিতি রয়েছে এবং সংজ্ঞা অনুসারে সেগুলি অভ্যন্তরীণ শ্রেণি নয়। খুবই সন্দিহান.
ব্যবহারকারী 207421

0

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ আপনাকে অন্য শ্রেণীর মধ্যে একটি শ্রেণি সংজ্ঞায়িত করতে দেয়। এই জাতীয় শ্রেণিকে নেস্টেড বর্গ বলা হয় এবং এখানে চিত্রিত করা হয়:

class OuterClass {
...
class NestedClass {
    ...
    }
}

নেস্টেড ক্লাসগুলি দুটি বিভাগে বিভক্ত: স্থির এবং অ-স্থিতিশীল। স্থিত ঘোষিত নেস্টেড ক্লাসগুলিকে স্ট্যাটিক নেস্টেড ক্লাস বলা হয়। অ-স্থির নেস্টেড ক্লাসগুলিকে ইনার ক্লাস বলা হয়। একটি বিষয় যা আমাদের মনে রাখা উচিত তা হ'ল নন-স্ট্যাটিক নেস্টেড ক্লাসগুলি (অভ্যন্তরীণ ক্লাসগুলি) বদ্ধ শ্রেণীর অন্যান্য সদস্যদের অ্যাক্সেস থাকতে পারে, যদিও তারা ব্যক্তিগত হিসাবে ঘোষণা করা হয়। স্ট্যাটিক নেস্টেড ক্লাসগুলি কেবল স্থির হলে ঘের ক্লাসের অন্যান্য সদস্যদের অ্যাক্সেস থাকতে পারে। এটি বাইরের শ্রেণীর অ স্থিতিশীল সদস্যদের অ্যাক্সেস করতে পারে না। শ্রেণি পদ্ধতি এবং ভেরিয়েবলগুলির মতো, একটি স্থির নেস্টেড বর্গ তার বাহ্যিক শ্রেণীর সাথে সম্পর্কিত। উদাহরণস্বরূপ, স্ট্যাটিক নেস্টেড ক্লাসের জন্য একটি অবজেক্ট তৈরি করতে, এই সিনট্যাক্সটি ব্যবহার করুন:

OuterClass.StaticNestedClass nestedObject =
 new OuterClass.StaticNestedClass(); 

একটি অভ্যন্তরীণ বর্গ ইনস্ট্যান্ট করতে, আপনাকে প্রথমে বাইরের শ্রেণিটি ইনস্ট্যান্ট করতে হবে। তারপরে, এই সিনট্যাক্সটি দিয়ে বাইরের অবজেক্টের অভ্যন্তরীণ বস্তুটি তৈরি করুন:

OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();

কেন আমরা নেস্টেড ক্লাস ব্যবহার করি

  1. এটি যৌক্তিকভাবে শ্রেণিবদ্ধ করার একটি উপায় যা কেবলমাত্র এক জায়গায় ব্যবহৃত হয়।
  2. এটি এনক্যাপসুলেশন বৃদ্ধি করে।
  3. এটি আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য কোডের দিকে নিয়ে যেতে পারে।

উত্স: জাভা ™ টিউটোরিয়ালস - নেস্টেড ক্লাসগুলি


-1

পার্থক্যটি হ'ল একটি নেস্টেড বর্গ ঘোষণা যা স্থির হয় তা বদ্ধ শ্রেণীর বাইরেও ইনস্ট্যান্ট করা যেতে পারে।

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

তবে যদি এটি স্থির থাকে, তবে লিঙ্কটি বিদ্যমান নেই, বাইরের ক্ষেত্রগুলি অ্যাক্সেস করা যায় না (অন্য কোনও বস্তুর মতো সাধারণ রেফারেন্স বাদে) এবং তাই আপনি নিজেই নেস্টেড শ্রেণিকে ইনস্ট্যান্ট করতে পারেন।


1
এটি অসত্য। বদ্ধ শ্রেণীর ক্ষেত্রের বাইরে একটি অভ্যন্তর শ্রেণি তৈরির জন্য একটি বিশেষ বাক্য গঠন রয়েছে ax
ব্যবহারকারী 207421

-1

স্থিতিশীল স্থানীয় ক্লাস এবং অ স্থিতিশীল অভ্যন্তর শ্রেণীর তুলনা করা এটি বেশ সহজ,
পার্থক্য:
স্থির স্থানীয় শ্রেণি:
কেবলমাত্র বহিরাগত শ্রেণির স্থির সদস্যদের অ্যাক্সেস করতে পারে।
স্ট্যাটিক ইনিশিয়েলজার
থাকতে পারে না যেখানে এটি ঘোষিত ফাংশনের বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না


-2

আমি বিভিন্ন সম্ভাব্য সঠিক এবং ত্রুটির দৃশ্য চিত্রিত করেছি যা জাভা কোডে ঘটতে পারে।

    class Outter1 {

        String OutStr;

        Outter1(String str) {
            OutStr = str;
        }

        public void NonStaticMethod(String st)  {

            String temp1 = "ashish";
            final String  tempFinal1 = "ashish"; 

            //  below static attribute not permitted
            // static String tempStatic1 = "static";    

            //  below static with final attribute not permitted         
            // static final String  tempStatic1 = "ashish";  

            // synchronized keyword is not permitted below          
            class localInnerNonStatic1 {            

                synchronized    public void innerMethod(String str11) {
                    str11 = temp1 +" sharma";
                    System.out.println("innerMethod ===> "+str11);
                }

                /* 
        //  static method with final not permitted
          public static void innerStaticMethod(String str11) { 

                    str11 = temp1 +" india";
                    System.out.println("innerMethod ===> "+str11);
                }*/
            }

            // static class not permitted below
            //  static class localInnerStatic1 {   }                            

        }

        public static  void StaticMethod(String st)     {

            String temp1 = "ashish";
            final String  tempFinal1 = "ashish"; 

            // static attribute not permitted below
            //static String tempStatic1 = "static";     

            //  static with final attribute not permitted below
            // static final String  tempStatic1 = "ashish";                         

            class localInnerNonStatic1 {
                public void innerMethod(String str11) {
                    str11 = temp1 +" sharma";
                    System.out.println("innerMethod ===> "+str11);
                }

                /*
    // static method with final not permitted
    public static void innerStaticMethod(String str11) {  
                    str11 = temp1 +" india";
                    System.out.println("innerMethod ===> "+str11);
                }*/
            }

            // static class not permitted below
            //  static class localInnerStatic1 {   }    

        }

        // synchronized keyword is not permitted
        static  class inner1 {          

            static String  temp1 = "ashish";
            String  tempNonStatic = "ashish";
            // class localInner1 {

            public void innerMethod(String str11) {
                str11 = temp1 +" sharma";
                str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }

            public static void innerStaticMethod(String str11) {
                //  error in below step
                str11 = temp1 +" india";    
                //str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }
            //}
        }

        //synchronized keyword is not permitted below
        class innerNonStatic1 {             

//This is important we have to keep final with static modifier in non
// static innerclass below
            static final String  temp1 = "ashish";  
            String  tempNonStatic = "ashish";
            // class localInner1 {

            synchronized    public void innerMethod(String str11) {
                tempNonStatic = tempNonStatic +" ...";
                str11 = temp1 +" sharma";
                str11 = str11+ tempNonStatic +" sharma";
                System.out.println("innerMethod ===> "+str11);
            }

            /*
            //  error in below step
            public static void innerStaticMethod(String str11) {   
                            //  error in below step
                            // str11 = tempNonStatic +" india";                     
                            str11 = temp1 +" india";
                            System.out.println("innerMethod ===> "+str11);
                        }*/
                    //}
                }
    }

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