জাভাতে কোনও অভ্যন্তর শ্রেণি এবং স্থির নেস্টেড শ্রেণীর মধ্যে প্রধান পার্থক্য কী? ডিজাইন / বাস্তবায়ন এর মধ্যে একটি চয়ন করতে ভূমিকা রাখে?
জাভাতে কোনও অভ্যন্তর শ্রেণি এবং স্থির নেস্টেড শ্রেণীর মধ্যে প্রধান পার্থক্য কী? ডিজাইন / বাস্তবায়ন এর মধ্যে একটি চয়ন করতে ভূমিকা রাখে?
উত্তর:
থেকে জাভা টিউটোরিয়াল :
নেস্টেড ক্লাসগুলি দুটি বিভাগে বিভক্ত: স্থির এবং অ-স্থিতিশীল। স্থিত ঘোষিত নেস্টেড ক্লাসগুলিকে কেবল স্ট্যাটিক নেস্টেড ক্লাস বলা হয়। অ-স্থির নেস্টেড ক্লাসগুলিকে ইনার ক্লাস বলে।
স্ট্যাটিক নেস্টেড ক্লাসগুলি বদ্ধ শ্রেণীর নাম ব্যবহার করে অ্যাক্সেস করা হয়:
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() { ... }
করা একটি অভ্যন্তরীণ শ্রেণি এবং এর কোনও সংযুক্তি উদাহরণ নেই।
import OuterClass.StaticNestedClass;
তারপরে ক্লাসটি কেবল আউটারক্লাস হিসাবে উল্লেখ করুন।
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
?
পরিভাষা: নেস্টেড ক্লাসগুলি দুটি বিভাগে বিভক্ত: স্থির এবং অ-স্থিতিশীল। স্থিত ঘোষিত নেস্টেড ক্লাসগুলিকে কেবল স্ট্যাটিক নেস্টেড ক্লাস বলা হয়। অ-স্থির নেস্টেড ক্লাসগুলিকে ইনার ক্লাস বলা হয়।
সাধারণ আলোচনাতে, বেশিরভাগ প্রোগ্রামাররা "নেস্টেড" এবং "ইনার" শব্দের আন্তঃবিন্যাস হিসাবে ব্যবহার করেন তবে আমি "নেস্টেড ক্লাস" শব্দটি ব্যবহার করব যা অভ্যন্তরীণ এবং স্থির উভয়ই জুড়ে।
শ্রেণিগুলিকে নেস্টেড অ্যাড ইনফিনিটাম বলা যেতে পারে, উদাহরণস্বরূপ ক্লাস এ ক্লাস বি ধারণ করতে পারে যা ক্লাস সি ধারণ করে যা ক্লাস ডি ইত্যাদি রয়েছে। তবে, শ্রেণি বাসা বাঁধার একাধিক স্তরের বিরল কারণ এটি সাধারণত খারাপ নকশা হয়।
আপনি নেস্টেড ক্লাস তৈরি করতে পারেন এমন তিনটি কারণ রয়েছে:
আছে জাভা নেস্টেড ক্লাসের চার ধরণের । সংক্ষেপে, তারা হলেন:
আমাকে আরও বিশদ বিবরণ দিন।
স্ট্যাটিক ক্লাসগুলি বোঝার জন্য সহজতম ধরণের কারণ তাদের ধারণক্ষম শ্রেণীর উদাহরণগুলির সাথে কোনও সম্পর্ক নেই।
স্ট্যাটিক ক্লাস হল এমন একটি শ্রেণি যা অন্য শ্রেণীর স্থির সদস্য হিসাবে ঘোষিত হয়। শুধু অন্যান্য স্ট্যাটিক সদস্যদের মত, এই ধরনের একটি বর্গ সত্যিই ঠিক যে ব্যবহারসমূহ তার নামস্থান, যেমন ধারণকারী ক্লাসের মধ্যে জল্লাদ হয় যেমন বর্গ ছাগল শ্রেণীর একটি স্ট্যাটিক সদস্য হিসেবে ঘোষণা গণ্ডার প্যাকেজের মধ্যে পিজা নাম দ্বারা পরিচিত হয় 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*}
এই জাতীয় ঘোষণাটি নামবিহীন শ্রেণীর একটি নতুন উদাহরণ তৈরি করে যা অবজেক্টকে প্রসারিত করে এবং ইন্টারফেসনাম প্রয়োগ করে । আবার আপনি নিজের নির্মাণকারীর সরবরাহ করতে পারবেন না; এই ক্ষেত্রে, জাভা সুস্পষ্টভাবে একটি নো-আরগ, ডু-কিছুই কনস্ট্রাক্টর সরবরাহ করে (তাই এই ক্ষেত্রে কখনও কনস্ট্রাক্টরের যুক্তি থাকতে হবে না)।
যদিও আপনি কোনও বেনামে অভ্যন্তরীণ শ্রেণিকে একটি নির্মাণকারী দিতে পারেন না, আপনি এখনও কোনও ইনিশিয়াল ব্লক (যে কোনও পদ্ধতির বাইরে রাখা একটি ব্লক) ব্যবহার করতে চান কোনও সেটআপ করতে পারেন।
পরিষ্কার হয়ে নিন যে একটি বেনামি অভ্যন্তর শ্রেণি একটি উদাহরণ সহ স্থানীয় আভ্যন্তরীণ শ্রেণি তৈরির সহজতর নমনীয় উপায়। আপনি যদি কোনও স্থানীয় অভ্যন্তরীণ শ্রেণি চান যা একাধিক ইন্টারফেস প্রয়োগ করে বা ইন্টারফেস প্রয়োগ করে যখন অবজেক্ট ব্যতীত অন্য কোনও শ্রেণি প্রসারিত করে বা এটির নিজস্ব নির্মাতা নির্দিষ্ট করে, আপনি একটি নিয়মিত স্থানীয় স্থানীয় অভ্যন্তর শ্রেণি তৈরি করতে আটকে রয়েছেন।
আমি মনে করি না উপরের উত্তরগুলিতে আসল পার্থক্য পরিষ্কার হয়ে গেছে।
শর্তাবলী সঠিকভাবে পেতে প্রথমে:
মার্টিনের উত্তর এখন পর্যন্ত ঠিক আছে। তবে আসল প্রশ্নটি হল: নেস্টেড বর্গ স্থির ঘোষণার উদ্দেশ্য কী?
তুমি ব্যাবহার কর স্থির নেস্টেড ক্লাসগুলি যদি আপনি কেবল নিজের ক্লাসগুলি একত্রে রাখতে চান তবে সেগুলি টপিকালিভাবে একত্রে অন্তর্ভুক্ত থাকে বা যদি নেস্টেড ক্লাসটি একচেটিয়া ক্লাসে একচেটিয়াভাবে ব্যবহৃত হয়। স্ট্যাটিক নেস্টেড ক্লাস এবং অন্যান্য প্রতিটি ক্লাসের মধ্যে কোনও অর্থগত পার্থক্য নেই।
অ-স্থির নেস্টেড ক্লাস একটি আলাদা জন্তু। বেনামে অভ্যন্তর শ্রেণীর মতো, এ জাতীয় নেস্টেড ক্লাসগুলি আসলে ক্লোজার। এর অর্থ তারা তাদের আশেপাশের সুযোগ এবং তাদের সংলগ্ন দৃষ্টান্তটি ক্যাপচার করে এবং এটিকে অ্যাক্সেসযোগ্য করে তোলে। সম্ভবত একটি উদাহরণ এটি পরিষ্কার করে দেবে। একটি ধারকটির এই স্টাবটি দেখুন:
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)
শেষ করার জন্য:
নাম প্রকাশে অনিচ্ছুক একজন বর্গ হয় একটি অ-স্ট্যাটিক নেস্টেড বর্গ যা শুধু এটির সাথে সম্পর্কযুক্ত কোন নাম এবং পরে রেফারেন্সড করা যাবে না একটি নিখুঁত উদাহরণ।
আমি মনে করি যে উপরের উত্তরের কোনও উত্তরই আপনাকে আবেদনের নকশার ক্ষেত্রে নেস্টেড বর্গ এবং একটি স্থির নেস্টেড শ্রেণীর মধ্যে আসল পার্থক্য ব্যাখ্যা করে না:
নেস্টেড ক্লাসটি ননস্ট্যাটিক বা স্ট্যাটিক হতে পারে এবং প্রতিটি ক্ষেত্রেই অন্য শ্রেণীর মধ্যে সংজ্ঞায়িত শ্রেণি হয় । কোনও নেস্টেড বর্গটি কেবল পরিবেষ্টনের ক্লাসে পরিবেশন করার জন্য উপস্থিত থাকতে হবে , যদি কোনও নেস্টেড শ্রেণি অন্য শ্রেণীর দ্বারা (কেবল ঘের লাগানো নয়) দরকারী হয় তবে একটি শীর্ষ স্তরের শ্রেণি হিসাবে ঘোষণা করা উচিত।
ননস্ট্যাটিক নেস্টেড বর্গ : অন্তর্নিহিত শ্রেণীর সংলগ্ন দৃষ্টান্তের সাথে স্পষ্টভাবে যুক্ত, এর অর্থ এই যে এটি ঘেরের উদাহরণের পদ্ধতিগুলি এবং অ্যাক্সেসের ভেরিয়েবলগুলি অ্যাক্সেস করা সম্ভব। ননস্ট্যাটিক নেস্টেড ক্লাসের একটি সাধারণ ব্যবহার হ'ল অ্যাডাপ্টার ক্লাসটি সংজ্ঞায়িত করা।
স্ট্যাটিক নেস্টেড ক্লাস : এনক্লোজিং ক্লাস ইনস্ট্যান্স অ্যাক্সেস করতে পারে না এবং এর জন্য পদ্ধতিগুলি আহ্বান করতে পারে না, তাই নীস্টযুক্ত শ্রেণীর যখন ঘেরের ক্লাসের কোনও অ্যাক্সেসের প্রয়োজন না হয় তখন ব্যবহার করা উচিত। স্ট্যাটিক নেস্টেড ক্লাসের একটি সাধারণ ব্যবহার হ'ল বাইরের অবজেক্টের একটি উপাদান প্রয়োগ করা।
সুতরাং একটি নকশার অবস্থান থেকে উভয়ের মধ্যে প্রধান পার্থক্য হ'ল: ননস্ট্যাটিক নেস্টেড ক্লাস কনটেইনার শ্রেণির উদাহরণ অ্যাক্সেস করতে পারে, যখন স্থির থাকতে পারে না ।
সহজ ভাষায় আমাদের প্রাথমিকভাবে নেস্টেড ক্লাসগুলির প্রয়োজন কারণ জাভা ক্লোজার সরবরাহ করে না।
নেস্টেড ক্লাসগুলি অন্য সংলগ্ন শ্রেণীর দেহের অভ্যন্তরে সংজ্ঞায়িত ক্লাস। এগুলি দুটি ধরণের - স্থির এবং অ-স্থির।
তারা পরিক্ষেপ বর্গ সদস্য হিসেবে গণ্য করা হয়, অত আপনি চারটি এক্সেস নির্দিষ্টকরী কোন নির্দিষ্ট করতে পারেন - 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();
স্ট্যাটিক নেস্টেড ক্লাসের সুবিধা হ'ল এটির জন্য কাজ করার জন্য এটি সমন্বিত বর্গ / শীর্ষ শ্রেণীর কোনও জিনিসের প্রয়োজন নেই। এটি আপনাকে রানটাইমে আপনার অ্যাপ্লিকেশনটির তৈরি সংখ্যাগুলিকে হ্রাস করতে সহায়তা করতে পারে।
OuterClass.Inner2 inner = outer.new Inner2();
চাও?
static inner
পদ হিসাবে একটি বৈপরীত্য হয়।
জাভা অভ্যন্তরীণ বর্গ এবং স্থির নেস্টেড শ্রেণীর মধ্যে মূল পার্থক্য এবং সাদৃশ্য এখানে।
আশা করি এটা সাহায্য করবে!
বেষ্টন বর্গের উদাহরণের সাথে যুক্ত যাতে তা ইনস্ট্যান্ট করতে প্রথমে বাইরের শ্রেণীর উদাহরণ প্রয়োজন ( নতুন কীওয়ার্ডের স্থানটি নোট করুন ):
Outerclass.InnerClass innerObject = outerObject.new Innerclass();
কোনও স্থির সদস্য নিজেই সংজ্ঞায়িত করা যায় না
বাইরের শ্রেণীর উদাহরণ পদ্ধতি বা ক্ষেত্রগুলি অ্যাক্সেস করতে পারে না
বেষ্টন বর্গের কোনও ঘটনার সাথে সম্পর্কিত নয় তাই এটি তাত্পর্যপূর্ণ করার জন্য:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
ওরাকল ডকুমেন্টেশন অনুযায়ী বিভিন্ন কারণ রয়েছে ( সম্পূর্ণ ডকুমেন্টেশন ):
এটি যৌক্তিকভাবে শ্রেণিবদ্ধ করার একটি উপায় যা কেবলমাত্র এক জায়গায় ব্যবহৃত হয়: কোনও শ্রেণি যদি কেবলমাত্র অন্য এক শ্রেণির জন্য দরকারী হয় তবে সেটিকে এই শ্রেণিতে এম্বেড করা এবং দুটিকে একসাথে রাখা যৌক্তিক। এই জাতীয় "সহায়ক শ্রেণি" বাসা বাঁধাই তাদের প্যাকেজটিকে আরও সুচলিত করে তোলে।
এটি এনক্যাপসুলেশন বাড়ায়: দুটি শীর্ষ-স্তরের শ্রেণি, এ এবং বি বিবেচনা করুন, যেখানে বি এর এ সদস্যদের অ্যাক্সেস প্রয়োজন যা অন্যথায় ব্যক্তিগত হিসাবে ঘোষণা করা হবে। এ ক্লাস এ এর মধ্যে ক্লাস বি লুকিয়ে রাখলে এ এর সদস্যদের ব্যক্তিগত ঘোষণা করা যেতে পারে এবং বি এগুলি অ্যাক্সেস করতে পারে। এছাড়াও, খ নিজেই বাইরের বিশ্ব থেকে আড়াল হতে পারে।
এটি আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য কোডের দিকে নিয়ে যেতে পারে: শীর্ষ স্তরের শ্রেণির মধ্যে ছোট ছোট ক্লাসগুলিতে বাসা বাঁধাই কোডটি যেখানে ব্যবহৃত হয় তার কাছাকাছি রাখে।
আমি মনে করি, সাধারণত যে সম্মেলন হয় তা হ'ল:
তবে মনে রাখার মতো আরও কয়েকটি বিষয় হ'ল :
শীর্ষ স্তরের ক্লাস এবং স্ট্যাটিক নেস্টেড ক্লাস অর্থহীনভাবে একই তবে স্ট্যাটিক নেস্টেড ক্লাসের ক্ষেত্রে এটি তার আউটার [প্যারেন্ট] শ্রেণির প্রাইভেট স্ট্যাটিক ফিল্ডস / পদ্ধতিগুলির স্থিতিশীল রেফারেন্স করতে পারে এবং এর বিপরীতে।
অভ্যন্তরীণ ক্লাসগুলিতে বহিরাগত [অভিভাবক] শ্রেণীর সংযুক্তকরণের দৃষ্টান্তের ভেরিয়েবলগুলিতে অ্যাক্সেস রয়েছে। যাইহোক, সমস্ত অভ্যন্তর শ্রেণীর সংলগ্ন দৃষ্টান্ত নেই, উদাহরণস্বরূপ স্থিতিক প্রসঙ্গে অভ্যন্তর শ্রেণি যেমন স্ট্যাটিক আরম্ভকারী ব্লকে ব্যবহৃত বেনাম শ্রেণীর মতো না class
অজ্ঞাতনামা শ্রেণি ডিফল্টরূপে প্যারেন্ট ক্লাসটি প্রসারিত করে বা পিতা-মাতার ইন্টারফেস প্রয়োগ করে এবং অন্য কোনও শ্রেণি বাড়াতে বা আরও কোনও ইন্টারফেস প্রয়োগ করার জন্য আর কোনও ধারা নেই। সুতরাং,
new YourClass(){};
মানে class [Anonymous] extends YourClass {}
new YourInterface(){};
মানে class [Anonymous] implements YourInterface {}
আমি অনুভব করি যে বড় প্রশ্নটি কোনটি কখন ব্যবহার করবেন এবং কখন খোলা থাকবে? ভাল এটি বেশিরভাগের উপর নির্ভর করে আপনি কোন দৃশ্যের সাথে লেনদেন করছেন কিন্তু @ জ্রুডলফের দেওয়া উত্তরটি পড়া আপনাকে কিছু সিদ্ধান্ত নিতে সহায়তা করতে পারে।
নেস্টেড ক্লাস: ক্লাসের ভিতরে ক্লাস
প্রকার:
পার্থক্য:
অ স্থির নেস্টেড শ্রেণি [অভ্যন্তর শ্রেণি]
বহিরাগত শ্রেণীর অবজেক্টের মধ্যে অন-স্ট্যাটিক নেস্টেড ক্লাসের অবজেক্টের অভ্যন্তর শ্রেণীর উপস্থিতি রয়েছে। যাতে বহিরাগত শ্রেণীর ডেটা সদস্য অভ্যন্তর শ্রেণিতে প্রবেশযোগ্য। সুতরাং অভ্যন্তর শ্রেণীর অবজেক্ট তৈরি করতে আমাদের অবশ্যই প্রথম বাহ্যিক শ্রেণীর অবজেক্ট তৈরি করতে হবে।
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);
বাইরের শ্রেণীর উদাহরণ তৈরি করা হলেও অভ্যন্তরীণ শ্রেণীর উদাহরণ তৈরি করা হয়। সুতরাং অভ্যন্তরীণ শ্রেণীর সদস্য এবং পদ্ধতিগুলির বহিরাগত শ্রেণীর উদাহরণ (অবজেক্ট) এর সদস্য এবং পদ্ধতিগুলির অ্যাক্সেস রয়েছে। যখন বাইরের শ্রেণীর উদাহরণটি সুযোগের বাইরে চলে যায়, তখন অভ্যন্তরীণ শ্রেণীর উদাহরণগুলিও উপস্থিত হয়ে যায়।
স্থির নেস্টেড বর্গের একটি দৃ concrete় উদাহরণ নেই। এটি প্রথমবারের মতো ব্যবহার করার সময় কেবল লোড করা হয় (ঠিক যেমন স্থির পদ্ধতির মতো)। এটি একটি সম্পূর্ণ স্বাধীন সত্তা, যার পদ্ধতি এবং ভেরিয়েবলগুলির বাইরের শ্রেণীর উদাহরণগুলিতে কোনও অ্যাক্সেস নেই access
স্ট্যাটিক নেস্টেড ক্লাসগুলি বাইরের অবজেক্টের সাথে মিলিত হয় না, সেগুলি দ্রুত হয় এবং তারা গাদা / স্ট্যাক মেমরি নেয় না, কারণ এই জাতীয় শ্রেণীর উদাহরণ তৈরি করা প্রয়োজনীয় নয়। সুতরাং থাম্বের নিয়মটি হ'ল যথাসম্ভব সীমিত সুযোগ (প্রাইভেট> = শ্রেণী> = সুরক্ষিত> = পাবলিক) সহ স্থির নেস্টেড শ্রেণীর সংজ্ঞা দেওয়ার চেষ্টা করা, এবং তারপরে এটিকে অভ্যন্তরীণ শ্রেণিতে রূপান্তর করা ("স্থিতিশীল" সনাক্তকারীকে অপসারণ করে) এবং আলগা করুন সুযোগ, যদি এটি সত্যিই প্রয়োজন হয়।
নেস্টেড স্থিত শ্রেণীর ব্যবহার সম্পর্কে একটি সূক্ষ্মতা রয়েছে যা কিছু পরিস্থিতিতে কার্যকর হতে পারে।
ক্লাসটি তার নির্মাণকারীর মাধ্যমে ইনস্ট্যান্ট করার আগে স্ট্যাটিক বৈশিষ্ট্যগুলি তত্ক্ষণিত হয়ে যায়, তবে নেস্টেড স্ট্যাটিক ক্লাসের অভ্যন্তরে স্থির বৈশিষ্ট্যগুলি ক্লাসের নির্মাণকারীর আহ্বান না হওয়া পর্যন্ত তত্ক্ষণাতীত বলে মনে হয় না, বা কমপক্ষে বৈশিষ্ট্যগুলি প্রথমে রেফারেন্স হওয়ার পরেও হয় না, এমনকি যদি তারা 'চূড়ান্ত' হিসাবে চিহ্নিত করা হয়।
এই উদাহরণ বিবেচনা করুন:
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 এ দেখছি।
পদগুলি বিনিময়যোগ্যভাবে ব্যবহৃত হয়। আপনি এটি সম্পর্কে সত্যিই গোঁড়া হতে চান, তাহলে আপনি পারে একটি স্ট্যাটিক ভেতরের বর্গ, এক যা কোন এনক্লোজিং উদাহরণস্বরূপ হয়েছে উল্লেখ করতে "নেস্টেড শ্রেণী" নির্ধারণ করুন। কোডে আপনার কাছে এরকম কিছু থাকতে পারে:
public class Outer {
public class Inner {}
public static class Nested {}
}
যদিও এটি আসলে একটি বহুল স্বীকৃত সংজ্ঞা নয়।
উদাহরণ তৈরির ক্ষেত্রে, অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণটি বাইরের শ্রেণীর অবজেক্টের রেফারেন্সের সাথে তৈরি করা হয় যেখানে এটি সংজ্ঞায়িত করা হয়। এর অর্থ এটি অন্তর্ভুক্তকারী উদাহরণ রয়েছে। কিন্তু স্থির অভ্যন্তর শ্রেণীর উদাহরণ বহিরাগত শ্রেণীর রেফারেন্স দিয়ে তৈরি করা হয়, বাইরের শ্রেণীর অবজেক্টের রেফারেন্স দিয়ে নয়। এর অর্থ এটি অন্তর্ভুক্তকারী উদাহরণ নেই।
উদাহরণ স্বরূপ:
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….
}
}
আমি এখানে যুক্ত করার মতো অনেক কিছুই মনে করি না, বেশিরভাগ উত্তরগুলি স্থির নেস্টেড শ্রেণি এবং অভ্যন্তর শ্রেণীর মধ্যে পার্থক্যকে পুরোপুরি ব্যাখ্যা করে। যাইহোক, অভ্যন্তরীণ ক্লাস বনাম নেস্টেড ক্লাসগুলি ব্যবহার করার সময় নিম্নলিখিত সমস্যাটি বিবেচনা করুন। উত্তর দুটি উল্লেখ করার সাথে সাথে অভ্যন্তরীণ ক্লাসগুলি তাদের বন্ধক শ্রেণীর উদাহরণ ছাড়াই ইনস্ট্যান্ট করা যায় না যার অর্থ তারা জিএসসি বাস্তবতার কারণে মেমরির ওভারফ্লো বা স্ট্যাক ওভারফ্লো ব্যতিক্রমকে ডেকে আনতে পারে এমন তাদের ক্লোসিং ক্লাসের উদাহরণটির জন্য একটি পয়েন্টার রাখে 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();
নেস্টেড ক্লাস একটি খুব সাধারণ শব্দ: প্রতিটি শ্রেণি যা শীর্ষ স্তরের নয় তা নেস্টেড শ্রেণি। একটি অভ্যন্তর শ্রেণি একটি অ স্থিত নেস্টেড বর্গ। জোসেফ ডারসি নেস্টেড, ইনার, সদস্য, এবং টপ-লেভেল ক্লাস সম্পর্কে খুব সুন্দর ব্যাখ্যা লিখেছেন ।
উম্মম ... একটি অভ্যন্তর শ্রেণি একটি নেস্টেড ক্লাস ... আপনি বেনাম শ্রেণি এবং অভ্যন্তর শ্রেণি বলতে চান?
সম্পাদনা করুন: আপনি যদি অভ্যন্তরীণ বনাম বেনামে বোঝাতে চেয়েছিলেন ... তবে একটি অভ্যন্তর শ্রেণি কেবল শ্রেণীর মধ্যে সংজ্ঞায়িত একটি শ্রেণি যেমন:
public class A {
public class B {
}
}
বেনামে বেনামে সংজ্ঞায়িত ক্লাসের বর্ধিতাংশের ফলে কোনও প্রকৃত "শ্রেণি নির্ধারিত হয় না, যেমন:
public class A {
}
A anon = new A() { /* you could change behavior of A here */ };
আরও সম্পাদনা:
উইকিপিডিয়া দাবি করেছে যে জাভাতে পার্থক্য রয়েছে, তবে আমি জাভা নিয়ে ৮ বছর ধরে কাজ করছি, এবং এটিই প্রথম শুনলাম যে এইরকম পার্থক্য আছে ... দাবির ব্যাক আপ করার জন্য এখানে কোনও রেফারেন্স নেই উল্লেখ করার জন্য নয় ... নীচে লাইন, একটি অভ্যন্তর শ্রেণি একটি শ্রেণীর মধ্যে সংজ্ঞায়িত একটি শ্রেণি (স্থির বা না), এবং নেস্টেড একই জিনিস বোঝার জন্য কেবল অন্য একটি শব্দ।
স্থিতিশীল এবং অ স্থিত নেস্টেড শ্রেণীর মধ্যে একটি সূক্ষ্ম পার্থক্য আছে ... মূলত অ স্থির অভ্যন্তরীণ শ্রেণীর সংলগ্ন শ্রেণীর উদাহরণ ক্ষেত্র এবং পদ্ধতিগুলির অন্তর্নিহিত অ্যাক্সেস রয়েছে (সুতরাং এগুলি স্থির প্রসঙ্গে তৈরি করা যায় না, এটি সংকলক হবে) ত্রুটি). অন্যদিকে, স্থির নেস্টেড ক্লাসগুলির উদাহরণ ক্ষেত্র এবং পদ্ধতিগুলির মধ্যে অন্তর্নিহিত অ্যাক্সেস নেই এবং স্থির প্রসঙ্গে বিল্ড তৈরি করা যেতে পারে।
লক্ষ্যবস্তু শিক্ষানবিশ, যারা জাভা এবং / অথবা নেস্টেড ক্লাসের নবাগত
নেস্টেড ক্লাসগুলি হ'ল:
১. স্ট্যাটিক নেস্টেড ক্লাস।
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"
}
}
স্ট্যাটিক ক্লাসগুলির বিশেষত্ব:
উপসংহার:
প্রশ্ন: জাভাতে একটি অভ্যন্তর শ্রেণি এবং স্থির নেস্টেড শ্রেণীর মধ্যে প্রধান পার্থক্য কী?
উত্তর: উপরে বর্ণিত প্রতিটি শ্রেণীর সুনির্দিষ্ট বিবরণ দিয়ে যান।
ইনার ক্লাস এবং নেস্টেড স্ট্যাটিক ক্লাসজাভাতে উভয়ই অন্য শ্রেণীর ভিতরে ঘোষিত ক্লাস, যা জাভা শীর্ষ স্তরের শ্রেণি হিসাবে পরিচিত। জাভা পরিভাষায়, যদি আপনি কোনও নেস্টেড ক্লাস স্ট্যাটিক ঘোষণা করেন তবে এটি জাভাতে নেস্টেড স্ট্যাটিক ক্লাস বলা হবে যখন অ স্ট্যাটিক নেস্টেড ক্লাসকে কেবল ইনার ক্লাস হিসাবে চিহ্নিত করা হয়।
জাভা ইনার ক্লাস কি?
কোনও শ্রেণি যা শীর্ষ স্তরের নয় বা অন্য শ্রেণীর অভ্যন্তরে ঘোষিত হয় সেগুলি নেস্টেড শ্রেণি হিসাবে পরিচিত এবং 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");
}
}
}
রেফ: উদাহরণ সহ জাভায় অভ্যন্তর শ্রেণি এবং নেস্টেড স্ট্যাটিক ক্লাস
আমি মনে করি এখানকার লোকদের পোস্টারের প্রতি লক্ষ্য করা উচিত যে: স্ট্যাটিক নেস্ট ক্লাস কেবল প্রথম প্রথম অভ্যন্তর শ্রেণি। উদাহরণ স্বরূপ:
public static class A {} //ERROR
public class A {
public class B {
public static class C {} //ERROR
}
}
public class A {
public static class B {} //COMPILE !!!
}
সুতরাং, সংক্ষেপে বলুন, স্থির শ্রেণি নির্ভর করে না যে এটিতে কোন শ্রেণি রয়েছে। সুতরাং, তারা সাধারণ শ্রেণিতে পারে না। (কারণ সাধারণ শ্রেণীর জন্য উদাহরণ প্রয়োজন)।
আমরা যখন কোনও শ্রেণীর অভ্যন্তরে স্থিতিশীল সদস্য শ্রেণি ঘোষণা করি তখন এটি শীর্ষ স্তরের নেস্টেড শ্রেণি বা স্ট্যাটিক নেস্টেড শ্রেণি হিসাবে পরিচিত। এটি নীচে হিসাবে প্রদর্শিত হতে পারে:
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);
}
}
}
নীচে 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());
}
}
আমি মনে করি যে উপরের উত্তরগুলির মধ্যে কোনটিই আপনাকে আবেদনের নকশার মেয়াদে নেস্টেড বর্গ এবং একটি স্থির নেস্টেড শ্রেণীর মধ্যে পার্থক্যটির প্রকৃত উদাহরণ দেয় না। এবং স্থির নেস্টেড বর্গ এবং অভ্যন্তর শ্রেণীর মধ্যে প্রধান পার্থক্য হ'ল বাইরের শ্রেণীর উদাহরণ ক্ষেত্রটি অ্যাক্সেস করার ক্ষমতা।
আসুন আমরা নীচের দুটি উদাহরণ একবার দেখে নিই।
স্ট্যাটিক নেস্ট ক্লাস: স্ট্যাটিক নেস্টেড ক্লাস ব্যবহারের একটি ভাল উদাহরণ হ'ল বিল্ডার প্যাটার্ন ( https://dzone.com/articles/design-patterns-the-builder-pattern )।
ব্যাংক অ্যাকাউন্টের জন্য আমরা একটি স্ট্যাটিক নেস্টেড ক্লাস ব্যবহার করি, মূলত এটি কারণেই
স্থির নেস্ট ক্লাসের উদাহরণটি বাইরের শ্রেণীর আগে তৈরি করা যেতে পারে।
বিল্ডার প্যাটার্নে, বিল্ডার হেল্পার ক্লাস যা ব্যাংক অ্যাকাউন্টে তৈরি করতে ব্যবহৃত হয়।
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
মাইক্লাসের জন্য, আমরা অভ্যন্তর শ্রেণিটি ব্যবহার করি, মূলত:
ইনার ক্লাস মাইএডাপ্টারের বাইরের শ্রেণীর সদস্য অ্যাক্সেস করতে হবে।
উদাহরণস্বরূপ, মাইএডাপ্টার কেবল মাই ক্লাসের সাথে সম্পর্কিত। অন্য কোনও ক্লাস মাইএডাপ্টার সম্পর্কিত নয়। সুতরাং নাম কনভেনশন না ব্যবহার করে এগুলি একত্রিত করা ভাল
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
}
}
}
সবার আগে স্ট্যাটিক ক্লাস নামে এই ধরণের শ্রেণি নেই। অভ্যন্তরীণ শ্রেণীর সাথে স্ট্যাটিক সংশোধক ব্যবহার (নেস্টেড ক্লাস নামে পরিচিত) বলে যে এটি আউটার ক্লাসের একটি স্ট্যাটিক সদস্য যার অর্থ আমরা অন্যান্য স্ট্যাটিক সদস্যদের মতো এটিতেও অ্যাক্সেস করতে পারি এবং কোনও ছাড়াই আউটার ক্লাসের উদাহরণ (যা মূলত স্থির লাভের benefit
নেস্টেড ক্লাস এবং নিয়মিত ইনার ক্লাস ব্যবহারের মধ্যে পার্থক্য হ'ল:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
প্রথমে আমরা আউটস্ক্রাস্ট ইনস্ট্যান্ট করতে পারি তারপরে আমরা ইনারটি অ্যাক্সেস করতে পারি।
তবে ক্লাস যদি নেস্টেড হয় তবে সিনট্যাক্সটি হ'ল:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
যা স্ট্যাটিক সিনট্যাক্সটিকে স্ট্যাটিক কীওয়ার্ডের সাধারণ প্রয়োগ হিসাবে ব্যবহার করে।
জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ আপনাকে অন্য শ্রেণীর মধ্যে একটি শ্রেণি সংজ্ঞায়িত করতে দেয়। এই জাতীয় শ্রেণিকে নেস্টেড বর্গ বলা হয় এবং এখানে চিত্রিত করা হয়:
class OuterClass {
...
class NestedClass {
...
}
}
নেস্টেড ক্লাসগুলি দুটি বিভাগে বিভক্ত: স্থির এবং অ-স্থিতিশীল। স্থিত ঘোষিত নেস্টেড ক্লাসগুলিকে স্ট্যাটিক নেস্টেড ক্লাস বলা হয়। অ-স্থির নেস্টেড ক্লাসগুলিকে ইনার ক্লাস বলা হয়। একটি বিষয় যা আমাদের মনে রাখা উচিত তা হ'ল নন-স্ট্যাটিক নেস্টেড ক্লাসগুলি (অভ্যন্তরীণ ক্লাসগুলি) বদ্ধ শ্রেণীর অন্যান্য সদস্যদের অ্যাক্সেস থাকতে পারে, যদিও তারা ব্যক্তিগত হিসাবে ঘোষণা করা হয়। স্ট্যাটিক নেস্টেড ক্লাসগুলি কেবল স্থির হলে ঘের ক্লাসের অন্যান্য সদস্যদের অ্যাক্সেস থাকতে পারে। এটি বাইরের শ্রেণীর অ স্থিতিশীল সদস্যদের অ্যাক্সেস করতে পারে না। শ্রেণি পদ্ধতি এবং ভেরিয়েবলগুলির মতো, একটি স্থির নেস্টেড বর্গ তার বাহ্যিক শ্রেণীর সাথে সম্পর্কিত। উদাহরণস্বরূপ, স্ট্যাটিক নেস্টেড ক্লাসের জন্য একটি অবজেক্ট তৈরি করতে, এই সিনট্যাক্সটি ব্যবহার করুন:
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
একটি অভ্যন্তরীণ বর্গ ইনস্ট্যান্ট করতে, আপনাকে প্রথমে বাইরের শ্রেণিটি ইনস্ট্যান্ট করতে হবে। তারপরে, এই সিনট্যাক্সটি দিয়ে বাইরের অবজেক্টের অভ্যন্তরীণ বস্তুটি তৈরি করুন:
OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
কেন আমরা নেস্টেড ক্লাস ব্যবহার করি
পার্থক্যটি হ'ল একটি নেস্টেড বর্গ ঘোষণা যা স্থির হয় তা বদ্ধ শ্রেণীর বাইরেও ইনস্ট্যান্ট করা যেতে পারে।
যখন আপনার কোনও নেস্টেড বর্গ ঘোষণা আছে যা স্থির নয় , এটি একটি অভ্যন্তর শ্রেণি হিসাবেও পরিচিত , জাভা আপনাকে ঘেরের ক্লাসের মাধ্যমে বাদ দিয়ে তা ইনস্ট্যান্ট করতে দেবে না। অভ্যন্তরীণ শ্রেণীর বাইরে তৈরি বস্তুটি বাইরের শ্রেণি থেকে তৈরি বস্তুর সাথে যুক্ত, সুতরাং অভ্যন্তরীণ শ্রেণি বাইরের ক্ষেত্রগুলি উল্লেখ করতে পারে।
তবে যদি এটি স্থির থাকে, তবে লিঙ্কটি বিদ্যমান নেই, বাইরের ক্ষেত্রগুলি অ্যাক্সেস করা যায় না (অন্য কোনও বস্তুর মতো সাধারণ রেফারেন্স বাদে) এবং তাই আপনি নিজেই নেস্টেড শ্রেণিকে ইনস্ট্যান্ট করতে পারেন।
আমি বিভিন্ন সম্ভাব্য সঠিক এবং ত্রুটির দৃশ্য চিত্রিত করেছি যা জাভা কোডে ঘটতে পারে।
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);
}*/
//}
}
}
item 22 : Favor static member classes over non static