JavaRush /جاوا بلاگ /Random-SD /جاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو. حصو ...

جاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو. حصو 15

گروپ ۾ شايع ٿيل
هاءِ هاءِ! جاوا ڊولپر کي ڪيترو ڄاڻڻ جي ضرورت آهي؟ توهان هن مسئلي تي هڪ ڊگهي وقت تائين بحث ڪري سگهو ٿا، پر سچ اهو آهي ته انٽرويو ۾ توهان کي نظريي سان مڪمل طور تي هلائي ويندي. جيتوڻيڪ علم جي انهن علائقن ۾ جيڪي توهان کي توهان جي ڪم ۾ استعمال ڪرڻ جو موقعو نه هوندو. جاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو.  حصو 15 - 1خير، جيڪڏهن توهان شروعاتي آهيو، توهان جي نظرياتي ڄاڻ کي تمام سنجيده ورتو ويندو. جيئن ته اڃا تائين ڪو به تجربو ۽ عظيم ڪاميابيون نه آهن، اهو سڀ ڪجهه رهي ٿو علم جي بنياد جي طاقت کي جانچڻ لاء. اڄ اسان جاوا ڊولپرز لاءِ سڀ کان وڌيڪ مشهور انٽرويو سوالن جي جانچ ڪندي هن بنيادي بنياد کي مضبوط ڪندا رهنداسين. اچو ته پرواز ڪريون!

جاوا ڪور

9. جاوا ۾ جامد ۽ متحرڪ پابند جي وچ ۾ ڇا فرق آهي؟

مون اڳ ۾ ئي هن سوال جو جواب هن مضمون ۾ سوال 18 ۾ جامد ۽ متحرڪ پوليمورفيزم بابت ڏنو آهي، مان توهان کي پڙهڻ جي صلاح ڏيان ٿو.

10. ڇا انٽرفيس ۾ پرائيويٽ يا محفوظ ٿيل متغير استعمال ڪرڻ ممڪن آھي؟

نه توهان نٿا ڪري سگهو. ڇاڪاڻ ته جڏهن توهان هڪ انٽرفيس جو اعلان ڪيو ٿا، جاوا ڪمپلر خودڪار طريقي سان عوامي ۽ خلاصا لفظ شامل ڪري ٿو انٽرفيس جي طريقن کان اڳ ۽ عوامي ، جامد ۽ حتمي لفظن کي ڊيٽا ميمبرن کان اڳ. دراصل، جيڪڏهن توهان شامل ڪيو پرائيويٽ يا محفوظ ، هڪ تڪرار پيدا ٿيندو ، ۽ گڏ ڪرڻ وارو پيغام سان رسائي موڊيفائر جي باري ۾ شڪايت ڪندو: “موڊيفائر '<selected modifier>' هتي اجازت ناهي . انٽرفيس ۾ variables؟ اچو ته ان کي سمجهون:
  • عوامي - انٽرفيس ڪلائنٽ کي اعتراض سان لهه وچڙ ڪرڻ جي اجازت ڏئي ٿو. جيڪڏهن متغير عوامي نه هئا، گراهڪن کي انهن تائين رسائي نه هوندي.
  • جامد - انٽرفيس پيدا نه ٿو ڪري سگھجي (يا بلڪه، انهن جون شيون)، تنهنڪري متغير جامد آهي.
  • فائنل - جيئن ته انٽرفيس 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 ۾ ايپليڪيشن-سطح جي سڀني ڪلاسن کي لوڊ ڪرڻ جو خيال رکي ٿو. اهو ڪلاس ماحول ۾ ملندڙ فائلن کي لوڊ ڪري ٿو variable -classpath يا -cp ڪمانڊ لائن آپشن.

جاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو.  حصو 15 - 2ڪلاس لوڊ ڪندڙ جاوا رن ٽائم جو حصو آهن. جنهن وقت JVM ڪلاس جي درخواست ڪري ٿو، ڪلاس لوڊر ڪلاس ڳولڻ جي ڪوشش ڪري ٿو ۽ ڪلاس جي مڪمل طور تي قابل نالو استعمال ڪندي رن ٽائم ۾ ڪلاس جي تعريف لوڊ ڪري ٿو. java.lang.ClassLoader.loadClass() طريقو رن ٽائم تي ڪلاس جي تعريف کي لوڊ ڪرڻ جو ذميوار آهي. اهو ان جي مڪمل نالي جي بنياد تي ڪلاس لوڊ ڪرڻ جي ڪوشش ڪري ٿو. جيڪڏهن ڪلاس اڃا لوڊ نه ڪيو ويو آهي، اهو درخواست کي پيش ڪري ٿو والدين ڪلاس لوڊ ڪندڙ کي. اهو عمل بار بار ٿئي ٿو ۽ هن وانگر ڏسڻ ۾ اچي ٿو:
  1. سسٽم ڪلاس لوڊر ڪلاس کي ان جي ڪيش ۾ ڳولڻ جي ڪوشش ڪري ٿو.

    • 1.1. جيڪڏهن ڪلاس مليو آهي، لوڊشيڊنگ ڪاميابي سان مڪمل ٿي وئي آهي.

    • 1.2. جيڪڏهن ڪلاس نه مليو آهي، لوڊ ڪرڻ کي وڌايو ويندو آهي ايڪسٽينشن ڪلاس لوڊر.

  2. ايڪسٽينشن ڪلاس لوڊر ڪلاس کي پنهنجي ڪيش ۾ ڳولڻ جي ڪوشش ڪري ٿو.

    • 2.1. جيڪڏهن ڪلاس ملي ٿو، اهو ڪاميابي سان پورو ٿئي ٿو.

    • 2.2. جيڪڏهن ڪلاس نه ملي، لوڊشيڊنگ بوٽ اسٽريپ ڪلاس لوڊر ڏانهن موڪلي وئي آهي.

  3. Bootstrap Classloader ڪوشش ڪري ٿو ڪلاس کي پنهنجي ڪيش ۾ ڳولڻ جي.

    • 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 اسٽيڪ هڪ ميموري علائقو آهي جيڪو مقامي متغير ۽ عارضي نتيجن لاء اسٽوريج طور استعمال ڪيو ويندو آهي. هر سلسلي جو پنهنجو الڳ اسٽيڪ هوندو آهي: جيئن ئي ڌاڳو ختم ٿئي ٿو، اهو اسٽيڪ پڻ تباهه ٿي ويندو آهي. اهو سمجهڻ جي قابل آهي ته اسٽيڪ اوور هيپ جو فائدو ڪارڪردگي آهي، جڏهن ته هيپ يقيني طور تي اسٽوريج پيماني ۾ هڪ فائدو آهي.

  • Native Method 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. قسم covariance ڇا آهي؟

