CodeGym /جاوا بلاگ /Random-UR /طریقہ کا اعلان
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آبجیکٹ واپس کرتا ہے۔ اگر کوئی طریقہ کچھ واپس نہیں کرتا ہے، تو اس کے بجائے کلیدی لفظ void استعمال کیا جاتا ہے، جیسا کہ طریقہ میں ہے woof():
public void woof() {
   System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}

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

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