هيلو سڀني کي، خواتين ۽ حضرات، سافٽ ويئر انجنيئر! اچو ته انٽرويو سوالن بابت ڳالهايو. انهي بابت جيڪو توهان کي تيار ڪرڻ جي ضرورت آهي ۽ توهان کي ڄاڻڻ جي ضرورت آهي. هي هڪ بهترين وقت آهي جائزو وٺڻ يا انهن نقطن جو پهريون ڀيرو مطالعو ڪرڻ لاءِ. جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 1 مون او او پي، جاوا نحو، جاوا استثنا، مجموعا، ۽ ملٽي ٿريڊنگ بابت اڪثر پڇيا ويندڙ سوالن جو هڪ وسيع مجموعو ختم ڪيو، جنهن کي مان سهولت لاءِ ڪيترن ئي حصن ۾ ورهائيندس. اهو ڏکيو آهي ته هڪ ڀيرو هر شيء کي ڍڪڻ، پر مون کي اميد آهي ته هي مواد انهن لاء سٺو بنياد فراهم ڪندو جيڪي هڪ پروگرامر جي طور تي پنهنجي پهرين نوڪري ڳولڻ جي تياري ڪري رهيا آهن. بھترين سمجھڻ ۽ برقرار رکڻ لاءِ، مان صلاح ڏيان ٿو ٻين ذريعن ذريعي گڏ ڪرڻ. توهان ڪيترن ئي مختلف زاوين کان ان کي پهچڻ سان هڪ تصور جي گهڻي گرفت حاصل ڪري سگهو ٿا. اهم:اسان صرف 8 ورجن کان اڳ جاوا جي باري ۾ ڳالهائينداسين. 9، 10، 11، 12، ۽ 13 ورزن ۾ آيل سڀئي جدتون هتي غور نه ڪيون وينديون. جوابن کي بهتر ڪرڻ بابت ڪي به خيال/تبصرا ڀليڪار آهن . توهان جي پڙهڻ جو مزو وٺو. اچو ته هلون!

جاوا انٽرويو: OOP بابت سوال

1. جاوا جون خاصيتون ڇا آهن؟

جواب:
  1. OOP تصورات:

    1. اعتراض جو رخ
    2. وراثت
    3. encapsulation
    4. پوليمورفيزم
    5. خلاصو
  2. ڪراس پليٽ فارم: هڪ جاوا پروگرام ڪنهن به پليٽ فارم تي بغير ڪنهن تبديلي جي هلائي سگهجي ٿو. يقينن، اهو هڪ نصب ٿيل JVM (جاوا ورچوئل مشين) جي ضرورت آهي.

  3. اعلي ڪارڪردگي: Just-In-Time (JIT) مرتب ڪندڙ اعلي ڪارڪردگي کي ممڪن بڻائي ٿو. JIT مرتب ڪندڙ بائيٽ ڪوڊ کي مشين ڪوڊ ۾ تبديل ڪري ٿو ۽ پوءِ JVM عمل شروع ڪري ٿو.

  4. ملٽي ٿريڊنگ: JVM عمل جو هڪ ٿريڊ ٺاهي ٿو جنهن کي main thread. هڪ پروگرامر ٿريڊ ڪلاس مان حاصل ڪري يا Runnableانٽرفيس کي لاڳو ڪندي ڪيترن ئي موضوعن کي ٺاهي سگھي ٿو.

2. وراثت ڇا آهي؟

وراثت جو مطلب آهي ته هڪ طبقو ٻئي طبقي کي ورثي ۾ ڏئي سگهي ٿو (استعمال ڪندي لفظ استعمال ڪندي ). ان جو مطلب آهي ته توهان ٻيهر استعمال ڪري سگهو ٿا ڪوڊ ان ڪلاس مان جيڪو توهان ورثي ۾ حاصل ڪيو آهي. موجوده طبقي کي سڏيو ويندو آهي superclass۽ نئون ٺهيل طبقو آهي subclass. ماڻهو پڻ چوندا آهن اصطلاح استعمال ڪريو والدين ۽ child.
public class Animal {
   private int age;
}

public class Dog extends Animal {

}
ڪٿي Animalآهي parent۽ Dogآهي child.

3. encapsulation ڇا آهي؟

اهو سوال اڪثر پڇيو ويندو آهي انٽرويو ۾ جاوا ڊولپر جي پوزيشن لاءِ. Encapsulation عمل کي لڪائي رهيو آهي رسائي تبديل ڪندڙ، حاصل ڪندڙ، ۽ سيٽرز استعمال ڪندي. اهو ڪيو ويو آهي ٻاهرين رسائي کي روڪڻ لاءِ جتي به ڊولپر سمجهن ٿا ته اهو ضروري آهي. حقيقي زندگي مان هڪ سادي مثال ڪار آهي. اسان کي انجڻ جي آپريشن تائين ڪا به سڌي رسائي نه آهي. اسان کي صرف اهو ڪرڻو آهي ته چاٻي کي انجڻ ۾ وجهي ۽ انجڻ کي ڦيرايو. اهي عمل جيڪي هود هيٺ ٿين ٿا، اسان جو ڪو به ڪاروبار ناهي. ان کان علاوه، جيڪڏهن اسان انجڻ جي سرگرمي ۾ مداخلت ڪندا هئاسين، اهو هڪ غير متوقع صورتحال پيدا ڪري سگهي ٿو، ممڪن طور تي ڪار کي نقصان پهچائي ۽ نتيجي ۾ جسماني نقصان. بلڪل ائين ئي پروگرامنگ ۾ ٿئي ٿو. اهو وڪيپيڊيا تي چڱي طرح بيان ڪيو ويو آهي . CodeGym تي encapsulation بابت پڻ هڪ مضمون آهي .

4. پوليمورفيزم ڇا آهي؟

پوليمورفيزم (Polymorphism) ھڪ پروگرام جي صلاحيت آھي جنھن کي ھڪڙي ئي انٽرفيس سان ھڪڙي طريقي سان علاج ڪرڻ جي قابل آھي، بغير ڪنھن شئي جي مخصوص قسم جي ڄاڻ جي. جيئن چوڻي آهي، "هڪ انٽرفيس - ڪيترائي عمل". پوليمورفيزم سان، توهان مختلف قسمن جي شين کي گڏ ڪري ۽ استعمال ڪري سگهو ٿا گڏيل رويي جي بنياد تي. مثال طور، اسان وٽ ھڪڙو جانور طبقو آھي جنھن جا ٻه اولاد آھن: ڪتو ۽ ٻلي. عام جانورن جي طبقن ۾ هڪ رويي آهي جيڪو سڀني سان حصيداري ڪري ٿو، آواز ٺاهڻ جي صلاحيت. اسان پوليمورفڪ صلاحيتون استعمال ڪندا آهيون جڏهن اسان کي هر شي کي گڏ ڪرڻ جي ضرورت آهي جيڪا جانورن جي طبقي کي ورثي ۾ ملي ٿي ۽ "ميڪ آواز" طريقي سان عمل ڪريو. هتي اهو ڪيئن ڏسڻ ۾ اچي ٿو:
List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
ٻين لفظن ۾، پوليمورفيزم مددگار آهي. ۽ اهو پڻ پوليمورفڪ (اوور لوڊ ٿيل) طريقن تي لاڳو ٿئي ٿو. پوليمورفيزم ڪيئن استعمال ڪجي

جاوا نحو بابت انٽرويو سوال

5. جاوا ۾ تعمير ڪندڙ ڇا آهي؟

تعمير ڪندڙ ھيٺيون خاصيتون آھن:
  1. جڏهن هڪ نئون اعتراض ٺاهيو ويندو آهي، پروگرام ان کي ٺاهڻ لاء مناسب تعمير ڪندڙ استعمال ڪندو آهي.
  2. ھڪڙي ٺاھيندڙ ھڪڙي طريقي وانگر آھي. ان جي مخصوص خصوصيت ان حقيقت ۾ آهي ته واپسي جي ڪا به قيمت نه آهي (بشمول باطل) ۽ اهو نالو ڪلاس جي نالي سان ساڳيو آهي.
  3. جيڪڏهن ڪو تعمير ڪندڙ واضح طور تي پيدا نه ڪيو ويو آهي، هڪ خالي تعمير ڪندڙ خودڪار طور تي ٺاهي وئي آهي.
  4. ھڪڙي ٺاھيندڙ کي ختم ڪري سگھجي ٿو.
  5. جيڪڏھن توھان ھڪڙي ٺاھيندڙ جو اعلان ڪريو پيراميٽرن سان پر ھڪڙي ھڪڙي جي ضرورت آھي بغير پيراميٽر جي، پوء توھان ان کي الڳ الڳ ٺاھيو، ڇو ته اھو خودڪار طور تي ٺاھيو نه ويندو.

6. ڪهڙن ٻن طبقن کي وراثت ۾ اعتراض نه آهي؟

چال سوالن سان بيوقوف نه ٿيو - اهڙا ڪي به طبقا نه آهن. سڀ طبقن کي وراثت ۾ اعتراض طبقي يا ته سڌو يا ابن ڏاڏن جي ذريعي!

7. مقامي متغير ڇا آهي؟

هي هڪ ٻيو مشهور انٽرويو سوال آهي جاوا ڊولپرز لاءِ. مقامي متغير ھڪڙو متغير آھي جيڪو ھڪڙي طريقي جي اندر بيان ڪيو ويو آھي ۽ موجود آھي جيستائين طريقي سان عمل ڪيو وڃي. جيئن ئي عمل ختم ٿئي ٿو، مقامي متغير موجود ٿيڻ بند ٿي وڃي ٿو. هتي هڪ پروگرام آهي جيڪو استعمال ڪري ٿو مقامي متغير نالي helloMessage main() طريقي ۾:
public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. هڪ مثال متغير ڇا آهي؟

هڪ مثال متغير هڪ متغير آهي جيڪو هڪ طبقي اندر اعلان ڪيو ويو آهي. اهو موجود آهي جيستائين هڪ شئي موجود آهي. مثال طور، اسان وٽ هڪ بي ڪلاس آهي، جنهن ۾ ٻه مثالي متغير آهن - نيڪار لوڊ ۽ ميڪس نيڪٽر لوڊ:
public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;

  ...
}

9. رسائي تبديل ڪندڙ ڇا آهن؟

Access modifiers ڪلاسن، طريقن ۽ متغيرن تائين رسائي کي ترتيب ڏيڻ لاءِ هڪ ميکانيزم آهن. ھيٺ ڏنل تبديليون موجود آھن، پھچ وڌائڻ جي ترتيب ۾ درج ٿيل آھن:
  1. private- هي رسائي موڊيفائر استعمال ڪيو ويندو آهي طريقن، شعبن ۽ تعمير ڪندڙن تي. رسائي ان طبقي تائين محدود آهي جنهن ۾ اهي اعلان ڪيا ويا آهن.
  2. package-private (default)- هي ڪلاسن لاءِ ڊفالٽ رسائي جي سطح آهي. رسائي مخصوص پيڪيج تائين محدود آهي جنهن ۾ هڪ طبقي، طريقو، متغير، يا تعمير ڪندڙ جو اعلان ڪيو ويو آهي.
  3. protected- هي رسائي موڊيفائر ساڳي رسائي جي سطح پيش ڪري ٿو جيئن package-privateڪلاسن لاءِ رسائي جي اضافي سان جيڪي وراثت واري طبقي سان گڏ هجن protected.
  4. public- هي رسائي جي سطح پڻ استعمال ڪئي وئي آهي ڪلاسن لاءِ. ھن رسائي جي سطح جو مطلب آھي اتي پوري رسائي آھي پوري اپليڪيشن ۾.
جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 2

10. طريقه اوور رائڊنگ ڇا آهي؟

اسان طريقن کي ختم ڪريون ٿا جڏهن ٻار ڪلاس پنهنجي والدين طبقي جي رويي کي تبديل ڪرڻ چاهي ٿو. جيڪڏهن اسان کي اهو ڪرڻ جي ضرورت آهي جيڪا والدين جي طريقي ۾ آهي، اسان استعمال ڪري سگهون ٿا super.methodName() ٻار ۾، جيڪو والدين جي طريقي تي عمل ڪندو. اسان ان کان پوء اسان جي اضافي منطق شامل ڪري سگهون ٿا. ضرورتن جو مشاهدو ڪيو وڃي:
  • دستخط جو طريقو ساڳيو هجڻ گهرجي
  • واپسي جو قدر ساڳيو هجڻ گهرجي

11. طريقا دستخط ڇا آهن؟

جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 3هڪ طريقو دستخط طريقو جو نالو ۽ دليلن جو ميلاپ آهي جيڪو طريقو وٺندو آهي. طريقو دستخط هڪ طريقو جي منفرد سڃاڻپ ڪندڙ آهي جڏهن طريقن کي اوورلوڊ ڪيو وڃي.

12. اوور لوڊ ڪرڻ جو طريقو ڇا آهي؟

طريقو اوور لوڊ ڪرڻ پوليمورفيزم جي هڪ خاصيت آهي جنهن ۾ اسان ڪيترن ئي طريقن کي ٺاهڻ لاءِ طريقي جي دستخط کي تبديل ڪندا آهيون جيڪي ساڳيو عمل انجام ڏين ٿا:
  • ساڳيو نالو
  • مختلف دليل
  • واپسي جا مختلف قسم ٿي سگهن ٿا
مثال طور، ArrayListطبقي جو add()طريقو اوورلوڊ ٿي سگهي ٿو، اسان کي مختلف طريقن سان شامل ڪرڻ جي اجازت ڏئي ٿي ان پٽ جي دليلن جي بنياد تي:
  • add(Object o)- اهو طريقو صرف هڪ اعتراض شامل ڪري ٿو
  • add(int index, Object o)- هي طريقو هڪ خاص انڊيڪس تي اعتراض شامل ڪري ٿو
  • add(Collection<Object> c)- هي طريقو شيون جي فهرست شامل ڪري ٿو
  • add(int index, Collection<Object> c)- هي طريقو هڪ مخصوص انڊيڪس کان شروع ٿيندڙ شين جي فهرست شامل ڪري ٿو.

13. هڪ انٽرفيس ڇا آهي؟

جاوا ڪيترن ئي ورثي جي حمايت نٿو ڪري. ان حد کي ختم ڪرڻ لاءِ، انٽرفيس شامل ڪيا ويا int he form that we know and love ؛) هڪ ڊگهي وقت تائين، انٽرفيسز ۾ صرف طريقا هئا بغير ڪنهن عمل جي. ان جواب جي سلسلي ۾ اچو ته انهن جي باري ۾ ڳالهايون. مثال طور:

public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
ڪجھ تفصيل هن ريت آهن:
  • انٽرفيس ۾ سڀ طريقا عوامي ۽ خلاصا آھن
  • سڀئي متغير عوامي جامد فائنل آهن
  • ڪلاس انٽرفيس کي ورثي ۾ نه ٿا ملن (يعني اسين extensions لفظ استعمال نٿا ڪريون). ان جي بدران، طبقن انهن کي لاڳو ڪن ٿا (يعني اسين استعمال ڪندا آهيون لاڳو ڪيل لفظ). ان کان علاوه، توھان لاڳو ڪري سگھوٿا گھڻا انٽرفيس جيئن توھان چاھيو.
  • ڪلاس جيڪي هڪ انٽرفيس کي لاڳو ڪن ٿا انهن کي لازمي طور تي انهن سڀني طريقن جو نفاذ مهيا ڪرڻ گهرجي جيڪي انٽرفيس ۾ آهن.
هن وانگر:
public class Cat implements Animal {
   public void makeSound() {
       // Method implementation
   }

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. هڪ انٽرفيس ۾ ڊفالٽ طريقو ڇا آهي؟

هاڻي اچو ته ڊفالٽ طريقن بابت ڳالهايون. اهي ڇا لاء آهن؟ اهي ڪنهن لاءِ آهن؟ اهي طريقا شامل ڪيا ويا "ٻنهي هٿن" جي خدمت ڪرڻ لاء. مان ڪهڙي ڳالهه ڪري رهيو آهيان؟ خير، هڪ طرف، نئين ڪارڪردگي شامل ڪرڻ جي ضرورت هئي: lambdas ۽ اسٽريم API. ٻئي طرف، اهو ضروري هو ته برقرار رکڻ لاء جاوا ڇا مشهور آهي - پوئتي مطابقت. هن کي ڪرڻ لاء، انٽرنيٽ کي ڪجهه نئين تيار ڪيل حل جي ضرورت آهي. هي ڪيئن ڊفالٽ طريقا اسان وٽ آيا. هڪ ڊفالٽ طريقو هڪ انٽرفيس ۾ لاڳو ڪيل طريقو آهي، defaultلفظ سان نشان لڳل آهي. stream()مثال طور، انٽرفيس ۾ معروف طريقو Collection. مون کي يقين ڪر، هي انٽرفيس ايترو سادو ناهي جيترو اهو لڳي ٿو. forEach()يا انٽرفيس ۾ پڻ ساڳيو مشهور طريقو Iterable. اهو پڻ موجود نه هو جيستائين ڊفالٽ طريقا شامل ڪيا ويا. رستي جي ذريعي، توهان ان بابت پڻ پڙهي سگهو ٿا CodeGym هتي .

15. پوءِ ڪيئن اسان ٻه هڪجهڙا ڊفالٽ طريقا ورثي ۾ حاصل ڪريون؟

اڳئين جواب جي باري ۾ ڇا هڪ ڊفالٽ طريقو آهي ٻيو سوال. جيڪڏهن توهان انٽرفيس ۾ طريقا لاڳو ڪري سگهو ٿا، پوء نظرياتي طور تي توهان ساڳئي طريقي سان ٻه انٽرفيس لاڳو ڪري سگهو ٿا. اسان اهو ڪيئن ٿا ڪريون؟ هتي هڪ ئي طريقي سان ٻه مختلف انٽرفيس آهن:
interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
۽ اسان وٽ ھڪڙو طبقو آھي جيڪو انھن ٻن انٽرفيس کي لاڳو ڪري ٿو. پر صرف اسان انٽرفيس اي يا بي ۾ هڪ مخصوص طريقو ڪيئن چونڊيو ٿا؟ هيٺ ڏنل خاص تعمير هن کي اجازت ڏئي ٿو A.super.foo():
public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
ان ڪري، طريقو انٽرفيس جو fooA()ڊفالٽ طريقو استعمال ڪندو ، جڏهن ته طريقو انٽرفيس جو طريقو استعمال ڪندو . foo()AfooB()foo()B

16. تجريدي طريقا ۽ ڪلاس ڇا آهن؟

جاوا ۾، abstractهڪ محفوظ لفظ آهي. اهو تجريدي طبقن ۽ طريقن کي ظاهر ڪرڻ لاء استعمال ڪيو ويندو آهي. پهرين، اسان کي تعريف جي ضرورت آهي. هڪ خلاصو طريقو هڪ طريقو آهي جنهن کي abstractلفظ استعمال ڪندي اعلان ڪيو ويو آهي بغير ڪنهن خلاصي طبقي ۾ عمل درآمد. اهو آهي، اهو هڪ طريقو آهي جيئن هڪ انٽرفيس ۾، پر هڪ لفظ جي اضافي سان، مثال طور:
public abstract void foo();
خلاصو طبقو ھڪڙو طبقو آھي جيڪو abstractلفظ سان نشان لڳل آھي:
public abstract class A {

}
هڪ خلاصو ڪلاس ۾ ڪيترائي خاصيتون آهن:
  • توهان هڪ تجريدي طبقي جو اعتراض ٺاهي نٿا سگهو
  • ان جا تجريدي طريقا ٿي سگهن ٿا
  • ان ۾ شايد تجريدي طريقا به نه هجن
تجريد لاءِ تجريدي طبقن جي ضرورت پوندي آهي (معاف ڪجو ٽائيٽلجي لاءِ) جنهن ۾ عام رويي ۽ رياستن جو هڪ سيٽ هوندو آهي (يعني طريقا ۽ متغيرات). حقيقي زندگي مثالن سان ڀريل آهي. اسان جي چوڌاري سڀ ڪجهه. "جانور"، "ڪار"، "جاميٽري شڪل"، وغيره.

17. String، StringBuilder ۽ StringBuffer جي وچ ۾ ڇا فرق آھي؟

Stringقدر هڪ مستقل اسٽرنگ پول ۾ محفوظ ٿيل آهن. جيئن ئي هڪ تار ٺهيل آهي، اهو هن تلاء ۾ ظاهر ٿئي ٿو. ۽ توهان ان کي ختم نه ٿا ڪري سگهو. مثال طور:
String name = "book";
متغير مسلسل اسٽرنگ پول ڏانھن اشارو ڪندو جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 4نالو متغير کي مختلف قدر تي سيٽ ڪندي، اسان وٽ آھي:
name = "pen";
مسلسل اسٽرنگ پول ھن طرح ڏسڻ ۾ اچي ٿو: جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 5ٻين لفظن ۾، ٻئي قدر اتي رھندا آھن. اسٽرنگ بفر:
  • Stringقدر هڪ اسٽيڪ ۾ محفوظ ٿيل آهن. جيڪڏهن هڪ قدر بدلجي وڃي ته پوءِ نئين قيمت پراڻي کي بدلائي ويندي.
  • String Bufferهم وقت سازي آهي ۽ تنهن ڪري ٿريڊ محفوظ آهي.
  • سلسلي جي حفاظت جي ڪري، ان جي ڪارڪردگي خراب آهي.
مثال:
StringBuffer name = “book”;
جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 6جيئن ئي نالي جي قيمت تبديل ٿيندي آهي، اسٽيڪ ۾ قيمت تبديل ٿي ويندي آهي: جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 7StringBuilder بلڪل ساڳيو آهي StringBuffer، صرف اهو موضوع محفوظ ناهي. نتيجي طور، اهو واضح طور تي تيز آهي StringBuffer.

18. هڪ خلاصي طبقي ۽ هڪ انٽرفيس جي وچ ۾ ڇا فرق آهي؟

خلاصو طبقو:
  • خلاصو طبقن وٽ ڊفالٽ ٺاھيندڙ آھي. اهو هر وقت سڏيو ويندو آهي جڏهن خلاصو طبقي جو اولاد پيدا ٿئي ٿو.
  • اهي ٻئي تجريدي طريقا ۽ غير تجريدي طريقا شامل ڪري سگھن ٿا. عام طور تي، هڪ تجريدي طبقي کي تجريدي طريقن جي ضرورت ناهي.
  • ھڪڙو طبقو جيڪو ھڪڙو خلاصو وراثت ۾ حاصل ڪري ٿو ھڪڙي کي صرف تجريدي طريقن کي لاڳو ڪرڻ گھرجي.
  • هڪ خلاصي طبقي ۾ مثالي متغير ٿي سگھي ٿو (ڏسو سوال #5).
انٽرفيس:
  • هڪ انٽرفيس جو ڪو به تعمير ڪندڙ نه آهي ۽ ان کي شروع نه ٿو ڪري سگهجي.
  • صرف تجريدي طريقا شامل ڪري سگھجن ٿا (سواءِ ڊفالٽ طريقن جي).
  • ڪلاس جيڪي انٽرفيس کي لاڳو ڪن ٿا انهن کي لازمي طور تي سڀني طريقن کي لاڳو ڪرڻ گهرجي (سواءِ ڊفالٽ طريقن جي).
  • انٽرفيس صرف مستقل ٿي سگھي ٿو.

19. ايٽ (1) صف ۾ هڪ عنصر تائين رسائي ڇو آهي؟

اهو سوال لفظي طور تي منهنجي آخري انٽرويو ۾ پڇيو ويو. جيئن مون بعد ۾ سکيو، هن سوال جو مقصد اهو ڏسڻ آهي ته ماڻهو ڪيئن سوچيندو آهي. واضح طور تي، هن علم ۾ ٿورو عملي قدر آهي. رڳو ڄاڻڻ ئي ڪافي آهي. پهرين، اسان کي واضح ڪرڻ جي ضرورت آهي ته O (1) هڪ "مسلسل وقت" الگورتھم جي وقت جي پيچيدگي لاء اشارو آهي . ٻين لفظن ۾، هي نامزدگي تيز ترين عمل جي وقت کي اشارو ڪري ٿو. هن سوال جو جواب ڏيڻ لاء، اسان کي غور ڪرڻو پوندو ته اسان arrays بابت ڇا ڄاڻون ٿا. هڪ صف ٺاهڻ لاء int، اسان کي هيٺين لکڻ گهرجي:
int[] intArray = new int[100];
هن نحو مان ڪيترائي نتيجا ڪڍي سگهجن ٿا:
  1. جڏهن هڪ صف جو اعلان ڪيو ويندو آهي، ان جو قسم معلوم ٿيندو آهي. جيڪڏهن قسم معلوم ٿئي ٿو، پوء صف ۾ هر سيل جي سائيز معلوم ٿئي ٿي.
  2. سڄي صف جي سائيز معلوم ٿئي ٿي.
تنهن ڪري اهو معلوم ٿئي ٿو ته ڪهڙي سيل کي لکڻو آهي، اسان کي صرف حساب ڪرڻ جي ضرورت آهي ته ميموري جي ڪهڙي حصي کي لکڻو آهي. ڪمپيوٽر لاء، اهو آسان آهي. ڪمپيوٽر ڄاڻي ٿو جتي مختص ڪيل ياداشت شروع ٿئي ٿي، عناصر جو تعداد، ۽ هر سيل جي سائيز. هن جو مطلب اهو آهي ته لکڻ جي جڳهه صف جي شروعاتي جڳهه جي برابر هوندي + هر سيل جي ماپ انڊيڪس سان ضرب ڪيو ويندو.

پوءِ اسان ڪيئن پهچون ٿا O(1) تي جڏهن هڪ ArrayList ۾ شيون پهچون؟

اهو سوال فوري طور تي پوئين هڪ جي پٺيان آهي. حقيقت اها آهي ته جڏهن هڪ صف سان ڪم ڪري رهيا آهيون جيڪا پرائمري رکي ٿي، اسان اڳ ۾ ڄاڻون ٿا (تخليق جي وقت) عنصر جي قسم جي سائيز. پر اسان ڇا ڪريون جيڪڏهن اسان وٽ هن قسم جي وراثت واري درجه بندي آهي ۽ جاوا ڪور لاءِ مٿيان 50 نوڪري جا انٽرويو سوال ۽ جواب.  حصو 1 - 8اسان قسم A جي عناصرن لاءِ هڪ مجموعو ٺاهڻ چاهيون ٿا ۽ مختلف لاڳو ڪرڻ (B، C، ۽ D) شامل ڪرڻ چاهيون ٿا:
List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
هن صورتحال ۾، اسان ڪيئن حساب ڪريون ٿا هر سيل جي سائيز؟ آخرڪار، هر شئي مختلف هوندي، ممڪن آهي ته مختلف اضافي شعبن سان. ڇا ڪجي؟ هتي سوال هڪ انداز ۾ پيش ڪيو ويو آهي جيڪو توهان کي پريشان ڪرڻ جو مطلب آهي. اسان ڄاڻون ٿا ته مجموعو سڌو سنئون شيون ذخيرو نٿو ڪري. اهو صرف شين جي حوالي سان ذخيرو ڪري ٿو. ۽ سڀ حوالا ساڳيا سائيز آهن، ۽ اهو ڄاڻايل آهي. نتيجي طور، اسان هتي پتي کي ساڳئي طريقي سان حساب ڪندا آهيون جيئن پوئين سوال ۾.

21. آٽو باڪسنگ ۽ انباڪسنگ

تاريخي پس منظر: آٽو باڪسنگ ۽ انباڪسنگ JDK 5 ۾ ڪجھ مکيه جدتون آھن. آٽو باڪسنگ ھڪڙي قسم جي ھڪڙي قسم جي ھڪڙي ھڪڙي لاڳاپيل لفافي طبقي ۾ خودڪار تبديليءَ جو عمل آھي. انباڪسنگ آٽو باڪسنگ جي بلڪل ابتڙ آهي. اهو هڪ لفافي طبقي کي ابتدائي ۾ تبديل ڪرڻ جو عمل آهي. پر جيڪڏهن هڪ لفافي جي قيمت آهي null، ته پوء ان باڪسنگ دوران هڪ NullPointerExceptionاڇلائي ويندي.

پرائمري ۽ انهن سان لاڳاپيل لفافي

ابتدائي ڪپڙا ڪلاس
بولين بوليان
int عدد
بائيٽ بائيٽ
چار ڪردار
فلوٽ فلوٽ
ڊگهو ڊگھو
مختصر ننڍو
ٻيڻو ٻيڻو

// آٽو باڪسنگ ٿئي ٿي:

  • جڏهن هڪ ريپر ڪلاس جي حوالي سان هڪ ابتدائي تفويض ڪندي:

    جاوا 5 کان اڳ:

    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
  • جڏهن هڪ ابتدائي طريقي سان هڪ دليل جي طور تي منظور ڪيو ويو آهي جيڪو هڪ لفافي جي توقع رکي ٿو:

    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }

// انباڪسنگ ٿئي ٿي:

  • جڏهن اسان هڪ ريپر ڪلاس جو مثال تفويض ڪريون ٿا هڪ ابتدائي متغير ڏانهن:

    // BEFORE Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    // And after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
  • رياضي جي عملن دوران. آپريشن صرف ابتدائي قسمن تي لاڳو ٿئي ٿو، تنهنڪري ابتدائي طور تي غير باڪسنگ ضروري آهي.

    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
    
    // In Java 5
    integerBox1 > integerBox2
  • جڏهن هڪ ريپر ڪلاس جو هڪ مثال هڪ طريقي سان گذري ٿو جيڪو لاڳاپيل پرائمري وٺندو آهي:

    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }

22. آخري لفظ ڇا آهي ۽ ڪٿي استعمال ٿيندو آهي؟

لفظ finalمتغير، طريقن ۽ طبقن تي استعمال ڪري سگھجي ٿو.
  1. حتمي متغير جو قدر تبديل نه ٿو ڪري سگھجي ان جي شروعات کان پوءِ.
  2. هڪ فائنل ڪلاس جراثيم کان پاڪ آهي :) ان ۾ ٻار نٿا ٿي سگهن.
  3. هڪ آخري طريقو اولاد طرفان ختم نٿو ڪري سگهجي.
اسان اعلي سطحي شين کي ڍڪي ڇڏيو آهي. هاڻي اچو ته وڌيڪ اونهي ۾ وڃو.

آخري متغير

جاوا اسان کي ٻه طريقا ڏئي ٿو هڪ متغير جو اعلان ڪرڻ ۽ ان کي هڪ قدر تفويض ڪرڻ:
  1. توهان هڪ متغير جو اعلان ڪري سگهو ٿا ۽ ان کي بعد ۾ شروع ڪري سگهو ٿا.
  2. توھان ھڪڙي متغير جو اعلان ڪري سگھو ٿا ۽ ھڪڙي قيمت کي فوري طور تي تفويض ڪري سگھو ٿا.
ھتي ھڪڙو مثال آھي جيڪو ظاھر ڪري ٿو آخري متغيرن جي استعمال کي:
public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // The final FinalExample.FINAL_EXAMPLE_NAME field cannot be accessed
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // The final Config.creationTime field cannot be accessed
//    finalExample.creationTime = 1L;
   }
}

ڇا هڪ فائنل متغير کي مسلسل سمجهي سگهجي ٿو؟

جيئن ته اسان فائنل متغيرن کي نئين قيمتون تفويض نٿا ڪري سگھون، اهو لڳي ٿو ته اهي مسلسل متغير آهن. پر صرف پهرين نظر ۾: جيڪڏهن متغير جي ڊيٽا جو قسم آهي immutable، پوء، ها، اهو هڪ مستقل آهي. پر جيڪڏهن ڊيٽا جو قسم آهي mutable، اهو آهي، تبديل ٿيندڙ، پوء اهو ممڪن ٿيندو ته طريقن ۽ متغيرن کي استعمال ڪرڻ لاء هڪ finalمتغير جي حوالي ڪيل اعتراض جي قدر کي تبديل ڪرڻ لاء. ان ڪري، ان کي مستقل نٿو چئي سگهجي. هيٺ ڏنل مثال ڏيکاري ٿو ته ڪي حتمي متغير حقيقت ۾ مستقل آهن، جڏهن ته ٻيا نه آهن، ڇاڪاڻ ته اهي تبديل ٿي سگهن ٿيون.
public class FinalExample {

   // Immutable final variables
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

مقامي فائنل متغير

جڏهن هڪ finalvariable هڪ طريقي سان ٺاهي وئي آهي، ان کي هڪ local finalمتغير سڏيو ويندو آهي:
public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
اسان آخري لفظ استعمال ڪري سگھون ٿا لوپ لاءِ وڌايل ۾، ڇاڪاڻ ته لوپ جي هر ورجائي کان پوءِ هڪ نئون متغير پيدا ٿيندو آهي. ذهن ۾ رکو ته اهو لوپ لاء عام تي لاڳو نٿو ٿئي، تنهنڪري اسان کي هڪ مرتب وقت جي غلطي ملندي.
// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

فائنل ڪلاس

هڪ طبقي جو اعلان ڪيو ويو ته finalوڌايو نه ٿو سگهجي. ان کي وڌيڪ آسانيءَ سان سمجهايو ته ٻيو ڪو به طبقو ان جو وارث نٿو ٿي سگهي. finalJDK ۾ هڪ طبقي جو هڪ بهترين مثال اسٽرنگ آهي. هڪ ناقابل قابل ڪلاس ٺاهڻ لاء پهريون قدم ان کي نشان لڳائڻ آهي final، اهڙيء طرح ان کي وڌائڻ کان روڪيو وڃي ٿو:
public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

آخري طريقا

جڏهن هڪ طريقو حتمي طور تي نشان لڳايو ويو آهي، ان کي آخري طريقو سڏيو ويندو آهي (معني، صحيح؟). ٻار جي طبقي ۾ آخري طريقو ختم نه ٿو ڪري سگھجي. اتفاق سان، Object class's wait() and notify() طريقا حتمي آهن، تنهنڪري اسان وٽ انهن کي اوور رائڊ ڪرڻ جي صلاحيت نه آهي.
public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // Compilation error!
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

جاوا ۾ فائنل ڪيئن ۽ ڪٿي استعمال ڪجي

  • ڪجھ ڪلاس-سطح جي مستقلن جي وضاحت ڪرڻ لاءِ آخري لفظ استعمال ڪريو؛
  • انھن شين لاءِ فائنل متغير ٺاھيو جيڪي توھان نٿا چاھيو تبديل ٿيڻ. مثال طور، اعتراض جي مخصوص ملڪيت جيڪي اسان لاگنگ جي مقصدن لاء استعمال ڪري سگهون ٿا.
  • جيڪڏهن توهان نٿا چاهيو ته هڪ ڪلاس وڌايو وڃي، پوء ان کي حتمي طور نشان لڳايو.
  • جيڪڏهن توهان کي هڪ ناقابل قابل ڪلاس ٺاهڻ جي ضرورت آهي، توهان کي ان کي حتمي بڻائڻ جي ضرورت آهي.
  • جيڪڏھن توھان چاھيو ٿا ته ھڪڙي طريقي جي عمل کي ان جي اولاد ۾ تبديل نه ٿئي، پوء ھن طريقي کي نشان لڳايو final. اهو يقين ڪرڻ لاء تمام ضروري آهي ته عمل درآمد تبديل نه ٿئي.

23. بدلائيندڙ ۽ غير تبديل ٿيندڙ قسم ڇا آهن؟

تبديل ٿيندڙ

تبديل ٿيندڙ شيون اهي شيون آهن جن جي حالت ۽ متغيرات ٺاهڻ کان پوء تبديل ٿي سگهن ٿيون. تبديل ٿيندڙ طبقن جا مثال شامل آهن StringBuilder ۽ StringBuffer. مثال:
public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // This setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("First address");
       System.out.println(obj.getAddress());

       // We are updating the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

ناقابل بدلائي

تبديل نه ٿيندڙ شيون اهي شيون آهن جن جي حالت ۽ متغيرات کي تبديل نه ٿي ڪري سگھجي اعتراض پيدا ٿيڻ کان پوء. HashMap لاءِ هڪ عظيم ڪنجي ، ڇا توهان نٿا سوچيو؟ :) مثال طور، String، Integer، Double، وغيره. مثال:
// We'll make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // We remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("Old address");
       System.out.println(obj.getAddress());

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
ايندڙ حصي ۾، اسان مجموعن بابت سوالن ۽ جوابن تي غور ڪنداسين. منهنجو پروفائل GitHub مٿان 50 جاب انٽرويو جا سوال ۽ جواب جاوا ڪور لاءِ. حصو 2