covariance کي سمجهڻ لاءِ، اسان هڪ مثال ڏينداسين. اچو ته چوندا آهن ته اسان وٽ هڪ جانور طبقو آهي:
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() طريقو ان ڪتن جي فهرست مان هڪ اعتراض کڻڻ لاءِ ، اهو سوچڻ ته اهو هڪ ڪتو آهي، ۽ ان تي ڪتي اعتراض جو ڪجهه طريقو سڏينداسين، جيڪو جانور وٽ ناهي . ۽ جيئن توهان سمجهي، اهو ناممڪن آهي - هڪ غلطي ٿيندي. پر، خوشقسمتيءَ سان، مرتب ڪندڙ هن منطقي غلطي کي نه وڃايو آهي اولاد جي هڪ فهرست کي والدين جي فهرست ۾ تفويض ڪرڻ سان (۽ ان جي برعڪس). جاوا ۾، توهان صرف فهرست جي شين کي تفويض ڪري سگهو ٿا متغيرن جي فهرست سان ملندڙ جنريڪس سان. اهو invariation سڏيو ويندو آهي. جيڪڏھن اھي ائين ڪري سگھن، اھو سڏيو ويندو ۽ سڏيو ويندو covariance. اهو آهي، covariance اهو آهي جيڪڏهن اسان هڪ قسم جي اعتراض کي سيٽ ڪري سگهون ٿا ArrayList<Dog> قسم جي هڪ متغير کي List<Animal> . اهو ظاهر ٿئي ٿو ته covariance جاوا ۾ سهڪار نه آهي؟ ڪا به ڳالهه ناهي ته ڪيئن آهي! پر اهو ڪم پنهنجي خاص طريقي سان ڪيو ويندو آهي. ڊزائن ڇا لاء استعمال ڪيو ويو آهي ؟ جانورن کي وڌايو . اهو رکيل آهي متغير جي عام سان جنهن تي اسان لسٽ اعتراض کي سيٽ ڪرڻ چاهيون ٿا، نسل جي عام سان. هن عام تعمير جو مطلب اهو آهي ته ڪنهن به قسم جو نسل آهي جيڪو جانور جي قسم جو آهي (۽ قسم جو جانور پڻ هن جنرلائيزيشن هيٺ اچي ٿو). موڙ ۾، جانور نه رڳو هڪ ڪلاس ٿي سگهي ٿو، پر هڪ انٽرفيس پڻ ( expensed keyword کان بيوقوف نه ٿيو ). اسان پنهنجي پوئين اسائنمنٽ کي هن طرح ڪري سگهون ٿا: جاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو.  حصو 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);
ڪنسول ۾ اسان هيٺ ڏنل آئوٽ ڏسنداسين:
ووف ووف ووف!!! ووف ووف ووف!!! ووف ووف ووف!!!
هن جو مطلب آهي ته covariance جو هي طريقو ڪاميابي سان ڪم ڪري ٿو. مون کي نوٽ ڪرڻ ڏيو ته هي عام فهرست ۾ شامل آهي ؟ جانورن کي وڌايو اسان ڪنهن به قسم جي نئين ڊيٽا داخل نٿا ڪري سگهون: نه ڪتي جو قسم ، ۽ نه ئي جانور جو قسم :
List<Dog> dogs = new ArrayList<>();
List<? extends Animal> animals = dogs;
animals.add(new Dog());
dogs.add(new Animal());
دراصل، آخري ٻن لائينن ۾ ڪمپيلر شين جي داخل ٿيڻ کي ڳاڙهي رنگ ۾ نمايان ڪندو. اهو ان حقيقت جي ڪري آهي ته اسان هڪ سئو سيڪڙو يقين نه ٿا ڪري سگهون ته ڪهڙي قسم جي شين جي فهرست کي عام طور تي ڊيٽا سان لسٽ ۾ لڳايو ويندو . وڌايو جانور > . مان تضادجاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو.  حصو 15 - 6 جي باري ۾ پڻ ڳالهائڻ چاهيان ٿو ، ڇاڪاڻ ته عام طور تي اهو تصور هميشه covariance سان گڏ هوندو آهي، ۽ ضابطي جي طور تي انهن بابت پڇيو ويندو آهي. اهو تصور ڪجهه حد تائين covariance جي برعڪس آهي، ڇاڪاڻ ته هي تعمير وارث قسم استعمال ڪري ٿو. اچو ته چئو ته اسان هڪ فهرست چاهيون ٿا جنهن ۾ قسم جي شين جي هڪ فهرست مقرر ڪري سگهجي ٿي جيڪي ڪتا اعتراض جا ابا ڏاڏا نه آهن . تنهن هوندي، اسان اڳ ۾ نه ٿا ڄاڻون ته اهي ڪهڙيون مخصوص قسمون هونديون. انهي صورت ۾، فارم جي تعمير ؟ سپر ڪتو ، جنهن لاءِ سڀ قسم موزون آهن - ڪتي طبقي جا پروجنيٽرز :
List<Animal> animals = new ArrayList<>();
List<? super Dog> dogs = animals;
dogs.add(new Dog());
dogs.add(new Dog());
اسان محفوظ طور تي ڪتن جي قسم جي شين کي فهرست ۾ شامل ڪري سگھون ٿا اهڙي عام سان ، ڇاڪاڻ ته ڪنهن به صورت ۾ ان جي سڀني ابن ڏاڏن جي سڀني طريقن تي عمل ڪيو ويو آهي. پر اسان Animal قسم جي ڪنهن شئي کي شامل ڪرڻ جي قابل نه هوندا ، ڇاڪاڻ ته اتي ڪا به پڪ ناهي ته هن قسم جون شيون اندر هونديون، ۽ نه، مثال طور، ڪتو . آخرڪار، اسان هن فهرست جي هڪ عنصر کان ڪتي طبقي جو هڪ طريقو درخواست ڪري سگهون ٿا، جيڪو جانور نه هوندو . انهي صورت ۾، هڪ تاليف جي غلطي ٿيندي. انهي سان گڏ، جيڪڏهن اسان پوئين طريقي کي لاڳو ڪرڻ چاهيندا، پر هن عام سان:
public static void animalsVoice(List<? super Dog> dogs) {
 for (Dog dog : dogs) {
   dog.voice();
 }
}
اسان کي for loop ۾ هڪ تاليف جي غلطي ملندي ، ڇو ته اسان پڪ نه ٿا ڪري سگھون ته واپسي لسٽ ۾ قسم جون شيون شامل آهن Dog ۽ ان جا طريقا استعمال ڪرڻ لاء آزاد آهن. جيڪڏهن اسان سڏين ٿا dogs.get(0) طريقو هن لسٽ تي . - اسان کي قسم جو اعتراض حاصل ڪنداسين Object . اھو آھي، 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. Object ڪلاس ۾ ڪئين طريقا آهن؟

سيريز جي هن حصي ۾ ، پيراگراف 11 ۾، مون اڳ ۾ ئي هن سوال جو جواب ڏنو آهي، تنهنڪري آئون توهان کي مشورو ڏيان ٿو ته ان کي پڙهو جيڪڏهن توهان اڃا تائين نه ڪيو آهي. اهو آهي جتي اسان اڄ تائين ختم ڪنداسين. ايندڙ حصي ۾ ملنداسين! جاوا ڊولپر لاءِ انٽرويوز کان سوالن ۽ جوابن جو تجزيو.  حصو 15 - 8
سيريز ۾ ٻيا مواد:
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION