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


public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
public static int getMaxPassengersCount() {
return maxPassengersCount;
}
}
}

Boeing737
বাইরের শ্রেণী রয়েছে, যা এই ধরনের একটি বিমানকে প্রতিনিধিত্ব করে। এটিতে একটি প্যারামিটার সহ একটি কনস্ট্রাক্টর রয়েছে: উত্পাদনের বছর ( int manufactureYear
)। এছাড়াও একটি স্ট্যাটিক পরিবর্তনশীল রয়েছে: যাত্রীদের সর্বাধিক সংখ্যা ( int maxPassengersCount
)। এটি একই মডেলের সমস্ত প্লেনের জন্য একই মান থাকবে, তাই আমাদের শুধুমাত্র একটি উদাহরণ প্রয়োজন। অতিরিক্তভাবে, এর একটি স্ট্যাটিক নেস্টেড ক্লাস রয়েছে: Drawing
(বিমানটির ইঞ্জিনিয়ারিং ব্লুপ্রিন্টের প্রতিনিধিত্ব করে)। আমরা বিমান সম্পর্কে সমস্ত অফিসিয়াল তথ্য এনক্যাপসুলেট করতে এই ক্লাসটি ব্যবহার করি। আমাদের উদাহরণে, সরলতার জন্য, আমরা এই শ্রেণীটিকে উৎপাদনের বছরের মধ্যে সীমাবদ্ধ করেছি, কিন্তু এতে অন্যান্য অনেক তথ্য থাকতে পারে। 
Drawing
ক্লাসের একটি বস্তু বাইরের শ্রেণীর একটি নির্দিষ্ট উদাহরণের একটি রেফারেন্স সংরক্ষণ করে না। শেষ পাঠ থেকে সাইকেল উদাহরণ মনে রাখবেন:
public class Bicycle {
private String model;
private int maxWeight;
public Bicycle(String model, int maxWeight) {
this.model = model;
this.maxWeight = maxWeight;
}
public void start() {
System.out.println("Let's go!");
}
public class Handlebar {
public void right() {
System.out.println("Steer right!");
}
public void left() {
System.out.println("Steer left!");
}
}
}
সেই পাঠে, আমরা এই সত্যটি সম্পর্কে কথা বলেছিলাম যে অভ্যন্তরীণ শ্রেণীর প্রতিটি উদাহরণ , আমাদের কাছে অদৃশ্যভাবে, বাইরের শ্রেণীর Handlebar
উদাহরণের একটি রেফারেন্স পাস করে । Bicycle
বাহ্যিক শ্রেণীর একটি উদাহরণ ছাড়া, অভ্যন্তরীণ শ্রেণীর একটি বস্তু কেবল বিদ্যমান থাকতে পারে না। স্ট্যাটিক নেস্টেড ক্লাসের জন্য, এটি এমন নয়। একটি স্ট্যাটিক নেস্টেড ক্লাসের একটি অবজেক্ট সম্পূর্ণরূপে নিজস্বভাবে বিদ্যমান থাকতে সক্ষম। এই ক্ষেত্রে, স্ট্যাটিক ক্লাসগুলি অ-স্ট্যাটিক থেকে বেশি "স্বাধীন"। আপনাকে শুধুমাত্র একটি জিনিস জানতে হবে যে এই ধরনের একটি বস্তু তৈরি করার সময়, আপনাকে অবশ্যই বাইরের শ্রেণীর নাম উল্লেখ করতে হবে:
public class Main {
public static void main(String[] args) {
Boeing737.Drawing drawing1 = new Boeing737.Drawing();
Boeing737.Drawing drawing2 = new Boeing737.Drawing();
}
}
কেন আমরা ক্লাসটিকে স্ট্যাটিক করেছিলাম Drawing
যখন শেষ পাঠে আমরা তৈরি করেছিলামSeat
বর্গ (সাইকেলের আসন প্রতিনিধিত্ব করে) নন-স্ট্যাটিক? গতবারের মতো, উদাহরণটি বোঝার জন্য একটু "দর্শন" যোগ করা যাক :) একটি সাইকেলের আসনের বিপরীতে, একটি ইঞ্জিনিয়ারিং অঙ্কনের ধারণাটি একটি বিমানের ধারণার সাথে কঠোরভাবে আবদ্ধ নয়। একটি সাইকেল ছাড়া, একটি পৃথক সাইকেল আসন বস্তু প্রায়শই অর্থহীন হবে (যদিও সর্বদা নয়, আমরা শেষ পাঠে এটি সম্পর্কে কথা বলেছি)। একটি প্রকৌশল অঙ্কন ধারণা তার নিজস্ব অর্থে তোলে. উদাহরণস্বরূপ, এটি বিমান রক্ষণাবেক্ষণের পরিকল্পনা প্রকৌশলীদের জন্য উপযোগী হতে পারে। প্ল্যানটি তৈরি করতে বিমানের প্রয়োজন নেই এবং এটি যেকোনো জায়গায় অবস্থিত হতে পারে। শুধুমাত্র ইঞ্জিনিয়ারিং অঙ্কন প্রয়োজন. উপরন্তু, একই মডেলের সমস্ত বিমানের একই প্রকৌশলী অঙ্কন থাকবে, তাই সাইকেলের আসনের সাথে বিদ্যমান তেমন কোন টাইট সম্পর্ক নেই। অতএব, কDrawing
বস্তুর একটি নির্দিষ্ট বিমান বস্তুর একটি রেফারেন্স প্রয়োজন হয় না. 2. বহিরাগত শ্রেণীর ভেরিয়েবল এবং পদ্ধতিতে বিভিন্ন অ্যাক্সেস। একটি স্ট্যাটিক নেস্টেড ক্লাস শুধুমাত্র বাইরের ক্লাসের স্ট্যাটিক ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারে। আমাদের উদাহরণে, Drawing
ক্লাসের একটি পদ্ধতি রয়েছে যা বাইরের শ্রেণীর getMaxPassengersCount()
স্ট্যাটিক ভেরিয়েবলের মান প্রদান করে । যাইহোক, আমরা এর মান ফেরত দেওয়ার জন্য ক্লাসে একটি পদ্ধতি maxPassengersCount
তৈরি করতে পারি না । সর্বোপরি, ভেরিয়েবলটি অ-স্থির, যার মানে এটি অবশ্যই একটি নির্দিষ্ট উদাহরণের অন্তর্গত । এবং আমরা ইতিমধ্যে আবিষ্কার করেছি, স্ট্যাটিক নেস্টেড ক্লাসের ক্ষেত্রে, বাইরের শ্রেণীর বস্তুটি সহজেই অনুপস্থিত হতে পারে। তাই, সীমাবদ্ধতা :) বাইরের শ্রেণীতে স্ট্যাটিক ভেরিয়েবলের কোন অ্যাক্সেস মডিফায়ার আছে তা বিবেচ্য নয়। তাও যদি হয়getManufactureYear()
Drawing
manufactureYear
manufactureYear
Boeing737
private
, একটি স্ট্যাটিক নেস্টেড ক্লাসের এখনও অ্যাক্সেস থাকবে। উপরের সবগুলি শুধুমাত্র স্ট্যাটিক ভেরিয়েবল অ্যাক্সেসের জন্য নয়, স্ট্যাটিক পদ্ধতিতেও প্রযোজ্য। গুরুত্বপূর্ণ! একটি অভ্যন্তরীণ শ্রেণীর ঘোষণায়, static
কীওয়ার্ডের অর্থ এই নয় যে আপনি শুধুমাত্র একটি বস্তু তৈরি করতে পারেন। ভেরিয়েবলের সাথে বস্তুকে বিভ্রান্ত করবেন না। যদি আমরা স্ট্যাটিক ভেরিয়েবল সম্পর্কে কথা বলি, তাহলে, হ্যাঁ, একটি স্ট্যাটিক ক্লাস ভেরিয়েবলের একটি একক উদাহরণ রয়েছে, উদাহরণস্বরূপ, maxPassangersCount
. কিন্তু যখন static
একটি নেস্টেড শ্রেণীতে প্রয়োগ করা হয়, তখন এর অর্থ কেবলমাত্র এর বস্তুতে বাইরের শ্রেণীর বস্তুর উল্লেখ থাকে না। এবং আমরা যতগুলি চাই ততগুলি বস্তু নিজেরাই তৈরি করতে পারি:
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
private int id;
public Drawing(int id) {
this.id = id;
}
public static int getPassengersCount() {
return maxPassengersCount;
}
@Override
public String toString() {
return "Drawing{" +
"id=" + id +
'}';
}
public static void main(String[] args) {
for (int i = 1; i < 6; i++) {
Boeing737.Drawing drawing = new Boeing737.Drawing(i);
System.out.println(drawing);
}
}
}
}
আমরা main()
পদ্ধতিটি সরাসরি নেস্টেড ক্লাসে ঘোষণা করেছি (এর জন্য কোন বিশেষ কারণ নেই — শুধুমাত্র আপনাকে জানানোর জন্য যে এটি সম্ভব), এবং 5টি Drawing
অবজেক্ট তৈরি করেছি। আমরা বাইরের শ্রেণীর একটি একক বস্তু নেই যে সত্ত্বেও. আপনি দেখতে পাচ্ছেন, এটি কোন সমস্যা তৈরি করেনি :) কনসোল আউটপুট:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
এবং যে আমাদের পাঠ শেষ! ঠিক সেক্ষেত্রে, আমি আপনাকে ওরাকল ডকুমেন্টেশনে তাদের সম্পর্কে বিভাগের একটি লিঙ্ক ছেড়ে দেব । যদি কিছু এখনও অস্পষ্ট থেকে যায়, এটি পড়ুন। এখন আমার জন্য কিছু কাজ সমাধান করার সময়! :)
GO TO FULL VERSION