JavaRush /جاوا بلاگ /Random-UR /طریقہ دستخط

طریقہ دستخط

گروپ میں شائع ہوا۔
ہیلو! آپ پہلے ہی فیلڈز اور طریقوں کے ساتھ اپنی کلاسز بنانے میں مہارت حاصل کر چکے ہیں۔ آج ہم ان طریقوں کے بارے میں تفصیل سے بات کریں گے۔ بلاشبہ ہم نے اپنے لیکچرز میں ایک سے زیادہ مرتبہ ایسا کیا ہے، لیکن ہم نے بنیادی طور پر عمومی نکات پر بات کی۔ آج ہم "حصوں میں" طریقوں کا لفظی تجزیہ کریں گے - ہم یہ جانیں گے کہ وہ کن چیزوں پر مشتمل ہیں، ان کو بنانے کے لیے کون سے آپشنز موجود ہیں اور ان سب کا انتظام کیسے کیا جا سکتا ہے :) چلیں!طریقہ دستخط - 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 + " говорит \"Гав-гав!\"");
}

ایک ہی نام کے طریقے

ایسے حالات ہوتے ہیں جب ہمارے پروگرام کو طریقہ کار کے کام کرنے کے لیے متعدد اختیارات کی ضرورت ہوتی ہے۔ ہم اپنی مصنوعی ذہانت کیوں نہیں بنا لیتے؟ ایمیزون کے پاس الیکسا ہے، یانڈیکس کے پاس ایلس ہے، تو ہم کیوں بدتر ہیں؟ :) آئرن مین کے بارے میں فلم میں، ٹونی اسٹارک نے اپنی شاندار مصنوعی ذہانت تخلیق کی - JARVIS آئیے اس شاندار کردار کو خراج تحسین پیش کریں اور اپنے AI کا نام ان کے اعزاز میں رکھیں :) The سب سے پہلے ہمیں جارویس کو سکھانا چاہئے - جو لوگ کمرے میں داخل ہوتے ہیں ان کو سلام کریں (یہ عجیب ہوگا کہ اگر اتنی بڑی عقل ناپاک نکلے)۔
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 ہو سکتے ہیں۔ اور اسی طرح اشتہار لامحدود۔ کیا جارویس کو کسی بھی تعداد کے ناموں کے ساتھ کام کرنا سکھانے کا کوئی اور طریقہ ہے، بغیر دس لاکھ طریقہ اوورلوڈ کے 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);
   }
}
کیا آپ نے اندازہ لگایا ہے کہ کیوں؟ اگر آپ نے اندازہ لگایا ہے، تو اچھا کیا :) کیونکہ پرائمیٹوز null کے برابر نہیں ہو سکتے۔ اب کمپائلر کے پاس طریقہ کو کال کرنے کا صرف ایک آپشن ہے introduce()- دو لائنوں کے ساتھ۔ یہ طریقہ کا یہ ورژن ہے جس پر ہر بار طریقہ کار کو بلانے پر کارروائی کی جائے گی۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION