"আসুন একটি নতুন বিষয়ে এগিয়ে যাই। এখন, আমি স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতি নিয়ে আলোচনা করতে চাই।"

"এলি, আমি ইতিমধ্যে স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতি সম্পর্কে শিখেছি। কিন্তু আমি আরো বিস্তারিত জানতে চাই।"

"যখন আমরা একটি ক্লাসে ভেরিয়েবল ঘোষণা করি, তখন আমরা সংজ্ঞায়িত করি যে এই ভেরিয়েবলগুলি একবার তৈরি করা হবে কিনা, অথবা যদি ক্লাসের প্রতিটি উদাহরণের (অবজেক্ট) নিজস্ব কপি থাকবে। ডিফল্টরূপে, প্রতিটি বস্তুর জন্য একটি ভেরিয়েবলের একটি নতুন অনুলিপি তৈরি করা হয়। . এই এটা দেখায় কিভাবে হয়:"

ক্লাস ঘোষণা
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
প্রধান পদ্ধতিতে কোড :
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
স্ক্রীন আউটপুট
Oscar
Missy

"একই শ্রেণীতে (বিড়াল) ঘোষণা করা সত্ত্বেও, ভেরিয়েবল cat1.nameএবং cat2.nameবিভিন্ন মান ধারণ করে কারণ তারা বিভিন্ন বস্তুর উল্লেখ করে।"
"এটা বোধগম্য."
"তবে, একটি ক্লাসের প্রতিটি উদাহরণের জন্য একটি স্ট্যাটিক ভেরিয়েবলের শুধুমাত্র একটি অনুলিপি বিদ্যমান, এবং এটি অবশ্যই ক্লাসের নাম ব্যবহার করে অ্যাক্সেস করতে হবে।"

ক্লাস ঘোষণা
class Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
প্রধান পদ্ধতিতে কোড:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
স্ক্রীন আউটপুট:
0
1
Oscar
Missy
2

"ঠিক আছে, এটিও অর্থপূর্ণ।"

"জাভা পদ্ধতিগুলিকে দুটি বিভাগে বিভক্ত করা হয়েছে৷ ইনস্ট্যান্স পদ্ধতিগুলিকে একটি অবজেক্টের উপর কল করা হয় এবং সেই বস্তুর ডেটাতে অ্যাক্সেস থাকে৷ স্ট্যাটিক পদ্ধতিগুলির সেই অ্যাক্সেস নেই, যেহেতু তাদের কেবলমাত্র কোনও অবজেক্টের রেফারেন্স নেই৷ তবে, তারা উল্লেখ করতে পারে ক্লাসের স্ট্যাটিক ভেরিয়েবল এবং অন্যান্য স্ট্যাটিক পদ্ধতি।

স্ট্যাটিক পদ্ধতিগুলি অ-স্ট্যাটিক পদ্ধতি বা অ-স্ট্যাটিক ভেরিয়েবলগুলিকে সম্বোধন করতে পারে না!"

"এটা কেন, এলি?"

"প্রতিটি ইনস্ট্যান্স ভেরিয়েবল একটি অবজেক্টের মধ্যে থাকে। আপনার কাছে সেই অবজেক্টের একটি রেফারেন্স থাকলেই এটি অ্যাক্সেস করা যেতে পারে। একটি স্ট্যাটিক পদ্ধতিতে এই ধরনের কোন রেফারেন্স পাওয়া যায় না।"

"উদাহরণ পদ্ধতিতে কি এমন একটি রেফারেন্স আছে?"

"হ্যাঁ, এটি ইনস্ট্যান্স পদ্ধতিতে পরোক্ষভাবে পাস করা হয়। যে বস্তুর উপর একটি ইনস্ট্যান্স পদ্ধতি বলা হয় তার একটি রেফারেন্স পরোক্ষভাবে ইনস্ট্যান্স পদ্ধতিতে পাস করা হয়। এই রেফারেন্সটি সংরক্ষণ করে এমন ভেরিয়েবলকে এটি বলা হয় । এটি পদ্ধতিটিকে সর্বদা বস্তুর অ্যাক্সেস করতে দেয়। ডেটা বা একই অবজেক্টে অন্য অ-স্ট্যাটিক পদ্ধতি কল করুন।

বস্তুর রেফারেন্সের পরিবর্তে, নালকে স্ট্যাটিক পদ্ধতিতে পাঠানো হয়। এজন্য তারা অ-স্থির ভেরিয়েবল এবং পদ্ধতিগুলিকে সম্বোধন করতে পারে না। তাদের কাছে এই ভেরিয়েবল এবং পদ্ধতিগুলির সাথে যুক্ত কোনও বস্তুর রেফারেন্স নেই।"

"ঠিক আছে, এলি, আমি বুঝতে পেরেছি।"

"এইভাবে অ-স্ট্যাটিক পদ্ধতিগুলি কাজ করে:

কোডটি কেমন দেখাচ্ছে
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
আসলেই কি হয়
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
আপনি যখন <object> dot <method name> ব্যবহার করে একটি মেথড কল করেন, আপনি আসলে একটি ক্লাস মেথড কল করছেন এবং প্রথম আর্গুমেন্টের মতো একই অবজেক্ট পাস করছেন। পদ্ধতির ভিতরে, বস্তুটিকে 'এই' বলা হয় । পদ্ধতির সমস্ত ক্রিয়াকলাপ এই বস্তু এবং এর ডেটাতে সঞ্চালিত হয়।"

"স্ট্যাটিক পদ্ধতিগুলি কীভাবে কাজ করে তা এখানে:

কোডটি কেমন দেখাচ্ছে
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
আসলেই কি হয়
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
আপনি যখন একটি স্ট্যাটিক পদ্ধতি কল করেন, তখন কোন বস্তু এটিতে পাস হয় না। অন্য কথায়, 'এই' নাল সমান । এই কারণেই একটি স্ট্যাটিক পদ্ধতি নন-স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতিগুলি অ্যাক্সেস করতে পারে না (যেহেতু এটি অ-স্থির পদ্ধতিতে অন্তর্নিহিতভাবে পাস করার কিছুই নেই)।"

"একটি ভেরিয়েবল বা পদ্ধতি স্ট্যাটিক হয় যদি এর সামনে স্ট্যাটিক কীওয়ার্ড থাকে।"

"কেন এই ধরনের পদ্ধতির প্রয়োজন যদি তারা এত গুরুতরভাবে সীমিত হয়?"

"ঠিক আছে, এই ধরনের পদ্ধতির তাদের সুবিধা আছে।"

"প্রথম, স্ট্যাটিক পদ্ধতি এবং ভেরিয়েবল ব্যবহার করার জন্য আমাদের একটি অবজেক্ট রেফারেন্স পাস করতে হবে না। "

"দ্বিতীয়, কখনও কখনও একটি ভেরিয়েবলের একটি এবং শুধুমাত্র একটি কপি থাকা প্রয়োজন। উদাহরণস্বরূপ, System.out (সিস্টেম ক্লাসের স্ট্যাটিক আউট ভেরিয়েবল)।"

"তৃতীয়, কখনও কখনও আপনি বস্তু তৈরি করতে সক্ষম হওয়ার আগে আপনাকে একটি পদ্ধতি কল করতে হবে।"

"এলি, আপনি কি আমাকে এর একটি উদাহরণ দিতে পারেন?"

"কেন আপনি মনে করেন যে main() পদ্ধতিটি স্ট্যাটিক? এটি স্ট্যাটিক তাই প্রোগ্রামার মেমরিতে ক্লাস লোড করার সাথে সাথেই এটিকে কল করতে পারে, কোনো বস্তু তৈরি হওয়ার আগে।"