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

"তবুও, তার পাঠ দরকারী।"

"হ্যাঁ। আমি বলতে চাচ্ছি, আমরা আশা করি তারা আছে। আপনি যে বিষয়ের প্রতি যত বেশি দৃষ্টিভঙ্গি শুনবেন, আপনি সত্যের তত কাছাকাছি যাবেন। আপনি যখন একটি মাত্র শুনবেন, তখন আপনি যা করতে পারেন তা হল এটি বিশ্বাস করা বা অবিশ্বাস করা। ঠিক আছে, আসুন ব্যবসায় ফিরে যান।"

"আসুন একটি ছবি দেখি যা আমি আপনাকে আগে দেখিয়েছি।"

┏
┃public class Variables
┃┏
┃┃{
┃┃   private static String TEXT = "The end.";
┃┃  ┗━━━━━━━━━━━━━━━━━━━┛
┃┃   public static void main (String[] args)
┃┃ ┏                         ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃    System.out.println("Hi");
┃┃ ┃    String s = "Hi!";
┃┃ ┃  ┏┗━━━━┛
┃┃ ┃  ┃ System.out.println(s);
┃┃ ┃  ┃ if (args != NULL)
┃┃ ┃  ┃ {
┃┃ ┃  ┃    String s2 = s;
┃┃ ┃  ┃   ┗━━━━┛
┃┃ ┃  ┃  ┏
┃┃ ┃  ┃  ┃ System.out.println(s2);
┃┃ ┃  ┃  ┗
┃┃ ┃  ┃ }
┃┃ ┃  ┃ Variables variables = new Variables();
┃┃ ┃  ┃ System.out.println(variables.instanceVariable);
┃┃ ┃  ┃ System.out.println(TEXT);
┃┃ ┃  ┗
┃┃ ┃ }
┃┃ ┗
┃┃   public String instanceVariable;
┃┃  ┗━━━━━━━━━━━━━━━┛
┃┃   public Variables()
┃┃   {
┃┃      instanceVariable = "Instance variable test.";
┃┃   }
┃┃}
┃┗
┗

1. একটি পদ্ধতিতে ঘোষিত একটি পরিবর্তনশীল তার ঘোষণার শুরু থেকে পদ্ধতির শেষ পর্যন্ত বিদ্যমান (দৃশ্যমান)।

2. কোড ব্লকে ঘোষিত একটি ভেরিয়েবল কোড ব্লকের শেষ না হওয়া পর্যন্ত বিদ্যমান থাকে।

3. পদ্ধতিটি ফিরে না আসা পর্যন্ত একটি পদ্ধতির পরামিতি বিদ্যমান থাকে।

4. একটি বস্তুর মধ্যে ভেরিয়েবলগুলি সেই বস্তুর সমগ্র জীবদ্দশায় বিদ্যমান থাকে যা সেগুলিকে ধারণ করে। তাদের দৃশ্যমানতা বিশেষ অ্যাক্সেস মডিফায়ার দ্বারা নিয়ন্ত্রিত হয়।

5. স্থির (শ্রেণি) ভেরিয়েবলগুলি প্রোগ্রামটি চলার সময় উপস্থিত থাকে। তাদের দৃশ্যমানতা অ্যাক্সেস মডিফায়ার দ্বারাও সংজ্ঞায়িত করা হয়।"

"ঠিক আছে। এই ছবিটি মনে আছে।"

"দারুণ। আমাকে কিছু মূল পয়েন্ট সম্পর্কে আপনাকে মনে করিয়ে দিতে দিন।"

"পদ্ধতির অভ্যন্তরে ঘোষিত সমস্ত ভেরিয়েবল বিদ্যমান (দৃশ্যমান) যেখানে তারা পদ্ধতির শেষ অবধি ঘোষণা করা হয় (উদাহরণ 1)।"

"যদি একটি কোড ব্লকে একটি ভেরিয়েবল ঘোষণা করা হয়, এটি কোড ব্লকের শেষ পর্যন্ত বিদ্যমান থাকে (উদাহরণ 2)।"

"যদি একটি ভেরিয়েবল একটি পদ্ধতির প্যারামিটার হয়, তবে এটি পদ্ধতির সমগ্র অংশে বিদ্যমান (দৃশ্যমান) (উদাহরণ 3)।"

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

"যদি একটি ভেরিয়েবলকে স্ট্যাটিক ঘোষণা করা হয়, অর্থাৎ static কীওয়ার্ড দিয়ে চিহ্নিত করা হয় , তাহলে এটি ততক্ষণ পর্যন্ত বিদ্যমান থাকে যতক্ষণ না এর ক্লাস বিদ্যমান থাকে। JVM সাধারণত একটি ক্লাসকে তার প্রথম ব্যবহারে মেমরিতে লোড করে। স্ট্যাটিক ভেরিয়েবলের আরম্ভ করার সময় এটিও হয়।"

পরিবর্তনশীল সুযোগ সম্পর্কে আরও - 1

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

s"আমরা ভেরিয়েবল স্ট্যাটিক ঘোষণা করলে কি হবে :"

পরিবর্তনশীল সুযোগ সম্পর্কে আরও - 2

"ঠিক আছে। আমি মনে করি আমি বুঝতে পেরেছি।"

"আপনি কি একই নামের ভেরিয়েবল ঘোষণা করতে পারেন?"

"একটি পদ্ধতির ভিতরে নয়। একটি পদ্ধতির ভিতরে ঘোষিত সমস্ত ভেরিয়েবলের অনন্য নাম থাকতে হবে। একটি পদ্ধতির আর্গুমেন্টগুলিকে স্থানীয় ভেরিয়েবল হিসাবে বিবেচনা করা হয়।"

"সদস্য ভেরিয়েবল সম্পর্কে কি?"

"সদস্য ভেরিয়েবল অবশ্যই প্রতিটি শ্রেণীর জন্য অনন্য হতে হবে।"

"কিন্তু একটি ব্যতিক্রম আছে: স্থানীয় ভেরিয়েবল এবং সদস্য ভেরিয়েবলের নাম অভিন্ন হতে পারে। "

"যদি আমরা এই ধরনের একটি পরিবর্তনশীল পরিবর্তন করি, তাহলে অভিন্ন নামে দুটি ভেরিয়েবলের মধ্যে কোনটি পরিবর্তন হবে?"

"যদি আমাদের কোডে বেশ কয়েকটি দৃশ্যমান (অ্যাক্সেসযোগ্য) ভেরিয়েবল থাকে - বলুন, একটি উদাহরণ ভেরিয়েবল এবং একটি স্থানীয় ভেরিয়েবল - স্থানীয় ভেরিয়েবলটি অ্যাক্সেস করা হবে।"

দুটি কাউন্ট ভেরিয়েবল সহ উদাহরণ
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"এই কোডটি দুটি গণনা ভেরিয়েবল ঘোষণা করে। লাইন 3 একটি ইনস্ট্যান্স ভেরিয়েবল ঘোষণা করে , এবং লাইন 8 - একটি স্থানীয় পরিবর্তনশীল ।"

"রান পদ্ধতিটি কার্যকর হলে কী ঘটে তা এখানে:"

"7 লাইনে, আমরা ইনস্ট্যান্স ভেরিয়েবল অ্যাক্সেস করি এবং এটিতে মান 15 বরাদ্দ করি"

"8 লাইনে, আমরা একটি নতুন স্থানীয় ভেরিয়েবল ঘোষণা (তৈরি) করি : count. এটি ইনস্ট্যান্স ভেরিয়েবলকে মাস্ক করে। স্থানীয় ভেরিয়েবল হল যা পদ্ধতির পরবর্তী সমস্ত কোড দেখতে পাবে (অ্যাক্সেস)।"

"বুঝেছি."

"স্থানীয় ভেরিয়েবল ইনস্ট্যান্স ভেরিয়েবলটিকে মাস্ক করে। অন্য কথায়, স্থানীয় ভেরিয়েবলটি অ্যাক্সেস করা যায়। তবে, আপনি ইনস্ট্যান্স ভেরিয়েবলটিও অ্যাক্সেস করতে পারেন। এটি করা একটু বেশি জটিল।"

স্ট্যাটিক (শ্রেণী) পরিবর্তনশীল
ClassName.variableName

// Here are some examples:
Cat.catsCount
নন-স্ট্যাটিক (উদাহরণ) পরিবর্তনশীল
this.variableName

// Here are some examples:
this.catsCount

"আপনি আমাকে স্ট্যাটিক পদ্ধতি এবং স্ট্যাটিক ভেরিয়েবল সম্পর্কে কি বলতে পারেন?"

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

"আমার একটা প্রশ্ন আছে."

"স্ট্যাটিক এবং নন-স্ট্যাটিক পদ্ধতির মধ্যে পার্থক্য কি?"

"আসুন দেখে নেওয়া যাক কিভাবে একটি নন-স্ট্যাটিক পদ্ধতি কাজ করে:"

কোডটি কেমন দেখাচ্ছে
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);

"আপনি যখন একটি স্ট্যাটিক পদ্ধতি কল করেন, তখন এটিতে কোনো বস্তু পাস করা হয় না। অন্য কথায়, 'এই' সমান নাল । তাই একটি স্ট্যাটিক পদ্ধতি নন-স্ট্যাটিক ভেরিয়েবল এবং পদ্ধতি অ্যাক্সেস করতে পারে না (যেহেতু এটি পাস করার জন্য 'এই' নেই এই পদ্ধতিতে)।"

"হুম। আমি মনে করি আমি বুঝতে পেরেছি। অন্তত একটু।"

"এবং এখানে আসে চাচা দিয়েগো... এবং তার কাজ।"