JavaRush /جاوا بلاگ /Random-SD /طريقو دستخط

طريقو دستخط

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

طريقو دستخط

سڀ ڪوڊ جيڪو بيان ڪري ٿو هڪ طريقي کي سڏيو ويندو آهي طريقو بيان . ھڪڙي طريقي جي دستخط ۾ ھڪڙي خاص ترتيب ۾ طريقي جو نالو ۽ پيٽرولر جا قسم شامل آھن. اشتهار جي عام ظهور هيٺ ڏنل بيان ڪري سگهجي ٿو:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
اچو ته ڪلاس جي ڪيترن ئي طريقن جي بيانن جو مثال وٺون 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("Собака по имени " + name + " говорит \"Гав-гав!\"");
   }

   public void run(int meters) {
       System.out.println("Собака по имени " + name + " пробежала " + meters + " метров!");
   }

   public String getName() {
       return name;
   }
}

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

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

   public static void main(String[] args) {

       Dog butch = new Dog("Бутч");
       butch.run(100);
   }

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

2. جامد لفظ

طريقن مان هڪ Dog، يعني، main()لفظ طرفان اشارو ڪيو ويو آهي static. جيڪڏهن اهو موجود آهي، ته پوء ان کي بيان ڪيو وڃي رسائي جي ترميمي کان پوء. ياد رکو پوئين ليڪچرن ۾ اسان جامد طبقي متغير بابت ڳالهايو؟ جڏهن طريقن تي لاڳو ٿئي ٿي، هي لفظ تقريبن ساڳيو مطلب آهي. جيڪڏهن هڪ طريقو بيان ڪيو ويو آهي جيئن ته static، ان جو مطلب اهو آهي ته اهو استعمال ڪري سگهجي ٿو بغير ڪنهن مخصوص طبقي اعتراض جي حوالي سان. main()۽ درحقيقت، ڪلاس ۾ جامد طريقو هلائڻ لاءِ ، Dogتوهان کي هڪ مثال ٺاهڻ جي ضرورت ناهي Dog؛ اهو ان کان سواءِ هلندو آهي. جيڪڏهن اهو طريقو جامد نه هجي ها، ته پوءِ ان کي استعمال ڪرڻ لاءِ اسان کي پهريان هڪ اعتراض ٺاهڻو پوندو.

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

جيڪڏهن اسان جو طريقو ڪجهه موٽڻ گهرجي، ته پوء اسان واپسي جي قيمت جو قسم ظاهر ڪندا آهيون. اهو هڪ حاصل ڪندڙ جي مثال ۾ ڏسي سگهجي ٿو getName():
public String getName() {
   return name;
}
اهو هڪ قسم جو اعتراض واپس ڏئي ٿو String. جيڪڏهن طريقو ڪجھ به نه موٽائي، لفظ جي بدران بيان ڪيو ويو آهي قسم void، جيئن طريقي ۾ woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

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

اهڙيون حالتون آهن جڏهن اسان جي پروگرام کي ڪيترن ئي اختيارن جي ضرورت آهي ته ڪيئن هڪ طريقو ڪم ڪري ٿو. اسان پنهنجي مصنوعي ذهانت ڇو نه ٺاهي؟ Amazon وٽ Alexa آهي، Yandex وٽ Alice آهي، پوءِ اسان ڇو خراب آهيون؟ :) آئرن مين جي باري ۾ فلم ۾، ٽوني اسٽارڪ پنهنجي شاندار مصنوعي ذهانت ٺاهي - JARVIS اچو ته شاندار ڪردار کي خراج تحسين پيش ڪريون ۽ اسان جي AI جو نالو سندس اعزاز ۾ رکون :) The پهرين شيء اسان کي Jarvis کي سيکارڻ گهرجي - جيڪي ماڻهو ڪمري ۾ داخل ٿين ٿا انهن کي سلام ڪريو (اهو عجيب ٿيندو جيڪڏهن اهڙي عظيم عقل بيوقوف ٿي وئي).
public class Jarvis {

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
   }
}
ڪنسول آئوٽ:

Добрый вечер, Тони Старк, How ваши дела?
زبردست! جاروس ڄاڻي ٿو ته ڪنهن کي سلام ڪيئن ڪجي جيڪو داخل ٿئي. گهڻو ڪري، يقينا، اهو سندس مالڪ ٿيندو - ٽوني اسٽارڪ. پر هو شايد اڪيلو نه اچي! ۽ اسان جو طريقو sayHi()صرف هڪ دليل ان پٽ طور وٺندو آهي. ۽، مطابق، هو صرف انهن مان هڪ کي سلام ڪرڻ جي قابل هوندو، ۽ ٻئي کي نظرانداز ڪندو. بلڪل نه، متفق آهيو؟:/ هن صورت ۾، مسئلي کي حل ڪرڻ لاء، اسان صرف ڪلاس ۾ 2 طريقا لکي سگهون ٿا ساڳئي نالي سان، پر مختلف پيٽرولر سان:
public class Jarvis {

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

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

}
اهو طريقو اوورلوڊنگ سڏيو ويندو آهي . اوورلوڊنگ اسان جي پروگرام کي وڌيڪ لچڪدار ٿيڻ جي اجازت ڏئي ٿي ۽ ڪم جي مختلف اختيارن کي گڏ ڪري ٿي. اچو ته ڏسو ته اهو ڪيئن ڪم ڪري ٿو:
public class Jarvis {

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

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
ڪنسول آئوٽ:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
عظيم، ٻنهي اختيارن ڪم ڪيو :) بهرحال، اسان مسئلو حل نه ڪيو! ڇا جيڪڏهن ٽي مهمان آهن؟ يقينن، اسان sayHi()ٽن مهمانن جا نالا قبول ڪرڻ جو طريقو ٻيهر اوور لوڊ ڪري سگھون ٿا. پر انهن مان 4 يا 5 ٿي سگهن ٿا، وغيره وغيره. ڇا ھڪڙو ٻيو طريقو آھي جيڪو Jarvis کي سيکارڻ لاءِ ڪنھن نمبر جي نالن سان ڪم ڪرڻ لاءِ، ھڪڙي ملين طريقي جي اوور لوڊ کان سواءِ sayHi()؟ :/ يقيناً آهي! ٻي صورت ۾، جاوا دنيا ۾ سڀ کان وڌيڪ مشهور پروگرامنگ ٻولي هوندي؟ ؛)
public class Jarvis {

   public void sayHi(String...names) {

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

   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) هڪ پيٽرولر جي طور تي منظور ڪيو ويو آهي اسان کي اهو ظاهر ڪرڻ جي اجازت ڏئي ٿو ته هڪ خاص نمبر جي اسٽرنگ طريقي سان گذري ويا آهن. اسان اڳ ۾ وضاحت نه ڪندا آهيون ته ڪيترا هجڻ گهرجن، تنهنڪري اسان جي طريقي جو عمل هاڻي تمام گهڻو لچڪدار بڻجي ويندو آهي:
public class Jarvis {

   public void sayHi(String...names) {

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

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
   }
}
ڪنسول آئوٽ:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
طريقي جي اندر، اسان سڀني دليلن ذريعي لوپ ڪريون ٿا ۽ ڪنسول ڏانهن نالن سان تيار ڪيل جملن کي ٻاھر ڪڍو. هتي اسان هڪ آسان لوپ استعمال ڪندا آهيون for-each(توهان اڳ ۾ ئي ان کي منهن ڪيو آهي). اهو تمام سٺو آهي ڇاڪاڻ ته لکڻ جو String...namesاصل مطلب اهو آهي ته سڀئي منظور ٿيل پيٽرولر مرتب ڪندڙ طرفان هڪ صف ۾ رکيا ويا آهن. تنهن ڪري، 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("Также известен How супергерой " + nickname);
       } else {
           System.out.println("Также известен How суперзлодей " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Макс Эйзенхарт. Рост 188см, вес 86 кг.", true, "Магнето");
   }
}
نتيجو:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
اهو اسان جو طريقو ڪم ڪري ٿو ان تي منحصر ڪري ٿو ڊيٽا تي جيڪو اسان ان ۾ داخل ڪيو. ٻيو اهم نقطو:دليلن جي ترتيب اهميت رکي ٿي! اچو ته چئو ته اسان جو طريقو هڪ اسٽرنگ ۽ هڪ انگ ان پٽ طور وٺندو آهي:
public class Man {

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

   public static void main(String[] args) {

       sayYourAge("My age - ", 33);
       sayYourAge(33, "My age - "); //error!
   }
}
جيڪڏهن هڪ sayYourAge()ڪلاس جو طريقو Manهڪ اسٽرنگ ۽ هڪ انگ کي ان پٽ طور وٺندو آهي، پوء اهو ئي ترتيب آهي جنهن ۾ انهن کي پروگرام ۾ پاس ڪرڻ جي ضرورت آهي! جيڪڏهن اسان انهن کي مختلف ترتيب سان پاس ڪريون ٿا، ته مرتب ڪندڙ هڪ غلطي اڇلائي ڇڏيندو ۽ ماڻهو پنهنجي عمر ٻڌائي نه سگهندو. رستي جي ذريعي، اسان آخري ليڪچر ۾ ڍڪيل تعمير ڪندڙ پڻ طريقا آهن! اهي به اوورلوڊ ٿي سگهن ٿا (ڪيترن ئي ڪنسٽرڪٽر ٺاهي جن کي دليلن جي مختلف سيٽن سان) ۽ انهن لاءِ دليلن کي پاس ڪرڻ جو حڪم به بنيادي طور اهم آهي. حقيقي طريقا! :)

ڪيئن سڏ طريقن سان ملندڙ جلندڙ پيراگراف سان

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

   public void introduce(String name, String age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man sasha = new Man();
       sasha.introduce("Sasha", "двадцать один");

       Man masha = new Man();
       masha.introduce("Мария", 32);
   }
}
اسان اڳ ۾ ئي اوورلوڊنگ کان واقف آهيون، تنهنڪري اسان ڄاڻون ٿا ته اهو طريقو ڪم ڪندو جيئن توقع ٻنهي وقتن تي:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
پر ڇا ٿيندو جيڪڏهن اسان null کي ٻئي پيٽرولر جي طور تي پاس ڪريون، نه هڪ تار يا نمبر؟
public static void main(String[] args) {

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

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Метод со строкой и числом!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", (String) null);
   }
}
نتيجو:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
پر جيڪڏهن عددي پيٽرول هڪ پرائمري هجي ها int۽ ڪنهن حوالي جي قسم جو اعتراض نه هجي ها ته Integerاهڙي غلطي نه ٿيندي.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Метод со строкой и числом!!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", null);
   }
}
ڇا توهان اندازو لڳايو آهي ڇو؟ جيڪڏهن توهان اهو اندازو لڳايو، سٺو ڪيو :) ڇاڪاڻ ته پريميٽوز نال جي برابر نٿا ٿي سگهن. ھاڻي مرتب ڪندڙ وٽ صرف ھڪڙو اختيار آھي ميٿڊ کي ڪال ڪرڻ لاءِ introduce()- ٻن لائينن سان. اهو طريقو جو هي نسخو آهي جنهن تي عمل ڪيو ويندو هر وقت طريقو سڏيو ويندو آهي.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION