CodeGym /جاوا بلاگ /Random-SD /بيان جو طريقو
John Squirrels
سطح
San Francisco

بيان جو طريقو

گروپ ۾ شايع ٿيل
سلام توھان اڳ ۾ ئي ڄاڻو ٿا توھان جي پنھنجي ڪلاس ٺاهڻ بابت فيلڊ ۽ طريقن سان. ھاڻي اسان طريقن تي رھنداسين.
طريقو بيان - 1
يقينا، اسان اڳ ۾ ئي اسان جي سبقن ۾ هڪ کان وڌيڪ ڀيرا ڪيو آهي، پر اسان بنيادي طور تي عامات کي ڍڪي ڇڏيو آهي. اڄ، اسان طريقن کي ٽوڙڻ وارا آهيون، ۽ مطالعو ڪرڻ وارا آهيون ته اهي ڇا ٺهيل آهن، انهن کي ٺاهڻ جا مختلف طريقا، ۽ انهن سڀني کي ڪيئن منظم ڪجي. :) اچو ته هلون!

بيان جو طريقو

سڀئي ڪوڊ جيڪي هڪ طريقي جي وضاحت ڪن ٿا، هڪ طريقو اعلان سڏيو ويندو آهي . ھڪڙي طريقي جي بيان جي عام شڪل کي ھيٺ ڏنل بيان ڪري سگھجي ٿو:
access modifier, return type, method name (parameter list) {
    // method body
}
مثال طور، ڪلاس جي مختلف طريقن جي بيانن تي هڪ نظر وٺو Dog.
public class Dog {

   String name;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {
       Dog max = new Dog("Max");
       max.woof();

   }

   public void woof() {
       System.out.println("A dog named " + name + " says \"Woof, woof!\"");
   }

   public void run(int distanceInFeet) {
       System.out.println("A dog named " + name + " ran " + distanceInFeet + " feet!");
   }

   public String getName() {
       return name;
   }
}

1. رسائي موڊيفائر

رسائي تبديل ڪندڙ هميشه پهريون اشارو ڪيو آهي. ڪلاس جا سڀ Dogطريقا نشان لڳل آھن عوامي تبديليءَ سان. هن جو مطلب آهي ته اسان انهن کي ڪنهن ٻئي طبقي مان سڏي سگهون ٿا:
public class Main {

   public static void main(String[] args) {

       Dog butch = new Dog("Butch");
       butch.run(100);
   }

}
جئين توهان ڏسي سگهو ٿا، Dogڪلاس جا طريقا آساني سان ڪلاس ۾ پهچندا آهن Main. اهو ممڪن آهي عوامي تبديليءَ جي ڪري . جاوا ۾، ٻيون ترميم ڪندڙ آھن. اهي سڀئي طريقا ٻين طبقن ۾ استعمال ٿيڻ جي اجازت نٿا ڏين. اسان انهن بابت ٻين سبقن ۾ ڳالهائينداسين. ياد رکڻ لاءِ بنيادي شيءِ اها آهي ته ڇا ترميم ڪندڙ ذميوار آهي: ڇا هڪ طريقو ٻين طبقن ۾ دستياب آهي :)

2. جامد لفظ

Dogطريقن مان هڪ ، staticmain() لفظ سان نشان لڳل آهي . اهو پڻ طريقو اعلان جو حصو آهي، ۽ اسان اڳ ۾ ئي ڄاڻون ٿا ان جي معني. اسان سبق جي شروعات ۾ ڏنل طريقي جي اعلان واري ٽيمپليٽ ۾ ان جو ذڪر نه ڪيو آهي، ڇاڪاڻ ته اهو اختياري آهي. جيڪڏھن اھو بيان ڪيو ويو آھي، پوء اھو ضرور اچڻ گھرجي رسائي موڊيفائر کان پوء. ياد رکو ته تازو سبقن ۾ اسان جامد (طبقاتي) متغير بابت ڳالهايو؟ جڏهن طريقن تي لاڳو ٿئي ٿو، هي لفظ تقريبا ساڳيو ئي معني آهي. جيڪڏهن هڪ طريقو static آهي ، ته پوءِ ان کي ڪلاس جي ڪنهن مخصوص اعتراض جي حوالي کان سواءِ استعمال ڪري سگهجي ٿو. ۽ درحقيقت، توهان کي ڪلاس ۾ جامد طريقو هلائڻ لاء اعتراض جي ضرورت ناهي . اهو صرف هڪ کان سواء ٺيڪ هلندو. جيڪڏهن اهو طريقو جامد نه هجي ها، ته پوءِ اسان کي ان کي هلائڻ لاءِ پهريون اعتراض ٺاهڻو پوندو. Dogmain()Dog

3. واپسي جي قيمت

جيڪڏهن اسان جو طريقو ڪجهه موٽڻ گهرجي، پوء اسان واپسي جي قيمت جو قسم بيان ڪريون ٿا. اهو حاصل ڪندڙ جي مثال مان ظاهر ٿئي ٿو getName():
public String getName() {
   return name;
}
اهو هڪ Stringاعتراض واپس ڏئي ٿو. جيڪڏهن ڪو طريقو ڪجھ به واپس نه ٿو ڏئي، ته پوءِ لفظ صفر بدران استعمال ڪيو ويندو آهي، جيئن طريقي ۾ woof():
public void woof() {
   System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}

ساڳي نالي سان طريقا

اهي حالتون آهن جڏهن اسان چاهيون ٿا ڪيترن ئي مختلف طريقن سان هڪ طريقو سڏڻ لاء. اسان پنهنجي مصنوعي ذهانت ڇو نه ٺاهي؟ 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");
   }
}
ڪنسول آئوٽ: گڊ شام، ٽوني اسٽارڪ. تون ڪيئن آهين؟ تمام سٺو! 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");
   }
}
ڪنسول آئوٽ: گڊ شام، ٽوني اسٽارڪ. تون ڪيئن آهين؟ شام جو سلام، ٽوني اسٽارڪ ۽ ڪئپٽن آمريڪا. تون ڪيئن آهين؟ تمام سٺو، ٻنهي نسخن ڪم ڪيو. :) پر اسان مسئلو حل نه ڪيو! ڇا جيڪڏهن ٽي مهمان آهن؟ اسان، يقينا، sayHi()طريقي سان ٻيهر لوڊ ڪري سگهون ٿا، انهي ڪري اهو قبول ڪري ٿو ٽن مهمانن جا نالا. پر اتي ٿي سگھي ٿو 4 يا 5. سڄو رستو لامحدود تائين. ڇا ھڪڙو بھتر طريقو ناھي جو جاروس کي سيکارڻ لاءِ ڪنھن به نمبر جي نالن کي سنڀالڻ لاءِ، طريقي کي اوور لوڊ ڪرڻ کان سواءِ sayHi()لکين ڀيرا ()؟ :/ يقيناً آهي! جيڪڏهن نه هجي ها، ڇا توهان سوچيو ٿا ته جاوا دنيا ۾ سڀ کان وڌيڪ مشهور پروگرامنگ ٻولي هوندي؟ ؛)
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");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
جڏهن ( 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");
   }
}
ڪنسول آئوٽ: گڊ شام، ٽوني اسٽارڪ. تون ڪيئن آهين؟ شام جو سلام، ڪئپٽن آمريڪا. تون ڪيئن آهين؟ شام جو سلام، ڪاري بيوه. تون ڪيئن آهين؟ شام جو سلام، هلڪ. تون ڪيئن آهين؟ طريقي جي اندر، اسان سڀني دليلن تي ٻيهر بيان ڪريون ٿا ۽ نالن سان فارميٽ ٿيل جملا ڏيکاريون ٿا. هتي اسان هڪ آسان for-eachلوپ استعمال ڪندا آهيون (جيڪو توهان اڳ ۾ ڏٺو آهي). اهو هتي مڪمل آهي، ڇاڪاڻ ته ( String... names ) نوٽشن جو اصل مطلب اهو آهي ته مرتب ڪندڙ سڀني منظور ٿيل دليلن کي هڪ صف ۾ رکي ٿو. نتيجي طور، اسان متغير نالن سان ڪم ڪري سگھون ٿا جيئن اسان ھڪڙي صف سان ڪم ڪنداسين، بشمول ان کي لوپ ۾ ٻيهر ڪرڻ سان. ان سان گڏ، اهو ڪم ڪندو ڪنهن به نمبر منظور ٿيل تارن سان! ٻه، ڏهه، هڪ هزار به- اهو طريقو ڪنهن به مهمان جي تعداد سان صحيح ڪم ڪندو. طريقي سان وڌيڪ آسان طريقي سان اوورلوڊ ڪرڻ جي طريقي سان سڀني امڪانن لاء، ڇا توهان سوچيو ٿا؟ :) هتي طريقو اوورلوڊنگ جو هڪ ٻيو مثال آهي. اچو ته Jarvis هڪ printInfoFromDatabase()طريقو ڏيو. اهو هڪ ڊيٽابيس مان هڪ شخص بابت معلومات ڏيکاريندو. جيڪڏهن ڊيٽابيس ظاهر ڪري ٿو ته هڪ شخص سپر هيرو يا سپر ولن آهي، اسان اها معلومات ڏيکارينداسين:
public class Jarvis {

   public void printInfoFromDatabase (String bio) {

       System.out.println(bio);
   }

   public void printInfoFromDatabase(String bio, boolean isEvil, String nickname) {

       System.out.println(bio);
       if (!isEvil) {
           System.out.println("Also known as the superhero " + nickname);
       } else {
           System.out.println("Also known as the supervillain " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Laura Palmer. Date of birth: July 22, 1972. Twin Peaks, Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Max Eisenhardt. Height: 15.6 ft. Weight: 189 lbs. ", true, "Magneto");
   }
}
آئوٽ: لورا پامر. ڄمڻ جي تاريخ: جولاءِ 22، 1972. ٽوئن پيڪس، واشنگٽن ميڪس ايزنهارٽ. اوچائي: 15.6 فوٽ. وزن: 189 پائونڊ. سپر ولن ميگنيٽو جي نالي سان پڻ سڃاتو وڃي ٿو ، تنهنڪري، اسان جي طريقي جي رويي جو دارومدار ان ڊيٽا تي آهي جيڪو اسان ان ڏانهن منتقل ڪريون ٿا. هتي هڪ ٻيو اهم نقطو آهي: دليلن جي ترتيب جي اهميت! اچو ته اسان جو طريقو هڪ 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!
   }
}
جيڪڏهن Personڪلاس جو sayYourAge()طريقو هڪ اسٽرنگ ۽ هڪ انگ کي انپٽ طور وٺندو آهي، پوء اهو حڪم آهي ته اهي دليلن کي طريقي سان پاس ڪيو وڃي! جيڪڏهن اسان انهن کي مختلف ترتيب سان پاس ڪريون ٿا، ته پوءِ مرتب ڪندڙ هڪ غلطي پيدا ڪندو ۽ ماڻهو پنهنجي عمر نه ٻڌائي سگهندو. رستي ۾، تعمير ڪندڙ، جن کي اسان گذريل سبق ۾ ڍڪي ڇڏيو، پڻ طريقا آهن! توھان انھن کي اوورلوڊ پڻ ڪري سگھو ٿا (يعني ڪيترن ئي ٺاھيندڙن کي ٺاھيندڙن جي مختلف سيٽن سان) ۽ منظور ٿيل دليلن جو حڪم انھن لاءِ پڻ بنيادي طور تي ضروري آھي. اهي حقيقي طريقا آهن! :)

ساڳين پيراگرافن سان طريقن کي ڪيئن سڏجي

جئين توھان ڄاڻو ٿا، nullجاوا ۾ ھڪڙو لفظ آھي. اهو سمجهڻ تمام ضروري آهي ته اهو nullنه ته ڪو اعتراض آهي ۽ نه ئي ڊيٽا جو قسم . تصور ڪريو ته اسان وٽ ھڪڙو Personطبقو ۽ ھڪڙو introduce()طريقو آھي، جيڪو شخص جي نالي ۽ عمر جو اعلان ڪري ٿو. ان کان علاوه، عمر متن يا نمبر جي طور تي منظور ڪري سگھجي ٿو.
public class Person {

   public void introduce(String name, String age) {
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person alex = new Person();
       alex.introduce ("Alex", "twenty-one");

       Person mary = new Person();
       mary.introduce("Mary", 32);
   }
}
اسان اڳ ۾ ئي اوورلوڊنگ کان واقف آهيون، تنهن ڪري اسان ڄاڻون ٿا ته ٻنهي طريقن سان اهو رويو ٿيندو جيئن انهن کي گهرجي: منهنجو نالو Alex آهي. منهنجي عمر ايڪويهه سال آهي منهنجو نالو مريم آهي. منهنجي عمر 32 سال آهي پر ڇا ٿيندو جيڪڏهن اسان nullسٽرنگ يا نمبر جي بدران سيڪنڊ پيراميٽر طور پاس ڪريون؟
public static void main(String[] args) {

   Person victor = new Person();
   victor.introduce("Victor", null);// Ambiguous method call!
}
اسان کي گڏ ڪرڻ جي غلطي ملندي! اهو ڇا سبب آهي ۽ ڇا واقعي "ابهام" آهي؟ حقيقت ۾، اهو سڀ ڪجهه بلڪل سادو آهي. مسئلو اهو آهي ته اسان وٽ طريقن جا ٻه نسخا آهن: هڪ سان هڪ Stringٻئي دليل جي طور تي، ۽ هڪ سان گڏ Integerٻيو دليل جي طور تي. پر هڪ String۽ هڪ Integerٻئي ٿي سگهن ٿا null! ڇاڪاڻ ته اهي حوالا جا قسم آهن، nullانهن ٻنهي لاءِ ڊفالٽ قدر آهي. اهو ئي سبب آهي ته هن صورتحال ۾ ڪمپلر اهو نه ٿو سمجهي سگهي ته طريقي جي ڪهڙي ورزن کي ڪال ڪرڻ گهرجي. هن مسئلي جو حل بلڪل سادو آهي. Nullواضح طور تي هڪ مخصوص حوالي جي قسم ۾ تبديل ڪري سگهجي ٿو. اهڙيء طرح، جڏهن توهان هڪ طريقي کي سڏيندا آهيو، توهان قوس ۾ ظاهر ڪري سگهو ٿا ڊيٽا جو قسم جيڪو توهان ٻئي دليل لاء چاهيو ٿا! مرتب ڪندڙ توهان جي "اشارو" کي سمجهي سگهندو ۽ صحيح طريقي کي سڏيندو:
public class Person {

   public void introduce(String name, String age) {
       System.out.println("Method with two strings!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Method with a string and a number!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person victor = new Person();
       victor.introduce("Victor", (String) null);
   }
}
آئوٽ: طريقو ٻن تارن سان! منهنجو نالو وڪٽر آهي. منهنجي عمر null آهي نوٽ ڪريو ته جيڪڏهن نمبر پيراميٽر هڪ primitive هجي ها int، بجاءِ Integer Reference قسم جي مثال جي، ته اهڙي غلطي نه ٿئي ها.
public class Person {

   public void introduce(String name, String age) {
       System.out.println("Method with two strings!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Method with a string and a number!!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person victor = new Person();
       victor.introduce("Victor", null);
   }
}
ڇا توهان اندازو لڳائي سگهو ٿا ڇو؟ جيڪڏهن توهان اندازو لڳايو ته ڇو، سٺو ڪيو! :) ڇاڪاڻ ته primitives نه ٿي سگهي null. هاڻي ڪمپلر وٽ صرف هڪ اختيار آهي، يعني ميٿڊ کي ٻن تارن سان سڏڻ introduce(). اهو طريقو جو نسخو آهي جيڪو هر وقت هلندو جيڪو طريقو سڏيو ويندو آهي.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION