سلام! اسان جاوا ۾ nested طبقن جي موضوع کي ڳولڻ جاري رکون ٿا. پوئين سبق ۾ اسان غير جامد نسٽڊ طبقن بابت ڳالهايو يا، جيئن انهن کي اندروني طبقن پڻ سڏيو وڃي ٿو. اڄ اچو ته ٻئي گروپ ڏانهن وڃو ۽ جامد نسٽڊ ڪلاس تي هڪ ويجهي نظر رکون. اهي ٻين گروهن کان ڪيئن مختلف آهن؟ جڏهن اهڙي طبقي جو اعلان ڪريون ٿا، اسان اڳ ۾ ئي واقف جامد لفظ استعمال ڪندا آهيون:
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
public static int getMaxPassengersCount() {
return maxPassengersCount;
}
}
}
هن مثال ۾، اسان وٽ هڪ خارجي طبقو آهي Boeing737
جيڪو هن نموني جو هڪ هوائي جهاز ٺاهي ٿو. ۽ هن وٽ هڪ تعمير ڪندڙ آهي هڪ پيٽرولر سان: پيداوار جو سال ( int manufactureYear
). اتي پڻ ھڪڙو جامد متغير آھي int maxPassengersCount
- مسافرن جو وڌ ۾ وڌ تعداد. اهو ساڳيو ماڊل جي سڀني جهازن لاء ساڳيو هوندو، تنهنڪري اسان کي صرف هڪ ڪاپي جي ضرورت آهي. ان کان سواء، ان ۾ هڪ جامد اندروني طبقو آهي Drawing
- هوائي جهاز بليو پرنٽ. هن ڪلاس ۾ اسان جهاز جي باري ۾ سڀني خدمتن جي معلومات گڏ ڪري سگهون ٿا. اسان جي مثال ۾، سادگي لاء، اسان ان کي پيداوار جي سال تائين محدود ڪيو، پر ان ۾ تمام گهڻي معلومات شامل ٿي سگھي ٿي. جيئن ته اسان گذريل ليڪچر ۾ بحث ڪيو، اهڙي نيسٽڊ ڪلاس ٺاهڻ سان انڪپسوليشن وڌي ٿي ۽ وڌيڪ حقيقي تجزيي کي فروغ ڏئي ٿو. جامد ۽ غير جامد nested طبقن جي وچ ۾ ڇا فرق آهي؟ 1. هڪ جامد ڪلاس اعتراض Drawing
ٻاهرئين طبقي جي مخصوص مثال جي حوالي سان ذخيرو نٿو ڪري. سائيڪل سان آخري ليڪچر مان مثال ياد رکو:
public class Bicycle {
private String model;
private int mawWeight;
public Bicycle(String model, int mawWeight) {
this.model = model;
this.mawWeight = mawWeight;
}
public void start() {
System.out.println("Go!");
}
public class SteeringWheel {
public void right() {
System.out.println("Steering wheel to the right!");
}
public void left() {
System.out.println("Steering wheel to the left!");
}
}
}
اتي اسان ڳالهه ڪئي ته ڪيئن SteeringWheel
ٻاهرئين طبقي جي ڪنهن شئي (سائيڪل) جو حوالو اسان کي بغير ڪنهن نوٽيس جي اندروني طبقي (اسٽيئرنگ ويل) جي هر مثال ڏانهن منتقل ڪيو ويندو آهي Bicycle
. ٻاهرين طبقي جي ڪنهن شئي کان سواءِ، اندروني طبقي جو ڪو به وجود ئي نه ٿو رهي سگهي. هي جامد نسٽڊ طبقن لاءِ درست ناهي. جامد نسٽڊ ڪلاس جي ڪا شئي آساني سان پاڻ تي موجود ٿي سگھي ٿي. ان سلسلي ۾، جامد طبقن غير جامد طبقن کان وڌيڪ "آزاد" آهن. صرف نقطو اهو آهي ته جڏهن اهڙي شئي ٺاهي توهان کي خارجي طبقي جو نالو بيان ڪرڻ جي ضرورت آهي:
public class Main {
public static void main(String[] args) {
Boeing737.Drawing drawing1 = new Boeing737.Drawing();
Boeing737.Drawing drawing2 = new Boeing737.Drawing();
}
}
اسان ڪلاس کي جامد ڇو بڻايو Drawing
، پر آخري ليڪچر ۾ ڪلاس Seat
(سائيڪل سيٽ) غير جامد هئي؟ گذريل ڀيري وانگر، اچو ته ٿورو "فلسفو" شامل ڪريو مثال کي سمجھڻ لاء :) سائيڪل جي سيٽ جي برعڪس، ڊرائنگ جو خلاصو هوائي جهاز جي جوهر سان ايترو مضبوط نه آهي. هڪ الڳ سيٽ اعتراض، سائيڪل کان سواء، اڪثر ڪري بي معني ٿي ويندي (جيتوڻيڪ هميشه نه - اسان گذريل سبق ۾ هن بابت ڳالهايو). ڊرائنگ جو جوهر پاڻ ۾ احساس پيدا ڪري ٿو. مثال طور، اهو ڪارائتو ٿي سگهي ٿو انجنيئرن لاءِ جهاز جي مرمت جي رٿابندي ڪرڻ. انهن کي پلاننگ لاءِ پاڻ جهاز جي ضرورت ناهي، ۽ ڪٿي به ٿي سگهي ٿو - بس هڪ ڊرائنگ ڪافي آهي. ان کان سواء، ساڳئي نموني جي سڀني جهازن لاء، ڊرائنگ اڃا به ساڳيو هوندو، تنهنڪري سائيڪل سان سيٽ وانگر ڪو به سخت ڪنيڪشن ناهي. تنهن ڪري، اعتراض کي Drawing
ڪنهن مخصوص جهاز جي اعتراض جي لنڪ جي ضرورت ناهي. 2. هڪ خارجي طبقي جي متغير ۽ طريقن تائين مختلف پهچ. هڪ جامد نسٽڊ ڪلاس صرف ٻاهرين طبقي جي جامد شعبن تائين رسائي ڪري سگهي ٿو. اسان جي مثال ۾، ڪلاس ۾ Drawing
ھڪڙو طريقو آھي getMaxPassengersCount()
جيڪو ھڪڙي مستحڪم متغير جي قيمت کي maxPassengersCount
خارجي طبقي مان موٽائي ٿو. تنهن هوندي، اسان هڪ طريقو ٺاهي نٿا سگهون هڪ قدر واپس ڪرڻ getManufactureYear()
لاء . سڀ کان پوء، هڪ متغير غير جامد آهي، جنهن جو مطلب آهي ته اهو هڪ خاص مثال سان تعلق رکي ٿو . ۽ جيئن ته اسان اڳ ۾ ئي معلوم ڪري چڪا آهيون، جامد نسٽڊ طبقن جي صورت ۾، ٻاهرئين طبقي جو اعتراض آساني سان غائب ٿي سگهي ٿو. انهيءَ ڪري حد بندي :) اهو فرق نٿو پوي ته ٻاهرئين طبقي ۾ جامد متغير کي ڪهڙي رسائي موڊيفائر آهي. جيتوڻيڪ اهو آهي ، اتي اڃا تائين رسائي هوندي جامد نسٽڊ ڪلاس کان. مٿين سڀني خدشات نه رڳو جامد متغيرن تائين رسائي، پر جامد طريقن تائين پڻ. اهم! اندروني طبقي جي اعلان ۾ لفظ جو مطلب اهو ناهي ته صرف هڪ اعتراض ٺاهي سگهجي ٿو. متغيرن سان شين کي الجھن نه ڏيو. جيڪڏهن اسان جامد متغير بابت ڳالهائي رهيا آهيون، ها، هڪ جامد طبقي متغير، مثال طور، هڪ واحد ڪاپي ۾ موجود آهي. پر جڏهن nested طبقي تي لاڳو ٿئي ٿو، ان جو مطلب صرف اهو آهي ته ان جي شين ۾ ٻاهرئين طبقي جي شين جا حوالا شامل نه آهن. ۽ اسان ڪيتريون ئي شيون ٺاهي سگهون ٿا جيئن اسان چاهيون ٿا: Drawing
manufactureYear
manufactureYear
Boeing737
private
static
maxPassangersCount
static
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
private int id;
public Drawing(int id) {
this.id = id;
}
public static int getPassengersCount() {
return maxPassengersCount;
}
@Override
public String toString() {
return "Drawing{" +
"id=" + id +
'}';
}
public static void main(String[] args) {
for (int i = 1; i < 6; i++) {
Boeing737.Drawing drawing = new Boeing737.Drawing(i);
System.out.println(drawing);
}
}
}
}
اسان ان طريقي کي main()
سڌو سنئون نيسٽڊ ڪلاس ۾ اعلان ڪيو (ان لاءِ ڪو خاص سبب نه آهي - بس توهان کي خبر آهي ته اهو ممڪن آهي)، ۽ 5 شيون ٺاهيون Drawing
. ان حقيقت جي باوجود ته اسان وٽ ٻاهرئين طبقي جي هڪ به شئي ناهي. جئين توهان ڏسي سگهو ٿا، ڪو مسئلو ناهي :) ڪنسول آئوٽ:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
هي اسان جو سبق ختم ڪري ٿو! بس صورت ۾، مان توهان کي Oracle دستاويزن ۾ انهن بابت سيڪشن جي هڪ لنڪ ڏيندس . ان کي پڙهو جيڪڏهن ڪي غير واضح نقطا آهن. هاڻي اهو وقت آهي ڪجهه مسئلن کي حل ڪرڻ جو! :)
GO TO FULL VERSION