CodeGym/Java Blog/এলোমেলো/জাভাতে পদ্ধতি
John Squirrels
লেভেল 41
San Francisco

জাভাতে পদ্ধতি

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

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Pounce!");
    }

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        smudge.sayMeow();
        smudge.jump();
    }
}
sayMeow() এবং jump() আমাদের ক্লাসের পদ্ধতি। এবং এই পদ্ধতিগুলি চালানোর ফলে নিম্নলিখিত কনসোল আউটপুট পাওয়া যায়:
Meow!
Pounce!
আমাদের পদ্ধতিগুলি বেশ সহজ: তারা কেবল কনসোলে পাঠ্য আউটপুট করে। কিন্তু জাভাতে, পদ্ধতিগুলির একটি গুরুত্বপূর্ণ কাজ রয়েছে: তারা একটি বস্তুর ডেটাতে ক্রিয়া সম্পাদন করে। তারা বস্তুর ডেটা পরিবর্তন করে, এটি রূপান্তর করে, এটি প্রদর্শন করে এবং এটির সাথে অন্যান্য কাজ করে। আমাদের বর্তমান পদ্ধতিগুলি ক্যাট অবজেক্টের ডেটা দিয়ে কিছু করে না । আসুন একটি আরও দৃষ্টান্তমূলক উদাহরণ দেখি:
public class Truck {

    int length;
    int width;
    int height;
    int weight;

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
উদাহরণস্বরূপ, এখানে আমাদের একটি শ্রেণী রয়েছে যা একটি ট্রাকের প্রতিনিধিত্ব করে । সেমি ট্রাকের একটি দৈর্ঘ্য, প্রস্থ, উচ্চতা এবং ওজন রয়েছে (যা আমাদের পরে প্রয়োজন হবে)। getVolume() পদ্ধতিতে , আমরা গণনা করি, আমাদের অবজেক্টের ডেটাকে এর ভলিউম প্রতিনিধিত্বকারী সংখ্যায় রূপান্তর করি (আমরা দৈর্ঘ্য, প্রস্থ এবং উচ্চতা গুণ করি)। এই সংখ্যা পদ্ধতির ফলাফল হবে। মনে রাখবেন যে পদ্ধতির ঘোষণা পাবলিক int getVolume হিসাবে লেখা হয়েছে । এর মানে হল যে এই পদ্ধতিটি একটি int ফেরত দিতে হবে । আমরা পদ্ধতির রিটার্ন মান গণনা করেছি, এবং এখন আমাদের অবশ্যই এটিকে আমাদের পদ্ধতি বলা প্রোগ্রামে ফেরত দিতে হবে। জাভাতে একটি পদ্ধতির ফলাফল ফেরাতে, আমরা কীওয়ার্ড রিটার্ন ব্যবহার করি। রিটার্ন ভলিউম;

জাভা মেথড প্যারামিটার

কল করার সময় আমরা একটি পদ্ধতিতে "আর্গুমেন্টস" নামক মানগুলি পাস করতে পারি। একটি পদ্ধতির ঘোষণা ভেরিয়েবলের একটি তালিকা অন্তর্ভুক্ত করে যা আমাদেরকে ভেরিয়েবলের ধরন এবং ক্রম বলে যা পদ্ধতিটি গ্রহণ করতে পারে। এই তালিকাটিকে "পদ্ধতি পরামিতি" বলা হয়। আমাদের ট্রাক ক্লাসের getVolume() পদ্ধতি বর্তমানে কোনো প্যারামিটার সংজ্ঞায়িত করে না, তাই আসুন আমাদের ট্রাকের উদাহরণ প্রসারিত করার চেষ্টা করি। BridgeOfficer নামে একটি নতুন ক্লাস তৈরি করুন । এটি একটি সেতুতে দায়িত্বরত একজন পুলিশ অফিসার, যিনি সমস্ত পাসিং ট্রাক চেক করেন যে তাদের বোঝা অনুমোদিত ওজনের চেয়ে বেশি কিনা।
public class BridgeOfficer {

    int maxWeight;

    public BridgeOfficer(int normalWeight) {
        this.maxWeight = normalWeight;
    }

    public boolean checkTruck(Truck truck) {
        if (truck.weight > maxWeight) {
            return false;
        } else {
            return true;
        }
    }
}
চেকট্রাক পদ্ধতি একটি যুক্তি, একটি ট্রাক অবজেক্ট গ্রহণ করে এবং কর্মকর্তা ব্রিজে ট্রাকটিকে অনুমতি দেবে কিনা তা নির্ধারণ করে পদ্ধতির অভ্যন্তরে, যুক্তিটি যথেষ্ট সহজ: যদি ট্রাকের ওজন অনুমোদিত সর্বাধিকের চেয়ে বেশি হয়, তবে পদ্ধতিটি মিথ্যা ফেরত দেয় । এটিকে অন্য রাস্তা খুঁজতে হবে :( ওজন সর্বাধিক বা তার সমান হলে, এটি পাস হতে পারে, এবং পদ্ধতিটি সত্য হয়. আপনি যদি এখনও "রিটার্ন" বা "পদ্ধতিটি একটি মান প্রদান করে" বাক্যাংশগুলি পুরোপুরি বুঝতে না পারেন তবে আসুন প্রোগ্রামিং থেকে বিরতি নিন এবং বাস্তব জীবনের একটি সাধারণ উদাহরণ ব্যবহার করে সেগুলি বিবেচনা করুন। :) ধরা যাক আপনি অসুস্থ হয়ে পড়েন এবং কয়েক দিনের জন্য কাজ থেকে বাড়িতে থাকেন। আপনি আপনার ডাক্তারের নোট নিয়ে অ্যাকাউন্টিং বিভাগে যান, কারণ অসুস্থ ছুটি পরিশোধ করার কথা। যদি আমরা এই পরিস্থিতিটিকে পদ্ধতির সাথে তুলনা করি, তাহলে হিসাবরক্ষকের একটি paySickLeave()পদ্ধতি আপনি এই পদ্ধতির যুক্তি হিসাবে একটি ডাক্তারের নোট পাস করেন (এটি ছাড়া, পদ্ধতিটি কাজ করবে না এবং আপনাকে অর্থ প্রদান করা হবে না!) তারপরে আপনার নোট ব্যবহার করে পদ্ধতির ভিতরে প্রয়োজনীয় গণনা করা হয় (কোম্পানির আপনাকে কত টাকা দিতে হবে তা হিসাব করার জন্য হিসাবরক্ষক এটি ব্যবহার করে), এবং আপনার কাজের ফলাফল (অর্থের পরিমাণ) আপনাকে ফেরত দেওয়া হয়। আমাদের প্রোগ্রাম একই ভাবে কাজ করে. এটি একটি পদ্ধতিকে কল করে, এতে ডেটা পাস করে এবং শেষ পর্যন্ত একটি ফলাফল পায়। এখানে আমাদের BridgeOfficer প্রোগ্রামের প্রধান() পদ্ধতি:
public static void main(String[] args) {
    Truck first = new Truck();
    first.weight = 10000;
    Truck second = new Truck();
    second.weight = 20000;

    BridgeOfficer officer = new BridgeOfficer(15000);
    System.out.println("Truck 1! Can I go, officer?");
    boolean canFirstTruckGo = officer.checkTruck(first);
    System.out.println(canFirstTruckGo);

    System.out.println();

    System.out.println("Truck 2! And can I?");
    boolean canSecondTruckGo = officer.checkTruck(second);
    System.out.println(canSecondTruckGo);
}
আমরা 10,000 এবং 20,000 লোড সহ দুটি ট্রাক তৈরি করি। আর যে সেতুতে কর্মকর্তা কাজ করেন তার ওজন সর্বোচ্চ ১৫ হাজার। প্রোগ্রামটি Officer.checkTruck(প্রথম) পদ্ধতিকে কল করে। পদ্ধতিটি সবকিছু গণনা করে এবং তারপর true ফেরত দেয় , যা প্রোগ্রামটি বুলিয়ান ভেরিয়েবল canFirstTruckGo- এ সংরক্ষণ করে । এখন আপনি এটি দিয়ে যা করতে চান তা করতে পারেন (যেমন আপনি অ্যাকাউন্টেন্ট আপনাকে দেওয়া অর্থ দিয়ে করতে পারেন)। দিন শেষে কোড
boolean canFirstTruckGo = officer.checkTruck(first);
সারবস্তুটা হচ্ছে
boolean canFirstTruckGo =  true;
এখানে একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়: রিটার্ন স্টেটমেন্টটি শুধুমাত্র পদ্ধতির রিটার্ন মান ফেরত দেয় না, এটি পদ্ধতিটিকে চলা থেকেও বন্ধ করে দেয়! রিটার্ন স্টেটমেন্টের পরে যে কোন কোড আসে তা কার্যকর করা হবে না!
public boolean checkTruck(Truck truck) {

    if (truck.weight > maxWeight) {
        return false;
        System.out.println("Turn around, you're overweight!");
    } else {
        return true;
        System.out.println("Everything looks good, go ahead!");
    }
}
অফিসারের মন্তব্য প্রদর্শিত হবে না, কারণ পদ্ধতিটি ইতিমধ্যে একটি ফলাফল ফিরে এসেছে এবং শেষ হয়ে গেছে! প্রোগ্রামটি সেই জায়গায় ফিরে আসে যেখানে পদ্ধতিটি বলা হয়েছিল। আপনাকে এটির জন্য দেখতে হবে না: জাভা কম্পাইলারটি যথেষ্ট স্মার্ট যে আপনি যখন রিটার্ন স্টেটমেন্টের পরে কোড লেখার চেষ্টা করেন তখন একটি ত্রুটি তৈরি করতে পারে।

অ্যাভেঞ্জারস: প্যারামিটার ওয়ার

এমন পরিস্থিতিতে আছে যখন আমরা একটি পদ্ধতি কল করার বিভিন্ন উপায় চাই। কেন আমাদের নিজেদের কৃত্রিম বুদ্ধিমত্তা তৈরি করা হয় না? অ্যামাজনের অ্যালেক্সা আছে, অ্যাপলের সিরি আছে, তাহলে কেন আমাদের একটি থাকা উচিত নয়? :) আয়রন ম্যান মুভিতে, টনি স্টার্ক তার নিজের অবিশ্বাস্য কৃত্রিম বুদ্ধিমত্তা জার্ভিস তৈরি করেন। আসুন সেই দুর্দান্ত চরিত্রের প্রতি শ্রদ্ধা নিবেদন করি এবং তার সম্মানে আমাদের AI এর নাম রাখি। :) প্রথমে আমাদের যা করতে হবে তা হল জার্ভিসকে যারা ঘরে প্রবেশ করে তাদের হ্যালো বলতে শেখানো (এটি অদ্ভুত হবে যদি এমন আশ্চর্যজনক বুদ্ধি অসভ্য হয়ে ওঠে)।
public class Jarvis {

    public void sayHi(String name) {
        System.out.println("Good evening, " + name + ". How are you?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
    }
}
কনসোল আউটপুট:
Good evening, Tony Stark. How are you?
খুব ভালো! জার্ভিস এখন অতিথিদের স্বাগত জানাতে সক্ষম। অবশ্যই, আরো প্রায়ই এটা তার মাস্টার হবে না, টনি স্টার্ক. কিন্তু সে একা না আসলে কী হবে! আমাদের sayHi() পদ্ধতি শুধুমাত্র একটি যুক্তি গ্রহণ করে। এবং তাই এটি কেবলমাত্র একজন ব্যক্তিকে ঘরে প্রবেশ করে অভিবাদন জানাতে পারে এবং অন্যটিকে উপেক্ষা করবে। খুব ভদ্র না, আপনি একমত না? :/

জাভা পদ্ধতি ওভারলোডিং

এই ক্ষেত্রে, আমরা একই নামের সাথে 2টি পদ্ধতি লিখে সমস্যাটি সমাধান করতে পারি, তবে বিভিন্ন পরামিতি:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ". How are you?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
    }
}
একে মেথড ওভারলোডিং বলা হয়। মেথড ওভারলোডিং আমাদের প্রোগ্রামকে আরও নমনীয় হতে দেয় এবং কাজ করার বিভিন্ন উপায়কে মিটমাট করে। আসুন এটি কীভাবে কাজ করে তা পর্যালোচনা করা যাক:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ". How are you?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
        jarvis.sayHi("Tony Stark", "Captain America");
    }
}
কনসোল আউটপুট:
Good evening, Tony Stark. How are you?
Good evening, Tony Stark and Captain America. How are you?
চমৎকার, উভয় সংস্করণই কাজ করেছে। :) কিন্তু আমরা সমস্যার সমাধান করিনি! তিনজন অতিথি থাকলে কি হবে? আমরা অবশ্যই, sayHi() পদ্ধতিটি আবার ওভারলোড করতে পারি, যাতে এটি তিনটি অতিথির নাম গ্রহণ করে। কিন্তু 4 বা 5 হতে পারে। অনন্ত পর্যন্ত সব পথ। এক মিলিয়ন বার sayHi() পদ্ধতিটি ওভারলোড না করে জার্ভিসকে যে কোনও সংখ্যক নাম পরিচালনা করতে শেখানোর আরও ভাল উপায় কি নেই ? :/ অবশ্যই আছে! যদি না থাকত, আপনি কি মনে করেন জাভা বিশ্বের সবচেয়ে জনপ্রিয় প্রোগ্রামিং ভাষা হবে? ;)
public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ". How are you?");
    }
}
যখন ( String... names ) একটি প্যারামিটার হিসাবে ব্যবহার করা হয়, তখন এটি নির্দেশ করে যে স্ট্রিংগুলির একটি সংগ্রহ পদ্ধতিতে পাস করা হবে। কতজন থাকবে তা আমাদের আগে থেকে নির্দিষ্ট করতে হবে না, তাই এখন আমাদের পদ্ধতি অনেক বেশি নমনীয়:
public class Jarvis {

    public void sayHi(String...names) {
        for (String name: names) {
            System.out.println("Good evening, " + name + ". How are you?");
        }
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
    }
}
কনসোল আউটপুট:
Good evening, Tony Stark. How are you?
Good evening, Captain America. How are you?
Good evening, Black Widow. How are you?
Good evening, Hulk. How are you?
এখানে কিছু কোড আপনার কাছে অপরিচিত হবে, তবে এটি নিয়ে চিন্তা করবেন না। এটি এর মূলে সহজ: পদ্ধতিটি প্রতিটি নাম পরিবর্তন করে এবং প্রতিটি অতিথিকে অভিবাদন জানায়! প্লাস, এটি পাস করা স্ট্রিংগুলির যেকোনো সংখ্যার সাথে কাজ করবে! দুই, দশ, এমনকি এক হাজার—যেকোন সংখ্যক অতিথির সাথে পদ্ধতিটি সঠিকভাবে কাজ করবে। সমস্ত সম্ভাবনার জন্য পদ্ধতিটি ওভারলোড করার চেয়ে আরও সুবিধাজনক, আপনি কি মনে করেন না? :) এখানে আরেকটি গুরুত্বপূর্ণ বিষয়: আর্গুমেন্টের ক্রম গুরুত্বপূর্ণ! ধরা যাক আমাদের পদ্ধতিটি একটি স্ট্রিং এবং একটি সংখ্যা নেয়:
public class Person {

    public static void sayYourAge(String greeting, int age) {
        System.out.println(greeting + " " + age);
    }

    public static void main(String[] args) {
        sayYourAge("My age is ", 33);
        sayYourAge(33, "My age is "); // Error!
    }
}
যদি Person ক্লাসের sayYourAge পদ্ধতিটি ইনপুট হিসাবে একটি স্ট্রিং এবং একটি সংখ্যা নেয়, তাহলে প্রোগ্রামটিকে অবশ্যই সেই নির্দিষ্ট ক্রমে তাদের পাস করতে হবে! যদি আমরা তাদের একটি ভিন্ন ক্রমে পাস করি, তাহলে কম্পাইলার একটি ত্রুটি তৈরি করবে এবং ব্যক্তি তার বয়স বলতে সক্ষম হবে না। যাইহোক, কনস্ট্রাক্টর, যা আমরা শেষ পাঠে কভার করেছি, এটিও পদ্ধতি! আপনি সেগুলিকে ওভারলোড করতে পারেন (যেমন প্যারামিটারের বিভিন্ন সেট সহ বেশ কয়েকটি কনস্ট্রাক্টর তৈরি করুন) এবং পাস করা আর্গুমেন্টের ক্রম তাদের জন্যও মৌলিকভাবে গুরুত্বপূর্ণ। তারা বাস্তব পদ্ধতি! :)

এখনও আবার পরামিতি সংক্রান্ত

হ্যাঁ, দুঃখিত, আমরা এখনও তাদের সাথে শেষ করিনি। :) আমরা এখন যে বিষয় নিয়ে অধ্যয়ন করব তা খুবই গুরুত্বপূর্ণ। ভবিষ্যতে প্রতিটি ইন্টারভিউতে আপনাকে এই বিষয়ে জিজ্ঞাসা করা হবে এমন সম্ভাবনা 90%! আসুন পদ্ধতিতে আর্গুমেন্ট পাস করার বিষয়ে কথা বলি। একটি সহজ উদাহরণ বিবেচনা করুন:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        currentYear = currentYear-10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2018;

        System.out.println("What year is it?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("How about now?");
        System.out.println(currentYear);
    }
}
টাইম মেশিনের দুটি পদ্ধতি রয়েছে। তারা উভয়ই বর্তমান বছরের প্রতিনিধিত্বকারী সংখ্যাটিকে একটি ইনপুট হিসাবে নেয় এবং হয় এর মান বাড়ায় বা হ্রাস করে (আমরা অতীত বা ভবিষ্যতে যেতে চাই কিনা তার উপর নির্ভর করে)। কিন্তু, আপনি কনসোল আউটপুট থেকে দেখতে পাচ্ছেন, পদ্ধতিটি কাজ করে না! কনসোল আউটপুট:
What year is it?
2018
How about now?
2018
আমরা goToPast() পদ্ধতিতে currentYear ভেরিয়েবল পাস করেছি , কিন্তু এর মান পরিবর্তন হয়নি। আমরা 2018 সালে ছিলাম এবং এখানেই থেকেছি। কিন্তু কেন? :/ কারণ জাভাতে প্রাইমিটিভগুলি মান দ্বারা পদ্ধতিতে প্রেরণ করা হয়। ওটার মানে কি? যখন আমরা goToPast() পদ্ধতিকে কল করি এবং এটিতে int ভেরিয়েবল currentYear (=2018) পাস করি, তখন পদ্ধতিটি currentYear ভেরিয়েবলটি নিজেই পায় না, বরং এটির একটি অনুলিপি পায়। অবশ্যই, এই অনুলিপিটির মানও 2018, কিন্তু অনুলিপিতে কোনো পরিবর্তন আমাদের আসল বর্তমান বছরের পরিবর্তনশীলকে কোনোভাবেই প্রভাবিত করে না! আসুন আমাদের কোডকে আরও স্পষ্ট করে দেখি এবং বর্তমান বছরের সাথে কী ঘটছে তা দেখুন:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        System.out.println("The goToPast method has started running!");
        System.out.println("currentYear inside the goToPast method (at the beginning) = " + currentYear);
        currentYear = currentYear-10;
        System.out.println("currentYear inside the goToPast method (at the end) = " + currentYear);
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2018;

        System.out.println("What was the year when the program started?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("And what year is it now?");
        System.out.println(currentYear);
    }
}
কনসোল আউটপুট:
What was the year when the program started?
2018
The goToPast method has started running!
currentYear inside the goToPast method (at the beginning) = 2018
currentYear inside the goToPast method (at the end) = 2008
And what year is it now?
2018
এটি স্পষ্টভাবে দেখায় যে goToPast() পদ্ধতিতে পাস করা ভেরিয়েবলটি শুধুমাত্র currentYear- এর একটি অনুলিপি । এবং অনুলিপি পরিবর্তন করা "মূল" মানকে প্রভাবিত করে না। "রেফারেন্স দ্বারা পাস" এর অর্থ ঠিক বিপরীত। এর বিড়ালদের উপর অনুশীলন করা যাক! আমি বলতে চাচ্ছি, একটি বিড়াল উদাহরণ ব্যবহার করে রেফারেন্স দ্বারা পাস করা কেমন দেখায় তা দেখা যাক। :)
public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
এখন আমাদের টাইম মেশিনের সাহায্যে আমরা Smudge , বিশ্বের প্রথম টাইম-ট্রাভেলিং বিড়াল, অতীত এবং ভবিষ্যতে পাঠাব! টাইমমেশিন ক্লাসটি পরিবর্তন করা যাক যাতে এটি ক্যাট অবজেক্টের সাথে কাজ করে;
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }
}
এখন পদ্ধতি শুধু পাস নম্বর পরিবর্তন করে না। বরং, তারা সেই নির্দিষ্ট বিড়ালের বয়সের ক্ষেত্র পরিবর্তন করে । আপনি মনে রাখবেন যে এটি আমাদের জন্য আদিম সংখ্যার সাথে কাজ করেনি, কারণ আসল সংখ্যা পরিবর্তন হয়নি। দেখা যাক কি হবে!
public static void main(String[] args) {

    TimeMachine timeMachine = new TimeMachine();
    Cat smudge = new Cat(5);

    System.out.println("How old was Smudge when the program started?");
    System.out.println(smudge.age);

    timeMachine.goToFuture(smudge);
    System.out.println("How about now?");
    System.out.println(smudge.age);

    System.out.println("Holy smokes! Smudge has aged 10 years! Back up quickly!");
    timeMachine.goToPast(smudge);
    System.out.println("Did it work? Have we returned the cat to its original age?");
    System.out.println(smudge.age);
}
কনসোল আউটপুট:
How old was Smudge when the program started running?
5
How about now?
15
Holy smokes! Smudge has aged 10 years! Back up quickly!
Did it work? Have we returned the cat to its original age?
5
কি দারুন! এখন পদ্ধতিটি ভিন্ন কিছু করেছে: আমাদের বিড়ালটি মারাত্মকভাবে বৃদ্ধ হয়েছে, কিন্তু তারপরে এটি আবার তরুণ হয়ে উঠেছে! :) এর কারণ বের করার চেষ্টা করা যাক. আদিম সহ উদাহরণের বিপরীতে, যখন বস্তুগুলিকে একটি পদ্ধতিতে প্রেরণ করা হয় তখন সেগুলি রেফারেন্স দ্বারা পাস করা হয়। মূল স্মাজ অবজেক্টের একটি রেফারেন্স changeAge() পদ্ধতিতে পাস করা হয়েছিল । সুতরাং, যখন আমরা পদ্ধতির ভিতরে smudge.age পরিবর্তন করি, তখন আমরা মেমরির একই এলাকা উল্লেখ করছি যেখানে আমাদের বস্তু সংরক্ষণ করা হয়। এটি একই স্মুজের একটি রেফারেন্স যা আমরা প্রাথমিকভাবে তৈরি করেছি। এটাকে বলে ‘রেফারেন্স দিয়ে পাস করা’! যাইহোক, রেফারেন্স সহ সবকিছু এত সহজ নয়। :) আসুন আমাদের উদাহরণ পরিবর্তন করার চেষ্টা করি:
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat = new Cat(cat.age);
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat = new Cat(cat.age);
        cat.age -= 10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        Cat smudge = new Cat(5);

        System.out.println("How old was Smudge when the program started?");
        System.out.println(smudge.age);

        timeMachine.goToFuture(smudge);
        System.out.println ("Smudge went to the future! Has his age changed?");
        System.out.println(smudge.age);

        System.out.println ("And if you try going back?");
        timeMachine.goToPast(smudge);
        System.out.println(smudge.age);
    }
}
কনসোল আউটপুট:
How old was Smudge when the program started running?
5
Smudge went to the future! Has his age changed?
5
And if you try going back?
5
এটা আবার কাজ করে না! О_О চলুন বের করা যাক কি হয়েছে। :) goToPast / goToFuture পদ্ধতি এবং রেফারেন্স কিভাবে কাজ করে তার সাথে এর সবকিছুই আছে । এখন, আপনার মনোযোগ, দয়া করে! রেফারেন্স এবং পদ্ধতিগুলি কীভাবে কাজ করে তা বোঝার জন্য এটি সবচেয়ে গুরুত্বপূর্ণ বিষয়। আসল বিষয়টি হল, যখন আমরা goToFuture(Cat cat) পদ্ধতিকে কল করি, তখন এটি ক্যাট অবজেক্টের রেফারেন্সের একটি অনুলিপি যা পাস হয়, রেফারেন্স নিজেই নয়। সুতরাং, যখন আমরা একটি পদ্ধতিতে একটি বস্তুকে পাস করি, তখন বস্তুটির দুটি উল্লেখ থাকে। কি ঘটছে তা বোঝার জন্য এটি খুবই গুরুত্বপূর্ণ। এই কারণেই আমাদের শেষ উদাহরণে বিড়ালের বয়স পরিবর্তন হয়নি। পূর্ববর্তী উদাহরণে, বয়স পরিবর্তন করার সময়, আমরা সহজভাবে goToFuture() এ পাস করা রেফারেন্স নিয়েছিলামপদ্ধতি, এবং মেমরিতে বস্তুটি খুঁজে পেতে এবং এর বয়স পরিবর্তন করতে এটি ব্যবহার করে ( cat.age += 10 )। কিন্তু এখন, goToFuture() পদ্ধতির ভিতরে, আমরা একটি নতুন অবজেক্ট তৈরি করছি ( cat = new Cat(cat.age) ), এবং এই অবজেক্টটিকে একই রেফারেন্স কপি দেওয়া হয়েছে যা পদ্ধতিতে পাস করা হয়েছিল। ফলস্বরূপ:
  • প্রথম রেফারেন্স ( Cat smudge = new Cat (5) ) মূল বিড়ালকে নির্দেশ করে (5 বছর বয়সের সাথে)
  • এর পরে, যখন আমরা cat ভেরিয়েবলটি goToPast() পদ্ধতিটি পাস করি এবং এটিকে একটি নতুন অবজেক্ট বরাদ্দ করি, রেফারেন্সটি অনুলিপি করা হয়েছিল।
এবং এটি আমাদের চূড়ান্ত ফলাফলে নিয়ে এসেছে: দুটি উল্লেখ দুটি ভিন্ন বস্তুর দিকে নির্দেশ করে। কিন্তু আমরা কেবল তাদের একজনের বয়স পরিবর্তন করেছি (পদ্ধতির ভিতরে তৈরি করা)।
cat.age += 10;
এবং অবশ্যই, main() পদ্ধতিতে আমরা কনসোলে দেখতে পাচ্ছি যে বিড়ালের বয়স, smudge.age , পরিবর্তন হয়নি। সর্বোপরি, স্মাজ একটি রেফারেন্স ভেরিয়েবল যা এখনও 5 বছর বয়সের সাথে পুরানো, আসল বস্তুর দিকে নির্দেশ করে এবং আমরা সেই বস্তুর সাথে কিছু করিনি। আমাদের বয়সের সমস্ত পরিবর্তন নতুন বস্তুতে সঞ্চালিত হয়েছিল। সুতরাং, এটি দেখা যাচ্ছে যে বস্তুগুলি রেফারেন্স দ্বারা পদ্ধতিতে প্রেরণ করা হয়। বস্তুর কপি কখনই স্বয়ংক্রিয়ভাবে তৈরি হয় না। আপনি একটি পদ্ধতিতে একটি বিড়াল বস্তু পাস এবং তার বয়স পরিবর্তন, আপনি তার বয়স পরিবর্তন হবে. কিন্তু রেফারেন্স ভেরিয়েবল কপি করা হয় যখন মান এবং/অথবা কলিং পদ্ধতি নির্ধারণ করে! প্রিমিটিভ পাস করার বিষয়ে আমরা যা বলেছি তা এখানে পুনরাবৃত্তি করা যাক: "যখন আমরা changeInt() মেথডকে কল করি এবং int পাস করিভেরিয়েবল x (=15) , পদ্ধতিটি x ভেরিয়েবল নিজেই পায় না, বরং এটির একটি অনুলিপি। অতএব, অনুলিপিতে করা কোনো পরিবর্তন আমাদের মূল x-কে প্রভাবিত করে নাজাভাতে আর্গুমেন্টগুলি কীভাবে পাস করা হয় তা নিয়ে এখনও একাধিকবার তর্ক করতে হবে (এমনকি অভিজ্ঞ বিকাশকারীদের মধ্যেও)। কিন্তু, এখন আপনি জানেন কিভাবে এটি কাজ করে। এটা বজায় রাখা! :) আপনি যা শিখেছেন তা শক্তিশালী করার জন্য, আমরা আপনাকে আমাদের জাভা কোর্স থেকে একটি ভিডিও পাঠ দেখার পরামর্শ দিই
মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই