JavaRush میں، طلباء کو پہلے لیکچرز سے لفظی طور پر کلیدی لفظ سے متعارف کرایا جاتا ہے
اور یہ پتہ چلتا ہے کہ آپ
یعنی
اور ذیل میں مطلوبہ الفاظ کے ساتھ پروگرام کوڈ ہے
this
۔ اور وقت کے ساتھ ساتھ یہ واضح ہو جاتا ہے کہ اس کا کیا مطلب ہے۔ لیکن بہت سے لوگ، پیچھے مڑ کر، شاید ایمانداری سے اپنے آپ سے کہیں گے کہ ایک طویل عرصے تک وہ اس کلیدی لفظ کے زین کو محسوس نہیں کر سکے۔ اس مضمون میں ہم ان لوگوں کے لیے مطلوبہ الفاظ کے استعمال کے راز سے پردہ اٹھاتے ہیں this
جو ابھی تک اس کا پتہ نہیں لگا سکتے... خوش آمدید! اگر آپ Schildt کی Java حوالہ کتاب اٹھاتے ہیں ، صفحہ 171 پر آپ پڑھیں گے کہ ایک کلیدی لفظ کی this
ضرورت ہے تاکہ کوئی طریقہ اس چیز کا حوالہ دے سکے جس نے اسے کہا ہے۔ یہ اصل میں اس کا خاتمہ ہوسکتا ہے۔ لیکن ہمیں تفصیلات کی ضرورت ہے۔ ایک اصول کے طور پر، یہ دو صورتوں میںthis
استعمال کیا جانا چاہئے :
- جب کلاس انسٹینس متغیر اور میتھڈ/کنسٹرکٹر متغیر کا ایک ہی نام ہوتا ہے۔
- جب آپ کو ایک قسم کے کنسٹرکٹر کو کال کرنے کی ضرورت ہوتی ہے (مثال کے طور پر، ڈیفالٹ یا پیرامیٹرائزڈ کنسٹرکٹر) دوسرے سے۔ اسے ایک واضح کنسٹرکٹر کال بھی کہا جاتا ہے۔
مثال ایک - مثال کے متغیر اور طریقہ متغیر کا ایک ہی نام ہے۔
ہم کہتے ہیں کہ ہمارے پاس ایک کلاس ہےHuman
جس کے لیے "نام" فیلڈ کی تعریف کی گئی ہے: آئیے name
متغیر کے لیے ایک سیٹر بنائیں (سیٹر کافی کام کر رہا ہے اور یہاں کوئی چال نہیں ہے): براہ کرم نوٹ کریں کہ ہم متغیر کو طریقہ (setter) میں منتقل کر رہے ہیں۔ ) _ ہم نے ایک نیا متغیر متعارف کرایا اور (عام طور پر) اسے جو چاہیں کہہ سکتے ہیں کیونکہ یہ صرف طریقہ کے {کرلی منحنی خطوط وحدانی کے اندر ہی نظر آئے گا ۔ نوٹ کریں کہ سیٹر میں ایک لائن ہے: setName
String newName
setName
name = newName;
یعنی حقیقت میں، ہم نے ایک نیا متغیر متعارف کرایا newName
اور اسے کلاس میں پہلے سے موجود متغیر کو تفویض کیا name
۔ بہت سے پروگرامرز نے سوچا کہ نئے نام کے ساتھ متغیر متعارف کرانا عجیب ہے اگر آخر میں ہم ایک ہی چیز کے بارے میں بات کر رہے ہوں۔ کلاس میں نام کے بارے میں Human
۔ لہذا، زبان کے ڈویلپرز نے ایک متغیر نام کو استعمال کرنے کے لئے آسان بنانے کے بارے میں سوچا. دوسرے الفاظ میں، متغیر کے دو نام کیوں ہیں جن کا مطلب ایک ہی چیز ہے۔ یعنی، میں کچھ اس طرح کرنا چاہوں گا: لیکن اس صورت میں ایک مسئلہ پیدا ہوتا ہے ۔ اب ہمارے پاس دو متغیرات ہیں جن کا نام ایک ہی ہے۔ ایک String name
کا تعلق کلاس سے ہے Human
اور دوسرا String name
اس کے طریقہ کار سے setName
۔ لہذا، جاوا مشین نہیں جانتی ہے کہ جب آپ سیٹر میں سٹرنگ لکھتے ہیں تو آپ کا مطلب کون سا متغیر ہوتا ہے:
name = name;
جاوا قریب ترین لیتا ہے - name
طریقہ سے setName
:
name
اس طریقے سے کسی متغیر کو صرف ایک قدر تفویض کرتے ہیں۔ جس کا یقیناً کوئی مطلب نہیں۔ اس لیے کسی متغیر کو name
کلاس سے متغیر کو Human
میتھڈ name
سے الگ کرنے کے لیے کچھ طریقہ درکار تھا setName
۔ اس مسئلے کو حل کرنے کے لیے کلیدی لفظ متعارف کرایا گیا تھا this
، جو اس صورت میں اس بات کی نشاندہی کرے گا کہ متغیر کو میتھڈ سے نہیں بلکہ متغیر کو کال کرنا ضروری ہے۔ ایک کلاس کا Human
:
this
یہ کالنگ آبجیکٹ کا حوالہ دے گا جیسا کہ مضمون کے شروع میں کہا گیا تھا۔ نتیجے کے طور پر، شخص کا نام setName
سیٹر کے ذریعے تخلیق کردہ آبجیکٹ پر سیٹ کیا جائے گا۔ مطلوبہ لفظ استعمال کیے بغیر ذیل میں کوڈ ہے this
۔ کوڈ ایک کلاس آبجیکٹ بناتا ہے Human
اور اسے ایک نام دیتا ہے:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
اس طرح، یہ this
ایک ہی چیز کو ظاہر کرنے کے لیے نئے متغیرات متعارف کرانے سے گریز کرتا ہے، جو اضافی متغیرات کے ساتھ کوڈ کو کم "اوور لوڈڈ" بناتا ہے۔
مثال دو - اسے واضح طور پر کنسٹرکٹر کو کال کرنے کے لیے استعمال کرنا
ایک کنسٹرکٹر کو دوسرے سے کال کرنا اس وقت کارآمد ثابت ہوسکتا ہے جب آپ کے پاس (عجیب طور پر) کئی کنسٹرکٹرز ہوں اور آپ نئے کنسٹرکٹر میں کنسٹرکٹر میں پہلے دیے گئے ابتدائی کوڈ کو دوبارہ نہیں لکھنا چاہتے۔ الجھن میں؟ سب کچھ اتنا خوفناک نہیں جتنا لگتا ہے۔ نیچے دیے گئے کوڈ کو دیکھیں، اس میں دو کلاس کنسٹرکٹرز ہیںHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
یہاں ہمارے پاس پہلے دو پیرامیٹر کنسٹرکٹر ہے جو قبول کرتا ہے int age
اور int weight
. ہم کہتے ہیں کہ ہم نے اس میں کوڈ کی دو لائنیں لکھی ہیں:
this.age = age;
this.weight = weight;
اور پھر انہوں نے تین پیرامیٹرز کے ساتھ ایک اور کنسٹرکٹر شامل کرنے کا فیصلہ کیا، جو عمر اور وزن کے علاوہ اونچائی بھی لیتا ہے۔ نئے کنسٹرکٹر میں آپ یہ لکھ سکتے ہیں:
this.age = age;
this.weight = weight;
this.height = height;
لیکن اس کوڈ کو دہرانے کے بجائے جو آپ پہلے ہی اس کنسٹرکٹر میں لکھ چکے ہیں، آپ this
کنسٹرکٹر کو دو پیرامیٹرز کے ساتھ واضح طور پر کال کرنے کے لیے کلیدی لفظ استعمال کر سکتے ہیں:
this(age, weight);
// and add the missing variable:
this.height = height;
تو آپ کنسٹرکٹر کو تین پیرامیٹرز کے ساتھ بتا رہے ہیں:
- اس کنسٹرکٹر کو کال کریں، جس کے دو پیرامیٹرز ہیں۔
- اور گم شدہ متغیر کو شامل کریں۔
this
تمام طریقوں کو منتقل کیا جاتا ہے سوائے جامد کے (اسی وجہ سے اسے this
اکثر ایک مضمر پیرامیٹر کہا جاتا ہے) اور اس چیز کا حوالہ دینے کے لیے استعمال کیا جا سکتا ہے جسے طریقہ کہا جاتا ہے۔ اس کلیدی لفظ سے ڈرنے کی ضرورت نہیں ہے، کیونکہ This
یہ خوفناک نہیں ہے۔
GO TO FULL VERSION