CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ طريقا
John Squirrels
سطح
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;
        }
    }
}
چيڪ ٽرڪ جو طريقو هڪ دليل قبول ڪري ٿو، هڪ ٽرڪ اعتراض، ۽ اهو طئي ڪري ٿو ته آفيسر ٽرڪ کي پل تي هلڻ جي اجازت ڏيندو يا نه. طريقي جي اندر، منطق ڪافي سادو آهي: جيڪڏهن ٽرڪ جو وزن وڌ کان وڌ اجازت ڏني وئي آهي، پوء اهو طريقو غلط آهي . ان کي ٻيو رستو ڳولڻو پوندو:( جيڪڏهن وزن وڌ کان وڌ يا برابر کان گهٽ آهي، اهو گذري سگهي ٿو، ۽ طريقو صحيح موٽائي ٿو . جيڪڏهن توهان جملي کي مڪمل طور تي نه سمجھندا آهيو "واپسي" يا "طريقو موٽائي ٿو a قدر" اڃا تائين، اچو ته پروگرامنگ کان هڪ وقفو وٺون ۽ حقيقي زندگي مان هڪ سادي مثال استعمال ڪندي انهن تي غور ڪريو. :) چئو ته توهان بيمار ٿي وڃو ۽ ڪجهه ڏينهن لاءِ ڪم کان گهر رهو. توهان پنهنجي ڊاڪٽر جي نوٽ سان اڪائونٽنگ ڊپارٽمينٽ ڏانهن وڃو، ڇو ته بيمار جي موڪل ادا ڪئي ويندي آهي. جيڪڏهن اسان هن صورتحال کي طريقن سان موازنہ ڪريون ٿا، ته اڪائونٽنٽ وٽ هڪ 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 جي لوڊ سان ٻه ٽرڪون ٺاهيندا آهيون. ۽ پل جتي آفيسر ڪم ڪري ٿو ان جو وڌ ۾ وڌ وزن 15000 آهي. پروگرام آفيسر.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!");
    }
}
آفيسر جي تبصرن کي ظاهر نه ڪيو ويندو، ڇاڪاڻ ته طريقو اڳ ۾ ئي هڪ نتيجو ۽ ختم ٿي چڪو آهي! پروگرام ان جاءِ تي واپس اچي ٿو جتي طريقو سڏيو ويو هو. توھان کي ھن لاءِ ڏسڻ جي ضرورت نه آھي: جاوا ڪمپلر ڪافي سمارٽ آھي غلطي پيدا ڪرڻ لاءِ جڏھن توھان ڪوشش ڪندا آھيو واپسي واري بيان کان پوءِ ڪوڊ لکڻ جي.

Avengers: Parameter War

اتي حالتون آهن جڏهن اسان چاهيون ٿا ڪيترن ئي طريقن کي سڏڻ جا طريقا. اسان پنهنجي مصنوعي ذهانت ڇو نه ٺاهي؟ Amazon وٽ Alexa آهي، ايپل وٽ سري آهي، پوءِ اسان وٽ ڇو نه هجي؟ :) فلم آئرن مين ۾، ٽوني اسٽارڪ پنهنجي ناقابل يقين مصنوعي ڄاڻ رکندڙ، جارويس ٺاهي ٿو. اچو ته ان شاندار ڪردار کي خراج تحسين پيش ڪريون ۽ سندس اعزاز ۾ پنهنجي AI جو نالو رکون. :) پهرين شيء اسان کي ڪرڻ جي ضرورت آهي Jarvis کي سيکارڻ لاء ماڻهن کي هيلو چوڻ لاء جيڪي ڪمري ۾ داخل ٿين ٿا (اهو عجيب ٿيندو جيڪڏهن اهڙي عجيب عقل بيوقوف ٿي وئي).
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?
تمام سٺو! Jarvis هاڻي مهمان استقبال ڪرڻ جي قابل آهي. يقينن، گهڻو ڪري نه ته اهو سندس ماسٽر، ٽوني اسٽارڪ هوندو. پر جيڪڏهن هو اڪيلو نه اچي ته ڇا ٿيو! اسان جو 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 ) استعمال ڪيو ويندو آهي هڪ پيراميٽر طور، اهو ظاهر ڪري ٿو ته Strings جو هڪ مجموعو طريقو ڏانهن منتقل ڪيو ويندو. اسان کي اڳ ۾ بيان ڪرڻ جي ضرورت ناهي ته اتي ڪيترا هوندا، تنهنڪري هاڻي اسان جو طريقو تمام گهڻو لچڪدار آهي:
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?
ھتي ڪجھ ڪوڊ توھان لاءِ اڻ واقف ھوندا، پر ان بابت پريشان نه ٿيو. اهو ان جي بنيادي طور تي سادو آهي: طريقو هر نالو بدلي ۾ وٺندو آهي ۽ هر مهمان کي سلام ڪندو آهي! ان سان گڏ، اهو ڪم ڪندو ڪنهن به نمبر منظور ٿيل تارن سان! ٻه، ڏهه، هڪ هزار به- اهو طريقو ڪنهن به مهمان جي تعداد سان صحيح ڪم ڪندو. طريقي سان وڌيڪ آسان طريقي سان اوورلوڊ ڪرڻ جي طريقي سان سڀني امڪانن لاء، ڇا توهان سوچيو ٿا؟ :) هتي هڪ ٻيو اهم نقطو آهي: دليلن جي ترتيب جي اهميت! اچو ته اسان جو طريقو هڪ String ۽ هڪ نمبر وٺي ٿو:
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!
    }
}
جيڪڏهن پرسن ڪلاس جو 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() طريقي سان موجوده سال جي متغير کي منظور ڪيو ، پر ان جي قيمت تبديل نه ڪئي. اسان 2018 ۾ هئاسين، ۽ هتي ئي رهي چڪا آهيون. پر ڇو؟ :/ ڇاڪاڻ ته جاوا ۾ پريميٽوز قدر جي لحاظ کان طريقن سان گذري ويا آهن. هن جو مطلب ڇا آهي؟ جڏهن اسان goToPast() طريقي کي سڏين ٿا ۽ ان کي int variable currentYear (=2018) پاس ڪريون ٿا، اهو طريقو پاڻ کي موجوده سال متغير حاصل نٿو ڪري ، بلڪه ان جي ڪاپي. يقينا، هن ڪاپي جي قيمت پڻ 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() طريقي سان منظور ڪيو ويو صرف موجوده سال جي ڪاپي آهي . ۽ ڪاپي تبديل ڪرڻ سان "اصل" قدر متاثر نه ٿيندو. "حوالو ذريعي پاس" جو مطلب آهي بلڪل سامهون. اچو ته ٻلين تي مشق ڪريون! منهنجو مطلب آهي، اچو ته ڏسو ته حوالن ذريعي گذرڻ وانگر هڪ ٻلي مثال استعمال ڪندي نظر اچي ٿو. :)
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
واهه! هاڻي طريقو ڪجهه مختلف ڪيو: اسان جي ٻلي وڏي عمر ۾، پر پوء اهو ٻيهر جوان ٿي ويو! :) اچو ته معلوم ڪرڻ جي ڪوشش ڇو. مثال جي ابتڙ مثالن سان، جڏهن شيون هڪ طريقي سان گذري ويا آهن اهي حوالن سان گذري ويا آهن. اصل smudge اعتراض جو هڪ حوالو changeAge() طريقي ڏانهن گذري ويو . تنهن ڪري، جڏهن اسان طريقي جي اندر smudge.age کي تبديل ڪندا آهيون، اسان ميموري جي ساڳئي حصي جو حوالو ڪري رهيا آهيون جتي اسان جو اعتراض ذخيرو ٿيل آهي. اهو ساڳيو Smudge جو حوالو آهي جيڪو اسان شروعات ۾ ٺاهيو هو. ان کي چئبو آهي ”حوالو پاس ڪرڻ“! بهرحال، حوالن سان هر شيء ايترو آسان ناهي. :) اچو ته اسان جي مثال کي تبديل ڪرڻ جي ڪوشش ڪريو:
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 = نئين ٻلي (5) ) اصل ٻلي ڏانهن اشارو ڪري ٿو (5 سالن جي عمر سان)
  • ان کان پوء، جڏهن اسان cat variable پاس ڪيو goToPast() طريقو ۽ ان کي هڪ نئون اعتراض لڳايو، حوالو نقل ڪيو ويو.
۽ هي اسان کي آخري نتيجي تي پهچايو: ٻه حوالا ٻن مختلف شين ڏانهن اشارو ڪن ٿا. پر اسان صرف انهن مان هڪ جي عمر کي تبديل ڪيو (جيڪو طريقو اندر ٺاهيل آهي).
cat.age += 10;
۽ يقينا، main() طريقي ۾ اسان ڪنسول تي ڏسي سگهون ٿا ته ٻلي جي عمر، smudge.age ، تبديل نه ڪئي وئي آهي. سڀ کان پوء، smudge هڪ حوالو متغير آهي جيڪو اڃا تائين 5 سالن جي عمر سان پراڻي، اصل اعتراض ڏانهن اشارو ڪري ٿو، ۽ اسان ان اعتراض سان ڪجھ به نه ڪيو آهي. اسان جي عمر جون سڀ تبديليون نئين اعتراض تي ڪيون ويون. تنهن ڪري، اهو ظاهر ٿئي ٿو ته شيون حوالي سان طريقن سان گذري ويا آهن. شين جون ڪاپيون ڪڏهن به خودڪار طور تي پيدا نه ٿيون ٿين. جيڪڏھن توھان ھڪڙي ٻلي اعتراض کي ھڪڙي طريقي سان منتقل ڪيو ۽ ان جي عمر کي تبديل ڪريو، توھان ان جي عمر تبديل ڪندا. پر حوالا متغير نقل ڪيا ويا آهن جڏهن قدر ۽ / يا ڪالنگ طريقن کي تفويض ڪيو وڃي! اچو ته هتي ٻيهر ورجايون جيڪي اسان پاسنگ پرائمٽيوز بابت چيو آهي: ”جڏهن اسان changeInt() ميٿڊ کي ڪال ڪريون ٿا ۽ int variable x (=15) پاس ڪريون ٿا، ته اهو طريقو پاڻ ئي x متغير حاصل نٿو ڪري ، بلڪه ان جي ڪاپي حاصل ڪري ٿو. ڪاپي ۾ ڪيل ڪا به تبديلي اسان جي اصل x متغير کي ڪنهن به طرح متاثر نه ڪندي. جڏهن حوالن کي نقل ڪندي، هر شيء بلڪل ساڳيء طرح ڪم ڪري ٿو! توهان طريقو کي ٻلي اعتراض پاس. جيڪڏهن توهان ٻلي لاءِ ڪجهه ڪريو ٿا (يعني ياداشت ۾ اعتراض سان)، توهان جون سڀئي تبديليون ڪاميابيءَ سان لاڳو ٿينديون، ڇو ته اسان وٽ صرف هڪ اعتراض هو ۽ اڃا تائين فقط هڪ اعتراض آهي. پر، جيڪڏهن توهان طريقي جي اندر هڪ نئون اعتراض ٺاهيو ۽ ان کي تفويض ڪيو ريفرنس متغير کي دليل طور طريقي سان منظور ڪيو ويو، توهان صرف نئين اعتراض کي تفويض ڪيو ويندو ريفرنس متغير جي ڪاپي ڏانهن. ان وقت کان وٺي، اسان وٽ ٻه شيون ۽ ٻه حوالا متغير هوندا. بس اهو آهي! اهو ايترو آسان نه هو. توھان کي شايد ڪيترائي ڀيرا سبق پڙھڻو پوندو. پر، اهم ڳالهه اها آهي ته توهان هن اهم موضوع تي مهارت حاصل ڪئي آهي. توهان اڃا تائين هڪ ڀيرو کان وڌيڪ بحث ختم ڪنداسين ته جاوا ۾ دليل ڪيئن گذريا آهن (جيتوڻيڪ تجربيڪار ڊولپرز جي وچ ۾). پر، هاڻي توهان کي خبر آهي ته اهو ڪيئن ڪم ڪري ٿو. جاري رکو! :) جيڪو توهان سکيو ان کي مضبوط ڪرڻ لاءِ، اسان توهان کي اسان جي جاوا ڪورس مان هڪ وڊيو سبق ڏسڻ جي صلاح ڏيون ٿا
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION