CodeGym /جاوا بلاگ /Random-UR /حوالہ کی اقسام کو چوڑا اور تنگ کرنا
John Squirrels
سطح
San Francisco

حوالہ کی اقسام کو چوڑا اور تنگ کرنا

گروپ میں شائع ہوا۔
ہائے! ماضی کے ایک سبق میں، ہم نے ابتدائی اقسام کاسٹ کرنے پر تبادلہ خیال کیا۔ آئیے مختصراً یاد کرتے ہیں کہ کیا گفتگو ہوئی تھی۔ حوالہ کی اقسام کو چوڑا اور تنگ کرنا - 1ہم نے قدیم قسموں (اس معاملے میں، عددی اقسام) کو گھونسلے کی گڑیا کے طور پر تصور کیا جو ان کی میموری کی مقدار کے مطابق سائز میں مختلف ہوتی ہیں۔ جیسا کہ آپ کو یاد ہوگا، ایک بڑی گڑیا کے اندر چھوٹی گڑیا ڈالنا حقیقی زندگی اور جاوا پروگرامنگ دونوں میں آسان ہے۔
public class Main {
   public static void main(String[] args) {
       int bigNumber = 10000000;
       short smallNumber = (short) bigNumber;
       System.out.println(smallNumber);
   }
}
یہ خودکار تبدیلی یا چوڑا کرنے کی ایک مثال ہے ۔ یہ خود ہی ہوتا ہے، لہذا آپ کو اضافی کوڈ لکھنے کی ضرورت نہیں ہے۔ آخر میں، ہم کوئی غیر معمولی کام نہیں کر رہے ہیں: ہم صرف ایک چھوٹی گڑیا کو بڑی گڑیا میں ڈال رہے ہیں۔ یہ اور بات ہے کہ اگر ہم اس کے برعکس کرنے کی کوشش کریں اور ایک بڑی روسی گڑیا کو چھوٹی گڑیا میں ڈال دیں۔ آپ حقیقی زندگی میں ایسا نہیں کر سکتے، لیکن پروگرامنگ میں آپ کر سکتے ہیں۔ لیکن ایک nuance ہے. اگر ہم intایک متغیر میں ڈالنے کی کوشش کرتے ہیں short، تو چیزیں ہمارے لیے اتنی آسانی سے نہیں چلتی ہیں۔ سب کے بعد، shortمتغیر معلومات کے صرف 16 بٹس رکھتا ہے، لیکن ایک int32 بٹس پر قبضہ کرتا ہے! نتیجے کے طور پر، منظور شدہ قدر مسخ ہو جاتی ہے۔ مرتب کرنے والا ہمیں ایک غلطی دے گا (' یار، آپ کچھ مشکوک کر رہے ہیں! ')۔ لیکن اگر ہم واضح طور پر اس قسم کی نشاندہی کرتے ہیں جس میں ہم اپنی قدر کو تبدیل کر رہے ہیں، تو یہ آگے بڑھے گا اور آپریشن کرے گا۔
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       bigNumber = (short) bigNumber;

       System.out.println(bigNumber);

   }

}
یہ صرف وہی ہے جو ہم نے اوپر کی مثال میں کیا۔ آپریشن کیا گیا تھا، لیکن چونکہ shortمتغیر 32 بائٹس میں سے صرف 16 کو ایڈجسٹ کر سکتا ہے، حتمی قدر مسخ ہو جاتی ہے اور ہمیں نمبر -27008 ملتا ہے ۔ اس طرح کے آپریشن کو واضح تبدیلی، یا تنگ کرنا کہا جاتا ہے ۔

حوالہ کی اقسام کو چوڑا اور تنگ کرنے کی مثالیں۔

اب ہم انہی آپریٹرز کے بارے میں بات کرتے ہیں جن کا اطلاق قدیم اقسام پر نہیں بلکہ اشیاء اور حوالہ متغیرات پر ہوتا ہے ! یہ جاوا میں کیسے کام کرتا ہے؟ یہ دراصل کافی آسان ہے۔ ایسی چیزیں ہیں جن کا کوئی تعلق نہیں ہے۔ یہ سمجھنا منطقی ہوگا کہ وہ ایک دوسرے میں تبدیل نہیں ہوسکتے، نہ ہی واضح طور پر اور نہ ہی خود بخود:
public class Cat {
}

public class Dog {
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Dog(); // Error!

   }

}
یہاں، یقینا، ہمیں ایک غلطی ملتی ہے۔ اور کلاسز ایک دوسرے سے متعلق نہیں ہیں، اور ہم نے ایک سے دوسرے میں جانے کے لیے 'کنورٹر' نہیں لکھا ہے Cat۔ Dogیہ سمجھ میں آتا ہے کہ ہم یہ نہیں کر سکتے: مرتب کرنے والے کو اندازہ نہیں ہے کہ ان اشیاء کو ایک قسم سے دوسری قسم میں کیسے تبدیل کیا جائے۔ اگر اشیاء متعلقہ ہیں، ٹھیک ہے، یہ ایک اور معاملہ ہے! متعلقہ کیسے؟ سب سے بڑھ کر، وراثت کے ذریعے۔ آئیے کلاسز کا ایک چھوٹا سا نظام بنانے کے لیے وراثت کو استعمال کرنے کی کوشش کریں۔ جانوروں کی نمائندگی کرنے کے لیے ہمارے پاس ایک عام کلاس ہوگی:
public class Animal {

   public void introduce() {

       System.out.println("I'm Animal");
   }
}
ہر کوئی جانتا ہے کہ جانور پالے ہوئے (پالتو جانور) یا جنگلی ہوسکتے ہیں:
public class WildAnimal extends Animal {

   public void introduce() {

       System.out.println("I'm WildAnimal");
   }
}

public class Pet extends Animal {

   public void introduce() {

       System.out.println("I'm Pet");
   }
}
مثال کے طور پر، کینائنز لیں — ہمارے پاس گھریلو کتے اور کویوٹس ہیں:
public class Dog extends Pet {

   public void introduce() {

       System.out.println("I'm Dog");
   }
}



public class Coyote extends WildAnimal {

   public void introduce() {

       System.out.println ("I'm Coyote");
   }
}
ہم نے خاص طور پر سب سے بنیادی کلاسوں کا انتخاب کیا ہے تاکہ انہیں سمجھنے میں آسانی ہو۔ ہمیں واقعی کسی فیلڈ کی ضرورت نہیں ہے، اور ایک طریقہ کافی ہے۔ آئیے اس کوڈ پر عمل کرنے کی کوشش کریں:
public class Main {

   public static void main(String[] args) {

       Animal animal = new Pet();
       animal.introduce();
   }
}
آپ کے خیال میں کنسول پر کیا دکھایا جائے گا؟ کیا کلاس introduceکا طریقہ Petیا Animalکلاس کو مدعو کیا جائے گا؟ پڑھنا جاری رکھنے سے پہلے اپنے جواب کو درست ثابت کرنے کی کوشش کریں۔ اور یہاں نتیجہ ہے! میں پالتو ہوں ہمیں یہ کیوں ملا؟ یہ سب آسان ہے۔ ہمارے پاس پیرنٹ متغیر اور ڈیسنڈنٹ آبجیکٹ ہے۔ لکھ کر،
Animal animal = new Pet();
ہم نے ایک Petحوالہ وسیع کیا اور اسے Animalمتغیر کو تفویض کیا۔ جیسا کہ قدیم اقسام کے ساتھ، جاوا میں حوالہ کی اقسام خود بخود وسیع ہو جاتی ہیں۔ ایسا کرنے کے لیے آپ کو اضافی کوڈ لکھنے کی ضرورت نہیں ہے۔ اب ہمارے پاس پیرنٹ ریفرنس کو تفویض کردہ ایک اولاد آبجیکٹ ہے۔ نتیجے کے طور پر، ہم دیکھتے ہیں کہ طریقہ کال نسلی طبقے پر کی گئی ہے۔ اگر آپ اب بھی پوری طرح سے نہیں سمجھتے ہیں کہ یہ کوڈ کیوں کام کرتا ہے، تو اسے سادہ زبان میں دوبارہ لکھیں:
Animal animal = new DomesticatedAnimal();
اس کے ساتھ کوئی مسئلہ نہیں ہے، ٹھیک ہے؟ تصور کریں کہ یہ حقیقی زندگی ہے، اور حوالہ صرف ایک کاغذی لیبل ہے جس پر 'جانور' لکھا ہوا ہے۔ اگر آپ کاغذ کا وہ ٹکڑا لیں اور اسے کسی بھی پالتو جانور کے کالر سے جوڑ دیں تو سب کچھ درست ہو جائے گا۔ سب کے بعد، کوئی بھی پالتو جانور ایک جانور ہے! الٹا عمل - وراثت کے درخت کو اولاد کی طرف منتقل کرنا - تنگ ہو رہا ہے:
public class Main {

   public static void main(String[] args) {

       WildAnimal wildAnimal = new Coyote();

       Coyote coyote = (Coyote) wildAnimal;

       coyote.introduce();
   }
}
جیسا کہ آپ دیکھ سکتے ہیں، یہاں ہم واضح طور پر اس کلاس کی نشاندہی کرتے ہیں جس میں ہم اپنے آبجیکٹ کو تبدیل کرنا چاہتے ہیں۔ ہمارے پاس پہلے ایک WildAnimalمتغیر تھا، اور اب ہمارے پاس ایک ہے Coyote، جو وراثت کے درخت پر کم ہے۔ یہ سمجھ میں آتا ہے کہ بغیر کسی واضح اشارے کے کمپائلر اس طرح کے آپریشن کی اجازت نہیں دے گا، لیکن اگر ہم قوسین میں قسم کی نشاندہی کریں تو سب کچھ کام کرتا ہے۔ حوالہ کی اقسام کو چوڑا اور تنگ کرنا - 2ایک اور دلچسپ مثال پر غور کریں:
public class Main {

   public static void main(String[] args) {

       Pet pet = new Animal(); // Error!
   }
}
مرتب کرنے والا ایک غلطی پیدا کرتا ہے! لیکن کیوں؟ کیونکہ آپ کسی پیرنٹ آبجیکٹ کو ڈیسنڈنٹ ریفرنس میں تفویض کرنے کی کوشش کر رہے ہیں۔ دوسرے لفظوں میں، آپ کچھ ایسا کرنے کی کوشش کر رہے ہیں:
DomesticatedAnimal domesticatedAnimal = new Animal();
ٹھیک ہے، شاید سب کچھ کام کرے گا اگر ہم واضح طور پر اس قسم کی وضاحت کریں جس میں ہم تبدیل کرنے کی کوشش کر رہے ہیں؟ اس نے نمبروں کے ساتھ کام کیا - آئیے اسے آزمائیں! :)
public class Main {

   public static void main(String[] args) {

       Pet pet = (Pet) new Animal();
   }
}
دھاگے میں استثناء java.lang.ClassCastException: جانوروں کو پالتو جانوروں کی غلطی پر کاسٹ نہیں کیا جا سکتا! مرتب کرنے والے نے اس وقت ہم پر نہیں چیخا، لیکن ہم ایک استثناء کے ساتھ ختم ہوئے۔ ہمیں وجہ پہلے ہی معلوم ہے: ہم کسی پیرنٹ آبجیکٹ کو نسلی حوالہ کے لیے تفویض کرنے کی کوشش کر رہے ہیں۔ لیکن آپ ایسا کیوں نہیں کر سکتے؟ کیونکہ تمام جانور Domesticated Animals نہیں ہوتے۔ آپ نے ایک Animalآبجیکٹ بنایا ہے اور اسے Petمتغیر کو تفویض کرنے کی کوشش کر رہے ہیں۔ ایک coyote بھی ایک ہے Animal، لیکن یہ ایک نہیں ہے Pet۔ دوسرے الفاظ میں، جب آپ لکھتے ہیں
Pet pet = (Pet) new Animal();
new Animal()کسی بھی جانور کی نمائندگی کر سکتا ہے، ضروری نہیں کہ پالتو ہو! قدرتی طور پر، آپ کا Pet petمتغیر صرف پالتو جانوروں (اور ان کی اولاد) کو ذخیرہ کرنے کے لیے موزوں ہے نہ کہ کسی قسم کے جانور۔ اسی لیے ایک خاص جاوا استثناء، ClassCastException, ان صورتوں کے لیے بنایا گیا تھا جہاں کلاسز کاسٹ کرتے وقت ایک خرابی واقع ہوتی ہے۔ چیزوں کو واضح کرنے کے لیے آئیے اس کا دوبارہ جائزہ لیں۔ والدین کا حوالہ نسلی طبقے کی مثالوں کی طرف اشارہ کر سکتا ہے:
public class Main {

   public static void main(String[] args) {

       Pet pet = new Pet();
       Animal animal = pet;

       Pet pet2 = (Pet) animal;
       pet2.introduce();
   }
}
مثال کے طور پر، یہاں ہمیں کوئی مسئلہ نہیں ہے۔ ہمارے پاس ایک Petآبجیکٹ ہے جس کا حوالہ Petمتغیر کے ذریعہ دیا گیا ہے۔ بعد میں، ایک Animalحوالہ اسی اعتراض کی طرف اشارہ کیا. اس کے بعد، ہم animala میں تبدیل ہوتے ہیں Pet۔ ویسے، یہ ہمارے لیے کیوں کام آیا؟ پچھلی بار ہمیں ایک استثنا ملا! کیونکہ اس بار ہمارا اصل اعتراض ایک ہے Pet!
Pet pet = new Pet();
لیکن آخری مثال میں، یہ ایک Animalاعتراض تھا:
Pet pet = (Pet) new Animal();
آپ کسی آبجیکٹ آبجیکٹ کو ڈیسنڈنٹ متغیر کو تفویض نہیں کر سکتے۔ آپ اس کے برعکس کر سکتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION