JavaRush /جاوا بلاگ /Random-UR /جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حص...

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حصہ 15

گروپ میں شائع ہوا۔
ہائے ہائے! جاوا ڈویلپر کو کتنا جاننے کی ضرورت ہے؟ آپ اس مسئلے پر طویل عرصے تک بحث کر سکتے ہیں، لیکن سچائی یہ ہے کہ انٹرویو میں آپ کو تھیوری کی طرف راغب کیا جائے گا۔ علم کے ان شعبوں میں بھی جو آپ کو اپنے کام میں استعمال کرنے کا موقع نہیں ملے گا۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 1ٹھیک ہے، اگر آپ ابتدائی ہیں، تو آپ کے نظریاتی علم کو بہت سنجیدگی سے لیا جائے گا۔ چونکہ ابھی تک کوئی تجربہ اور بڑی کامیابیاں نہیں ہیں، اس لیے علم کی بنیاد کی مضبوطی کو جانچنا باقی ہے۔ آج ہم جاوا ڈویلپرز کے لیے سب سے زیادہ مقبول انٹرویو کے سوالات کا جائزہ لے کر اس بنیاد کو مضبوط بناتے رہیں گے۔ چلو اڑتے ہیں!

جاوا کور

9. جاوا میں جامد اور متحرک بائنڈنگ میں کیا فرق ہے؟

میں اس سوال کا جواب پہلے ہی اس مضمون میں سوال نمبر 18 میں جامد اور متحرک پولیمورفزم کے بارے میں دے چکا ہوں، میں آپ کو اسے پڑھنے کا مشورہ دیتا ہوں۔

10. کیا انٹرفیس میں نجی یا محفوظ متغیرات کا استعمال ممکن ہے؟

نہیں تم نہیں کر سکتے. کیونکہ جب آپ انٹرفیس کا اعلان کرتے ہیں، تو جاوا کمپائلر خود بخود عوامی اور تجریدی مطلوبہ الفاظ کو انٹرفیس کے طریقوں سے پہلے اور عوامی ، جامد اور حتمی مطلوبہ الفاظ کو ڈیٹا ممبرز سے پہلے شامل کرتا ہے۔ دراصل، اگر آپ نجی یا محفوظ شدہ کو شامل کرتے ہیں، تو ایک تنازعہ پیدا ہو جائے گا ، اور مرتب کرنے والا اس پیغام کے ساتھ رسائی میں ترمیم کرنے والے کے بارے میں شکایت کرے گا: "موڈیفائر '<selected modifier>' کی یہاں اجازت نہیں ہے ۔ انٹرفیس میں متغیرات؟ آئیے اس کا پتہ لگائیں:
  • عوامی - انٹرفیس کلائنٹ کو آبجیکٹ کے ساتھ بات چیت کرنے کی اجازت دیتا ہے۔ اگر متغیرات عوامی نہ ہوتے تو کلائنٹس کو ان تک رسائی حاصل نہیں ہوتی۔
  • static - انٹرفیس نہیں بنائے جاسکتے ہیں (یا بلکہ ان کی اشیاء)، لہذا متغیر جامد ہے۔
  • فائنل - چونکہ انٹرفیس کو 100% تجرید حاصل کرنے کے لیے استعمال کیا جاتا ہے، اس لیے متغیر کی حتمی شکل ہے (اور اسے تبدیل نہیں کیا جائے گا)۔

11. کلاس لوڈر کیا ہے اور اس کا استعمال کیا ہے؟

کلاس لوڈر - یا کلاس لوڈر - جاوا کلاسز کی لوڈنگ فراہم کرتا ہے۔ زیادہ واضح طور پر، لوڈنگ اس کی اولاد کی طرف سے یقینی بنایا جاتا ہے - مخصوص کلاس لوڈرز، کیونکہ ClassLoader خود خلاصہ ہے۔ ہر بار جب .class فائل لوڈ ہوتی ہے، مثال کے طور پر، متعلقہ کلاس کے کنسٹرکٹر یا سٹیٹک طریقہ کو کال کرنے کے بعد، یہ عمل ClassLoader کلاس کی اولاد میں سے ایک کے ذریعے انجام دیا جاتا ہے ۔ وارثوں کی تین قسمیں ہیں:
  1. Bootstrap ClassLoader ایک بنیادی لوڈر ہے، جو JVM سطح پر لاگو ہوتا ہے اور رن ٹائم ماحول سے اس کا کوئی فیڈ بیک نہیں ہے، کیونکہ یہ JVM کرنل کا حصہ ہے اور مقامی کوڈ میں لکھا جاتا ہے۔ یہ لوڈر دیگر تمام ClassLoader مثالوں کے والدین کے طور پر کام کرتا ہے۔

    بنیادی طور پر JDK داخلی کلاسوں کو لوڈ کرنے کے لیے ذمہ دار ہے، عام طور پر rt.jar اور دیگر بنیادی لائبریریاں جو $JAVA_HOME/jre/lib ڈائریکٹری میں واقع ہیں ۔ مختلف پلیٹ فارمز میں اس کلاس لوڈر کے مختلف نفاذ ہو سکتے ہیں۔

  2. ایکسٹینشن کلاس لوڈر ایک ایکسٹینشن لوڈر ہے، جو بیس لوڈر کلاس کی اولاد ہے۔ معیاری جاوا بیس کلاسز کی توسیع کو لوڈ کرنے کا خیال رکھتا ہے۔ JDK ایکسٹینشن ڈائرکٹری سے لوڈ کیا جاتا ہے، عام طور پر $JAVA_HOME/lib/ext یا java.ext.dirs سسٹم پراپرٹی میں مذکور کوئی دوسری ڈائرکٹری (یہ آپشن ایکسٹینشن کی لوڈنگ کو کنٹرول کرنے کے لیے استعمال کیا جا سکتا ہے)۔

  3. سسٹم کلاس لوڈر ایک سسٹم لوڈر ہے جو JRE سطح پر لاگو ہوتا ہے جو JVM میں ایپلیکیشن لیول کی تمام کلاسوں کو لوڈ کرنے کا خیال رکھتا ہے۔ یہ کلاس ماحول کے متغیر -classpath یا -cp کمانڈ لائن آپشن میں پائی جانے والی فائلوں کو لوڈ کرتا ہے۔

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 2کلاس لوڈرز جاوا رن ٹائم کا حصہ ہیں۔ جس لمحے JVM کلاس کی درخواست کرتا ہے، کلاس لوڈر کلاس کو تلاش کرنے اور کلاس کے مکمل اہل نام کا استعمال کرتے ہوئے کلاس کی تعریف کو رن ٹائم میں لوڈ کرنے کی کوشش کرتا ہے۔ java.lang.ClassLoader.loadClass() طریقہ رن ٹائم پر کلاس ڈیفینیشن لوڈ کرنے کا ذمہ دار ہے۔ یہ اس کے مکمل نام کی بنیاد پر کلاس کو لوڈ کرنے کی کوشش کرتا ہے۔ اگر کلاس ابھی تک لوڈ نہیں ہوئی ہے، تو یہ درخواست پیرنٹ کلاس لوڈر کو سونپ دیتی ہے۔ یہ عمل بار بار ہوتا ہے اور اس طرح لگتا ہے:
  1. سسٹم کلاس لوڈر اپنے کیشے میں کلاس کو تلاش کرنے کی کوشش کرتا ہے۔

    • 1.1 اگر کلاس مل جاتی ہے، لوڈنگ کامیابی سے مکمل ہو جاتی ہے۔

    • 1.2 اگر کلاس نہیں ملتی ہے تو، لوڈنگ ایکسٹینشن کلاس لوڈر کو سونپی جاتی ہے۔

  2. ایکسٹینشن کلاس لوڈر کلاس کو اپنے کیشے میں تلاش کرنے کی کوشش کرتا ہے۔

    • 2.1 اگر کلاس مل جاتی ہے، تو یہ کامیابی سے مکمل ہو جاتی ہے۔

    • 2.2 اگر کلاس نہیں ملتی ہے، لوڈنگ بوٹسٹریپ کلاس لوڈر کو سونپی جاتی ہے۔

  3. بوٹسٹریپ کلاس لوڈر کلاس کو اپنے کیشے میں تلاش کرنے کی کوشش کرتا ہے۔

    • 3.1 اگر کلاس مل جاتی ہے، لوڈنگ کامیابی سے مکمل ہو جاتی ہے۔

    • 3.2 اگر کلاس نہیں ملتی ہے تو، بنیادی بوٹسٹریپ کلاس لوڈر اسے لوڈ کرنے کی کوشش کرے گا۔

  4. اگر لوڈ ہو رہا ہے:

    • 4.1 کامیاب - کلاس کی لوڈنگ مکمل ہو گئی۔

    • 4.2 اگر یہ ناکام ہو جاتا ہے تو، کنٹرول ایکسٹینشن کلاس لوڈر کو منتقل کر دیا جاتا ہے۔

  5. 5. ایکسٹینشن کلاس لوڈر کلاس کو لوڈ کرنے کی کوشش کرتا ہے، اور اگر لوڈ ہو رہا ہے:

    • 5.1 کامیاب - کلاس کی لوڈنگ مکمل ہو گئی۔

    • 5.2 اگر یہ ناکام ہوجاتا ہے تو، کنٹرول سسٹم کلاس لوڈر کو منتقل کردیا جاتا ہے۔

  6. 6. سسٹم کلاس لوڈر کلاس کو لوڈ کرنے کی کوشش کرتا ہے، اور اگر لوڈ ہو رہا ہے:

    • 6.1۔ کامیاب - کلاس کی لوڈنگ مکمل ہو گئی۔

    • 6.2 کامیابی سے پاس نہیں ہوا - ایک استثناء پیدا ہوا ہے - ClassNotFoundException۔

کلاس لوڈرز کا موضوع بہت وسیع ہے اور اسے نظرانداز نہیں کیا جانا چاہیے۔ اس سے مزید تفصیل سے واقف ہونے کے لیے، میں آپ کو اس مضمون کو پڑھنے کا مشورہ دیتا ہوں ، اور ہم دیر نہیں کریں گے اور آگے بڑھیں گے۔

12. رن ٹائم ڈیٹا ایریاز کیا ہیں؟

رن ٹائم ڈیٹا ایرس - JVM رن ٹائم ڈیٹا ایریاز۔ JVM پروگرام کے عمل کے دوران درکار رن ٹائم ڈیٹا ایریاز کی وضاحت کرتا ہے۔ ان میں سے کچھ اس وقت بنتے ہیں جب JVM شروع ہوتا ہے۔ دوسرے تھریڈ لوکل ہوتے ہیں اور صرف اس وقت بنائے جاتے ہیں جب دھاگہ بن جاتا ہے (اور جب تھریڈ تباہ ہوجاتا ہے تو تباہ ہوجاتا ہے)۔ JVM رن ٹائم ڈیٹا ایریاز اس طرح نظر آتے ہیں: جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 3
  • PC رجسٹر ہر تھریڈ کے لیے مقامی ہے اور اس میں JVM انسٹرکشن کا پتہ ہوتا ہے جس پر تھریڈ فی الحال عمل کر رہا ہے۔

  • JVM Stack ایک میموری ایریا ہے جو مقامی متغیرات اور عارضی نتائج کے لیے اسٹوریج کے طور پر استعمال ہوتا ہے۔ ہر تھریڈ کا اپنا الگ اسٹیک ہوتا ہے: جیسے ہی دھاگہ ختم ہوتا ہے، یہ اسٹیک بھی تباہ ہو جاتا ہے۔ یہ بات قابل غور ہے کہ اسٹیک اوور ہیپ کا فائدہ کارکردگی ہے، جبکہ ہیپ کا یقینی طور پر اسٹوریج پیمانے میں ایک فائدہ ہے۔

  • مقامی طریقہ اسٹیک - ایک فی تھریڈ ڈیٹا ایریا جو ڈیٹا عناصر کو ذخیرہ کرتا ہے، JVM اسٹیک کی طرح، مقامی (غیر جاوا) طریقوں کو انجام دینے کے لیے۔

  • ہیپ - تمام دھاگوں کے ذریعہ اسٹوریج کے طور پر استعمال کیا جاتا ہے جس میں آبجیکٹ، کلاس میٹا ڈیٹا، اری، وغیرہ ہوتے ہیں، جو رن ٹائم پر بنائے جاتے ہیں۔ یہ علاقہ اس وقت بنتا ہے جب JVM شروع ہوتا ہے اور جب یہ بند ہوجاتا ہے تو تباہ ہوجاتا ہے۔

  • میتھڈ ایریا - یہ رن ٹائم ایریا تمام تھریڈز کے لیے عام ہے اور JVM شروع ہونے پر بنایا جاتا ہے۔ یہ ہر کلاس کے لیے ڈھانچے کو اسٹور کرتا ہے، جیسے رن ٹائم کانسٹنٹ پول، کنسٹرکٹرز اور طریقوں کے لیے کوڈ، طریقہ کار کا ڈیٹا وغیرہ۔

13. ایک ناقابل تغیر شے کیا ہے؟

مضمون کے اس حصے میں ، سوالات 14 اور 15 میں، اس سوال کا جواب پہلے ہی موجود ہے، لہذا اپنا وقت ضائع کیے بغیر ایک نظر ڈالیں۔

14. String کلاس کے بارے میں کیا خاص ہے؟

پہلے تجزیے میں، ہم نے بار بار String کی کچھ خصوصیات کے بارے میں بات کی تھی (اس کے لیے ایک الگ سیکشن تھا)۔ اب سٹرنگ کی خصوصیات کا خلاصہ کرتے ہیں :
  1. یہ جاوا میں سب سے مشہور آبجیکٹ ہے اور اسے مختلف مقاصد کے لیے استعمال کیا جاتا ہے۔ استعمال کی تعدد کے لحاظ سے، یہ قدیم اقسام سے بھی کمتر نہیں ہے۔

  2. اس کلاس کا ایک آبجیکٹ نئے مطلوبہ الفاظ کا استعمال کیے بغیر بنایا جا سکتا ہے - براہ راست کوٹس کے ذریعے String str = "string"؛ .

  3. سٹرنگ ایک غیر تبدیل شدہ کلاس ہے : اس کلاس کا کوئی شے بناتے وقت، اس کا ڈیٹا تبدیل نہیں کیا جا سکتا (جب آپ کسی خاص سٹرنگ میں + "دوسری سٹرنگ" شامل کرتے ہیں، اس کے نتیجے میں آپ کو ایک نئی، تیسری سٹرنگ ملے گی)۔ سٹرنگ کلاس کی تبدیلی اسے تھریڈ کو محفوظ بناتی ہے۔

  4. اسٹرنگ کلاس کو حتمی شکل دی گئی ہے ( حتمی ترمیم کنندہ ہے )، لہذا اسے وراثت میں نہیں مل سکتا۔

  5. سٹرنگ کا اپنا سٹرنگ پول ہے ، ڈھیر میں میموری کا ایک ایسا علاقہ جو اس کی تخلیق کردہ سٹرنگ ویلیوز کو محفوظ کرتا ہے۔ سیریز کے اس حصے میں ، سوال نمبر 62 میں، میں نے سٹرنگ پول کو بیان کیا۔

  6. جاوا میں String کے اینالاگ ہیں ، جو سٹرنگز کے ساتھ کام کرنے کے لیے بھی ڈیزائن کیے گئے ہیں - StringBuilder اور StringBuffer ، لیکن اس فرق کے ساتھ کہ وہ متغیر ہیں۔ آپ اس مضمون میں ان کے بارے میں مزید پڑھ سکتے ہیں ۔

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 4

15. قسم کا ہم آہنگی کیا ہے؟

ہم آہنگی کو سمجھنے کے لیے، ہم ایک مثال دیکھیں گے۔ ہم کہتے ہیں کہ ہمارے پاس جانوروں کی کلاس ہے:
public class Animal {
 void voice() {
   System.out.println("*тишина*");
 }
}
اور کچھ ڈاگ کلاس اسے بڑھا رہی ہے :
public class Dog extends Animal {

 @Override
 public void voice() {
   System.out.println("Гав, гав, гав!!!");
 }
}
جیسا کہ ہمیں یاد ہے، ہم وارث قسم کی اشیاء کو آسانی سے والدین کی قسم کو تفویض کر سکتے ہیں:
Animal animal = new Dog();
یہ پولیمورفزم سے زیادہ کچھ نہیں ہوگا۔ آسان، لچکدار ہے نا؟ ٹھیک ہے، جانوروں کی فہرست کے بارے میں کیا خیال ہے؟ کیا ہم ایک عام جانور کے ساتھ کتوں کی اشیاء کے ساتھ ایک فہرست دے سکتے ہیں ؟
List<Dog> dogs = new ArrayList<>();
List<Animal> animals = dogs;
اس صورت میں، کتوں کی فہرست جانوروں کی فہرست میں تفویض کرنے کی لائن سرخ رنگ میں لکھی جائے گی، یعنی کمپائلر اس کوڈ کو پاس نہیں کرے گا۔ اس حقیقت کے باوجود کہ یہ تفویض کافی منطقی معلوم ہوتا ہے (آخر کار، ہم ایک کتے آبجیکٹ کو Animal قسم کے متغیر کے لیے تفویض کر سکتے ہیں )، ایسا نہیں کیا جا سکتا۔ اس کی وجہ یہ ہے کہ اگر اس کی اجازت دی گئی تو، ہم کسی جانوروں کی چیز کو اس فہرست میں ڈال سکیں گے جس کا اصل مقصد کتا ہونا تھا ، یہ سوچتے ہوئے کہ ہمارے پاس فہرست میں صرف کتے ہیں ۔ اور پھر، مثال کے طور پر، ہم کتوں کی فہرست سے کسی چیز کو لینے کے لیے get() طریقہ استعمال کریں گے ، یہ سوچ کر کہ یہ ایک کتا ہے، اور اس پر Dog آبجیکٹ کا کچھ طریقہ کال کریں گے، جو Animal کے پاس نہیں ہے ۔ اور جیسا کہ آپ سمجھتے ہیں، یہ ناممکن ہے - ایک غلطی ہو جائے گا. لیکن، خوش قسمتی سے، مرتب کرنے والا والدین کی فہرست (اور اس کے برعکس) اولاد کی فہرست تفویض کرنے کے ساتھ اس منطقی غلطی کو نہیں چھوڑتا ہے۔ جاوا میں، آپ صرف مماثل جنرک کے ساتھ متغیرات کی فہرست کے لیے فہرست اشیاء کو تفویض کر سکتے ہیں۔ اسے invariation کہتے ہیں۔ اگر وہ ایسا کر سکتے ہیں، تو اسے کہا جائے گا اور اسے covariance کہا جائے گا۔ یعنی covariance یہ ہے کہ اگر ہم ArrayList<Dog> قسم کی کسی چیز کو List<Animal> قسم کے متغیر پر سیٹ کر سکیں ۔ یہ پتہ چلتا ہے کہ جاوا میں ہم آہنگی کی حمایت نہیں کی جاتی ہے؟ اس سے کوئی فرق نہیں پڑتا ہے کہ یہ کیسے ہے! لیکن یہ اپنے مخصوص انداز میں کیا جاتا ہے۔ ڈیزائن کس کے لیے استعمال ہوتا ہے ؟ جانوروں میں توسیع یہ متغیر کے ایک عام کے ساتھ رکھا گیا ہے جس پر ہم فہرست آبجیکٹ کو سیٹ کرنا چاہتے ہیں، نسل کے عمومی کے ساتھ۔ اس عام تعمیر کا مطلب یہ ہے کہ کوئی بھی قسم جو قسم کے Animal کی نسل ہے وہ کرے گی (اور قسم Animal بھی اس عمومی کے تحت آتی ہے)۔ بدلے میں، جانور نہ صرف ایک کلاس ہو سکتا ہے، بلکہ ایک انٹرفیس بھی ہو سکتا ہے ( extensions کی ورڈ سے بے وقوف نہ بنیں )۔ ہم اپنی پچھلی اسائنمنٹ کو اس طرح کر سکتے ہیں: جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 5
List<Dog> dogs = new ArrayList<>();
List<? extends Animal> animals = dogs;
نتیجے کے طور پر، آپ IDE میں دیکھیں گے کہ مرتب کرنے والا اس تعمیر کے بارے میں شکایت نہیں کرے گا۔ آئیے اس ڈیزائن کی فعالیت کو چیک کریں۔ ہم کہتے ہیں کہ ہمارے پاس ایک ایسا طریقہ ہے جس کی وجہ سے تمام جانور اس تک پہنچ کر آوازیں نکالتے ہیں:
public static void animalsVoice(List<? extends Animal> animals) {
 for (Animal animal : animals) {
   animal.voice();
 }
}
آئیے اسے کتوں کی فہرست دیتے ہیں:
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
dogs.add(new Dog());
dogs.add(new Dog());
animalsVoice(dogs);
کنسول میں ہم درج ذیل آؤٹ پٹ دیکھیں گے۔
ووف ووف وووف!!! ووف وووف واو!!! ووف وووف واو!!!
اس کا مطلب ہے کہ ہم آہنگی کا یہ طریقہ کامیابی سے کام کرتا ہے۔ مجھے نوٹ کرنے دو کہ یہ عام فہرست میں شامل ہے ؟ Animal کو توسیع دیتا ہے ہم کسی بھی قسم کا نیا ڈیٹا داخل نہیں کر سکتے ہیں: نہ تو Dog type ، اور نہ ہی Animal type :
List<Dog> dogs = new ArrayList<>();
List<? extends Animal> animals = dogs;
animals.add(new Dog());
dogs.add(new Animal());
دراصل، آخری دو سطروں میں کمپائلر سرخ رنگ میں اشیاء کے اندراج کو نمایاں کرے گا۔ یہ اس حقیقت کی وجہ سے ہے کہ ہم سو فیصد اس بات کا یقین نہیں کر سکتے ہیں کہ عام جانوروں کو بڑھاتا ہے> میں contravarianceجاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 6 کے بارے میں بھی بات کرنا چاہوں گا ، کیونکہ عام طور پر یہ تصور ہمیشہ covariance کے ساتھ ہوتا ہے، اور ایک اصول کے طور پر ان سے ان کے بارے میں پوچھا جاتا ہے۔ یہ تصور کسی حد تک ہم آہنگی کے برعکس ہے، کیونکہ اس تعمیر میں وارث کی قسم استعمال ہوتی ہے۔ ہم کہتے ہیں کہ ہم ایک فہرست چاہتے ہیں جس میں قسم کی اشیاء کی فہرست تفویض کی جاسکتی ہے جو Dog آبجیکٹ کے آباؤ اجداد نہیں ہیں ۔ تاہم، ہم پہلے سے نہیں جانتے کہ وہ کون سی مخصوص اقسام ہوں گی۔ اس صورت میں، فارم کی تعمیر ؟ سپر ڈاگ ، جس کے لیے تمام اقسام موزوں ہیں - ڈاگ کلاس کے پروجینٹرز :
List<Animal> animals = new ArrayList<>();
List<? super Dog> dogs = animals;
dogs.add(new Dog());
dogs.add(new Dog());
ہم بحفاظت ڈاگ ٹائپ کی اشیاء کو اس طرح کے عام کے ساتھ فہرست میں شامل کر سکتے ہیں ، کیونکہ کسی بھی صورت میں اس میں اس کے کسی بھی آباؤ اجداد کے نافذ کردہ تمام طریقے موجود ہیں۔ لیکن ہم Animal قسم کی کسی چیز کو شامل کرنے کے قابل نہیں ہوں گے ، کیونکہ اس بات کا کوئی یقین نہیں ہے کہ اس کے اندر اس قسم کی چیزیں ہوں گی، اور نہیں، مثال کے طور پر، Dog ۔ بہر حال، ہم اس فہرست کے ایک عنصر سے ڈاگ کلاس کے طریقہ کار کی درخواست کر سکتے ہیں، جو جانوروں کے پاس نہیں ہوگا ۔ اس صورت میں، ایک تالیف کی خرابی واقع ہوگی۔ اس کے علاوہ، اگر ہم پچھلے طریقہ کو نافذ کرنا چاہتے ہیں، لیکن اس عام کے ساتھ:
public static void animalsVoice(List<? super Dog> dogs) {
 for (Dog dog : dogs) {
   dog.voice();
 }
}
ہمیں for loop میں تالیف کی خرابی ملے گی ، کیونکہ ہم اس بات کا یقین نہیں کر سکتے کہ واپس کی گئی فہرست میں Dog قسم کی اشیاء شامل ہیں اور وہ اس کے طریقے استعمال کرنے کے لیے آزاد ہیں۔ اگر ہم اس فہرست میں dogs.get(0) طریقہ کو کہتے ہیں۔ - ہمیں آبجیکٹ قسم کی ایک چیز ملے گی ۔ یعنی، animalsVoice() طریقہ کار کے کام کرنے کے لیے ، ہمیں کم از کم قسم کے ڈیٹا کو تنگ کرنے کے ساتھ چھوٹی چھوٹی ہیرا پھیری شامل کرنے کی ضرورت ہے:
public static void animalsVoice(List<? super Dog> dogs) {
 for (Object obj : dogs) {
   if (obj instanceof Dog) {
     Dog dog = (Dog) obj;
     dog.voice();
   }
 }
}
جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 7

16. آبجیکٹ کلاس میں طریقے کیسے ہیں؟

سیریز کے اس حصے میں ، پیراگراف 11 میں، میں پہلے ہی اس سوال کا جواب دے چکا ہوں، لہذا میں آپ کو سختی سے مشورہ دیتا ہوں کہ اگر آپ نے ابھی تک ایسا نہیں کیا ہے تو اسے پڑھیں۔ یہ وہ جگہ ہے جہاں ہم آج کے لیے ختم کریں گے۔ اگلے حصے میں ملتے ہیں! جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 15 - 8
سیریز میں دیگر مواد:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION