JavaRush /جاوا بلاگ /Random-SD /ڪلاس، مثالن سان گڏ نسٽڊ ڪلاس جا قسم
Ярослав
سطح
Днепр

ڪلاس، مثالن سان گڏ نسٽڊ ڪلاس جا قسم

گروپ ۾ شايع ٿيل
هيلو سڀ. هن موضوع ۾، مان جاوا ڪلاسز ۽ انهن جي قسمن بابت تفصيل سان ڳالهائڻ چاهيان ٿو ته جيئن نئين سکندڙن کي هن موضوع کي سمجهڻ ۾ مدد ملي سگهي، ۽ شايد غير نوآبادي به ڪجهه نئون سکن. جتي ممڪن هجي، سڀ ڪجهه ڏيکاريو ويندو حقيقي زندگي جا مثال استعمال ڪندي ڪوڊ جي مثالن سان. اچو ته شروع ڪريون. ڪلاس، مثالن سان گڏ نيسٽ ٿيل طبقن جا قسم - 1۽ مان اهو نوٽ ڪرڻ چاهيان ٿو ته بنيادي شيء پهرين ٻن قسمن جي طبقن کي سمجهڻ آهي، ۽ مقامي ۽ گمنام صرف اندروني طبقي جا ذيلي قسم آهن.

هڪ ڪلاس ڇا آهي؟

ڪلاس ڪنهن شيءِ جي منطقي وضاحت آهي، هڪ ٽيمپليٽ جنهن سان توهان ان شيءِ جا حقيقي مثال ٺاهي سگهو ٿا. ٻين لفظن ۾، اهو صرف هڪ وضاحت آهي ته پيدا ڪيل ادارن کي ڇا هجڻ گهرجي: انهن کي ڪهڙي خاصيتون ۽ طريقا هجڻ گهرجي. ملڪيتون آھن ھڪڙي اداري جون خاصيتون، طريقا آھن ڪارناما جيڪي اھو انجام ڏئي سگھن ٿا. حقيقي زندگي مان هڪ طبقي جو هڪ سٺو مثال، جيڪو سمجهي ٿو ته هڪ طبقو ڇا آهي، ڊرائنگ سمجهي سگهجي ٿو: ڊرائنگ استعمال ڪيا ويندا آهن ساختن کي بيان ڪرڻ لاءِ (ڪيٽپلٽ، اسڪرو ڊرائور)، پر ڊرائنگ ڪا ڊزائن ناهي. جيئن انجنيئر ڊزائن ٺاهڻ لاءِ بليو پرنٽ استعمال ڪندا آهن، پروگرامنگ شيون ٺاهڻ لاءِ ڪلاس استعمال ڪندا آهن جن ۾ خاصيتون ۽ طريقا بيان ڪيا ويا آهن.
public class Student {
    private String name, group, specialty;

    public Student(String name, String group, String specialty) {
       this.name = name;
       this.group = group;
       this.specialty = specialty;
   }

   // getters/setters
}
ھن مثال ۾، اسان ھڪڙو جاوا ڪلاس ٺاھيو آھي جيڪو بيان ڪري ٿو "شاگرد" ادارو: ھر شاگرد جو نالو، گروپ ۽ خاصيت آھي. هاڻي، پروگرام ۾ ٻين هنڌن تي، اسان هن طبقي جا حقيقي مثال ٺاهي سگهون ٿا. ٻين لفظن ۾: جيڪڏهن ڪلاس Studentهڪ تصوير آهي ته هڪ شاگرد کي ڇا هجڻ گهرجي، پوء پيدا ڪيل مثال اصل شاگرد پاڻ آهي. ھڪڙو نئون شاگرد ٺاھڻ جو ھڪڙو مثال: new Student("Ivan", "KI-17-2", "Computer Engineering");آپريٽر newڪلاس کي ڳولي ٿو Student۽ پوء ھن ڪلاس جي ھڪڙي خاص طريقي کي سڏي ٿو. تعمير ڪندڙ هڪ تيار ٿيل ڪلاس شئي واپس ڪري ٿو Student- اسان جو پيارو، بکيو شاگرد بغير ڪنهن اسڪالرشپ جي :))

جاوا ۾ ڪلاس جا قسم

جاوا ۾ 4 قسم جا طبقا ٻئي طبقي اندر آھن:
  1. Nested Inner Classes آهن غير جامد طبقا هڪ ٻاهرين طبقي اندر.

  2. Nested static classes آهن جامد ڪلاس هڪ ٻاهرين طبقي اندر.

  3. جاوا مقامي طبقن جا طبقا آهن طريقن ۾.

  4. گمنام جاوا طبقن وارا طبقا آهن جيڪي اڏامي تي ٺاهيا ويا آهن.

اسان انهن مان هر هڪ بابت الڳ الڳ ڳالهائينداسين.

ٻاهرئين طبقي اندر غير جامد طبقو

پهرين، مان توهان کي سمجهڻ چاهيان ٿو ته اهو ڇا آهي حقيقي مثال سان، ڇو ته اهو سمجهڻ آسان بڻائي ٿو. تنهن ڪري هاڻي اسان هڪ حقيقي وڏي شيء کي ننڍن حصن ۾ ٽوڙينداسين، ۽ اسان هڪ هوائي جهاز کي ڌار ڪنداسين! تنهن هوندي به، مثال جي خاطر، اهو ٿورو ڏيکارڻ ڪافي ٿيندو؛ اسان ان کي مڪمل طور تي ٽوڙي نه سگهنداسين. هن عمل کي ڏسڻ لاءِ، اسان استعمال ڪنداسين هوائي جهاز جو نقشو. ڪلاس، مثالن سان گڏ نيسٽ ٿيل طبقن جا قسم - 2 پهرين، اسان کي هڪ ڪلاس ٺاهڻ جي ضرورت آهي Airplaneجتي اسان ٿورو تفصيل شامل ڪري سگهون ٿا: جهاز جو نالو، سڃاڻپ ڪوڊ، پرواز.
public class Airplane {
    private String name, id, flight;

    public Airplane(String name, String id, String flight) {
        this.name = name;
        this.id = id;
        this.flight = flight;
    }

    // getters/setters
}
هاڻي اسان پنن کي شامل ڪرڻ چاهيون ٿا. هڪ الڳ ڪلاس ٺاهيو؟ شايد اهو ئي منطق آهي جيڪڏهن اسان وٽ هوائي جهازن کي ڊزائين ڪرڻ لاءِ هڪ پيچيده پروگرام آهي، ۽ جتي اسان کي وڏي تعداد ۾ نڪتل طبقن کي ٺاهڻ جي ضرورت آهي (ڪلاس جن ۾ ساڳيو منطق آهي جيئن والدين طبقي، يعني اهو طبقو جنهن کان اهي ورثي ۾ آهن، پر تنهن ڪري اهي منطق يا وڌيڪ تفصيلي خاصيتون شامل ڪندي والدين طبقي کي وڌايو) پر ڇا جيڪڏهن اسان وٽ صرف هڪ راند آهي جتي اسان وٽ هڪ جهاز آهي؟ پوءِ اسان لاءِ اهو وڌيڪ معقول ٿيندو ته پوري ڍانچي کي هڪ جاءِ تي (هڪ طبقي ۾) مڪمل ڪريون. هي اهو آهي جتي غير جامد نسٽڊ ڪلاس راند ۾ اچن ٿا. لازمي طور تي، هي اسان جي خارجي طبقي جي ڪجهه تفصيلن جو وڌيڪ تفصيلي بيان آهي. هن مثال ۾، اسان کي هڪ هوائي جهاز لاء پرن ٺاهڻ جي ضرورت آهي - کاٻي ۽ ساڄي. اچو ته ٺاهيون!
public class Airplane {
    private String name, id, flight;
    private Wing leftWing = new Wing("Red", "X3"), rightWing = new Wing("Blue", "X3");

    public Airplane(String name, String id, String flight) {
        this.name = name;
        this.id = id;
        this.flight = flight;
    }

    private class Wing {
        private String color, model;

        private Wing(String color, String model) {
            this.color = color;
            this.model = model;
        }

        // getters/setters
    }

    // getters/setters
}
تنهنڪري اسان هڪ ڪلاس (هوائي جهاز) اندر هڪ غير جامد نسٽڊ ڪلاس Wing(ونگ) ٺاهيو Airplane، ۽ ٻه متغير شامل ڪيا - کاٻي ونگ ۽ ساڄي ونگ. ۽ هر ونگ جي پنهنجي ملڪيت آهي (رنگ، ​​ماڊل) جنهن کي اسين تبديل ڪري سگهون ٿا. هن طريقي سان توهان تعميرات کي عملي طور تي ڪم ڪري سگهو ٿا جيترو توهان کي ضرورت آهي. ۽ نوٽ: اڳ ۾ ڊراگرام تي جهاز لاء ڪافي حصا هئا، ۽ حقيقت ۾، اسان سڀني حصن کي اندروني طبقن ۾ ورهائي سگهون ٿا، پر اهڙي عمل هميشه لاء مشورو نه آهي. ڪم جي لحاظ کان اهڙن لمحن کي ڳولڻ جي ضرورت آهي. توھان کي شايد پرن جي ضرورت نه آھي مسئلو حل ڪرڻ لاءِ. پوء انھن کي ڪرڻ جي ڪا ضرورت نه آهي. اهو هڪ شخص کي پيرن، هٿن، ٽورسو ۽ مٿي ۾ ڪٽڻ وانگر آهي - اهو ممڪن آهي، پر ڇو ته اهو طبقو صرف ماڻهن بابت ڊيٽا کي ذخيرو ڪرڻ لاء استعمال ڪيو وڃي؟ غير جامد نسٽڊ جاوا ڪلاس جون خاصيتون:
  1. اهي صرف شيون ۾ موجود آهن، تنهنڪري انهن کي ٺاهڻ لاء توهان کي هڪ اعتراض جي ضرورت آهي. ٻين لفظن ۾: اسان پنهنجي ونگ کي هوائي جهاز جو حصو بڻائڻ لاءِ ٺاهيو آهي، تنهنڪري ونگ ٺاهڻ لاءِ اسان کي هوائي جهاز جي ضرورت آهي، ٻي صورت ۾ اسان کي ان جي ضرورت ناهي.
  2. جاوا ڪلاس اندر جامد متغير نه ٿي سگھي. جيڪڏهن توهان کي ڪجهه مستقل يا ڪنهن ٻئي جامد جي ضرورت آهي، توهان کي انهن کي ٻاهرئين طبقي ڏانهن منتقل ڪرڻو پوندو. اهو غير جامد نسٽڊ ڪلاس جي ٻاهرين طبقي سان ويجهو ملائڻ جي ڪري آهي.
  3. ڪلاس کي ٻاهرين طبقي جي سڀني خانگي شعبن تائين مڪمل پهچ آهي. هي مضمون ٻن طريقن سان ڪم ڪري ٿو.
  4. توھان حاصل ڪري سگھو ٿا ھڪڙو حوالو ھڪڙي مثال جي ھڪڙي خارجي طبقي جو. مثال: Airplane.this هڪ هوائي جهاز جي هڪ لنڪ آهي، هي هڪ ونگ جي لنڪ آهي.

ٻاهرئين طبقي اندر جامد ڪلاس

هن قسم جو طبقو باقاعده ٻاهرئين طبقي کان مختلف ناهي، سواءِ هڪ شيءِ جي: اهڙي طبقي جو مثال ٺاهڻ لاءِ، توهان کي ضرورت آهي ته سڄي رستي کي ڊٽ سان ڌار ڪري، ٻاهرئين طبقي کان گهربل درجي تائين. مثال طور: Building.Plaftorm platform = new Building.Platform(); جامد طبقن کي لاڳاپيل طبقن کي پاسي ۾ رکڻ لاءِ استعمال ڪيو ويندو آهي ته جيئن منطقي ڍانچي سان ڪم ڪرڻ آسان ٿئي. مثال طور: اسان هڪ خارجي طبقو ٺاهي سگهون ٿا Building، جتي ڪلاسن جي هڪ مخصوص فهرست هوندي جيڪا هڪ مخصوص عمارت جي نمائندگي ڪندي.
public abstract class Building {
    private String name, address, type;

    Building(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public static class Platform extends Building {
        public Platform(String name, String address) {
            super(name, address);
            setType("Platform");
        }

        // some additional logic
    }

    public static class House extends Building {
        public House(String name, String address) {
            super(name, address);
            setType("House");
        }

        // some additional logic
    }

    public static class Shop extends Building {
        public Shop(String name, String address) {
            super(name, address);
            setType("Shop");
        }

        // some additional logic
    }

    // getters/setters
}
هي مثال ڏيکاري ٿو ته ڪيئن جامد طبقن توهان کي هڪ منطقي جوڙجڪ کي وڌيڪ آسان فارم ۾ پيڪيج ڪرڻ جي اجازت ڏين ٿا. جيڪڏهن اهي موجود نه هئا، اسان کي 4 مڪمل طور تي مختلف طبقن ٺاهڻ جي ضرورت پوندي. هن طريقي جا فائدا:
  1. ڪلاسن جو تعداد گهٽجي ويو آهي.
  2. سڀئي طبقا پنهنجي والدين طبقي جي اندر آهن. اسان هر ڪلاس کي الڳ الڳ کولڻ کان سواءِ پوري درجي بندي جو پتو لڳائي سگهون ٿا.
  3. اسان بلڊنگ ڪلاس جو حوالو ڏئي سگھون ٿا، ۽ IDE اڳ ۾ ئي ھن ڪلاس جي سڀني ذيلي ڪلاسن جي پوري لسٽ کي پرامٽ ڪندو. اهو توهان کي گهربل ڪلاس ڳولڻ آسان بڻائي ڇڏيندو ۽ پوري تصوير کي وڌيڪ مجموعي طور ڏيکاريندو.
ھڪڙو مثال ٺاھڻ جو ھڪڙو مثال ھڪڙو nested جامد طبقي جو مثال:Building.Shop myShop = new Building.Shop(“Food & Fun!”, “Kalyaeva 8/53”); مان پڻ نوٽ ڪرڻ چاھيان ٿو ته ھي حڪمت عملي AWT 2D طبقن ۾ استعمال ٿيل آھي شڪلون بيان ڪرڻ لاء، جهڙوڪ Line2D، Arc2D، Ellipse2D ۽ ٻيا.

مقامي طبقن

انهن طبقن کي ٻين طريقن جي اندر قرار ڏنو ويو آهي. حقيقت ۾، انهن وٽ غير جامد نسٽڊ ڪلاس جون سڀئي خاصيتون آهن، صرف انهن جا مثال صرف هڪ طريقي سان ٺاهي سگھجن ٿا، ۽ طريقو جامد نه ٿو ٿي سگهي (انهن کي ٺاهڻ لاء توهان کي هڪ خارجي طبقي جي مثال جي ضرورت آهي، هڪ حوالو. ڪالنگ اعتراض جو مثال واضح طور تي غير جامد طريقن ڏانهن منتقل ڪيو ويو آهي، ۽ جامد طريقي ۾ هن لنڪ لاء ڪو طريقو ناهي). پر انهن وٽ پنهنجون خاصيتون آهن:
  1. مقامي ڪلاس صرف آخري طريقي سان ڪم ڪري سگهن ٿا متغير. شيء اها آهي ته مقامي طبقن جي مثالن کي ڍنگ ۾ ذخيرو ٿي سگهي ٿو طريقي سان مڪمل ٿيڻ کان پوء، ۽ متغير کي ختم ڪري سگهجي ٿو. جيڪڏهن متغير کي حتمي قرار ڏنو ويو آهي، ته پوءِ ڪمپلر کي محفوظ ڪري سگهي ٿو متغير جي هڪ ڪاپي کي اعتراض جي بعد ۾ استعمال لاءِ. ۽ هڪ ٻي شيءِ: جاوا جي 8+ ورزن کان وٺي، توهان مقامي ڪلاسن ۾ غير حتمي متغير استعمال ڪري سگهو ٿا، پر صرف ان شرط تي ته اهي تبديل نه ٿيندا.
  2. مقامي طبقن کي رسائي تبديل ڪندڙن سان اعلان نه ٿو ڪري سگھجي.
  3. مقامي طبقن کي طريقن جي متغير تائين رسائي آهي.
مقامي ڪلاس تمام گهٽ ڳولي سگهجن ٿا، ڇاڪاڻ ته اهي ڪوڊ پڙهڻ ۾ ڏکيائي ڪن ٿا ۽ انهن جا ڪي به فائدا نه آهن، سواءِ هڪ - طريقن جي متغيرن تائين رسائي. مون کي خبر ناهي ته مقامي طبقي جو ڪهڙو مثال وٺي سگهجي ٿو جيڪو انهن جو اثرائتو استعمال ڏيکاريندو، تنهنڪري مان صرف پنهنجو مثال ڏيکاريندس. اچو ته چوندا آهيون ته اسان وٽ هڪ طبقو آهي Person(اهو فرض ڪيو ويندو ته اهو هڪ شخص آهي) ملڪيت street(گلي)، house(گهر). اسان چاهيون ٿا ته ڪجهه اعتراض واپس ڪرڻ لاء صرف ماڻهو جي مقام تائين رسائي. ائين ڪرڻ لاءِ، اسان AddressContainer انٽرفيس ٺاھيو آھي، جنھن جو مطلب آھي ھڪ شخص جي جڳھ بابت ڊيٽا جو ذخيرو.
public class Person {
    private String name, street, house;

    public Person(String name, String street, String house) {
        this.name = name;
        this.street = street;
        this.house = house;
    }

    private interface AddressContainer {
        String getStreet();
        String getHouse();
    }

    public AddressContainer getAddressContainer() {
        class PersonAddressContainer implements AddressContainer {
            final String street = Person.this.street, house = Person.this.house;

            @Override
            public String getStreet() {
                return this.street;
            }

            @Override
            public String getHouse() {
                return this.house;
            }
        }

        return new PersonAddressContainer();
    }

    public static void main(String[] args) {
        Person person = new Person("Nikita", "Sholohova", "17");

        AddressContainer address = person.getAddressContainer();

        System.out.println("Address: street - " + address.getStreet() + ", house - " + address.getHouse());
    }

    // getters/setters
}
جيئن توهان ڏسي سگهو ٿا، طريقي جي اندر اسان هڪ ڪلاس ٺاهيو آهي جيڪو هڪ شخص جي مقام جي اسٽوريج کي لاڳو ڪري ٿو، اتي مسلسل متغير ٺاهي ٿو (انهي طريقي سان نڪرڻ کان پوء، متغير هڪ اعتراض ۾ محفوظ ڪيو ويو) ۽ پتو حاصل ڪرڻ لاء هڪ طريقو لاڳو ڪيو ۽ گھر هاڻي اسان هن شئي کي پروگرام ۾ ٻين هنڌن تي استعمال ڪري سگهون ٿا هڪ شخص جي جڳهه حاصل ڪرڻ لاء. مان سمجهان ٿو ته هي مثال مثالي نه آهي ۽ اهو وڌيڪ صحيح ٿيندو ته اهو صرف ڪلاس ۾ حاصل ڪندڙن کي ڇڏي ڏيڻ سان Person، جڏهن ته، هن طبقي جي تخليق ۽ ان جو ممڪن استعمال ڏيکاريو ويو، ۽ پوء اهو توهان تي منحصر آهي.

گمنام طبقن

هود جي تحت، گمنام طبقن صرف باقاعده غير جامد نسٽڊ ڪلاس آهن. انهن جي خاصيت انهن جي استعمال ۾ آسان آهي. توھان پنھنجي ڪلاس کي سڌو سنئون لکي سگھوٿا جڏھن ڪنھن ٻئي ڪلاس جو مثال ٺاھيو.
public class Animal {
    public void meow() {
        System.out.println("Meow!");
    }

    public static void main(String[] args) {
        Animal anonTiger = new Animal() {
            @Override
            public void meow() {
                System.out.println("Raaar!");
            }
        };

        Animal notAnonTiger = new Animal().new Tiger();

        anonTiger.meow(); // будет выведено Raaar!
        notAnonTiger.meow(); // будет выведено Raaar!
    }

    private class Tiger extends Animal {
        @Override
        public void meow() {
            System.out.println("Raaar!");
        }
    }
}
لازمي طور تي، اسان صرف ٻن شين کي گڏ ڪري رهيا آهيون هڪ جڳهه تي: هڪ مثال ٺاهڻ هڪ طبقي جو مثال ( Animal) ۽ ان جي وارث اندروني طبقي جو مثال ٺاهي ( Tiger). ٻي صورت ۾، اسان کي الڳ الڳ ڪلاس ٺاهڻ جي ضرورت آهي ۽ ساڳئي نتيجو حاصل ڪرڻ لاء ڊگهي تعميرات استعمال ڪرڻ جي ضرورت آهي. گمنام طبقن جو استعمال ڪيترن ئي ڪيسن ۾ جائز آهي، خاص طور تي جڏهن:
  • طبقي جو جسم تمام ننڍو آهي؛
  • ڪلاس جي صرف هڪ مثال جي ضرورت آهي؛
  • ڪلاس ان جاءِ تي استعمال ٿئي ٿو جتي اھو ٺاھيو ويو يا ان کان پوءِ فوري طور تي؛
  • ڪلاس جو نالو اهم نه آهي ۽ ڪوڊ کي سمجهڻ ۾ آسان نه ٿو بڻائي.
گمنام ڪلاس اڪثر ڪري GUIs ۾ ايونٽ هينڊلر ٺاهڻ لاءِ استعمال ٿيندا آهن. مثال طور، هڪ بٽڻ ٺاهڻ ۽ ان جي ڪلڪ تي رد عمل ڪرڻ لاء:
JButton b2 = new JButton("Click");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Кнопка нажата!");
    }
});
بهرحال، جاوا 8 کان پوءِ هنن ليمبڊا ايڪسپريشنز استعمال ڪرڻ شروع ڪيا، پر اڃا تائين 8 ورجن کان اڳ ڪافي ڪوڊ لکيا ويا هئا ۽ شايد توهان کي (۽ جاوا رش ۾ توهان جي ٽريننگ دوران ملندو) اهڙيون لکتون ملن ٿيون.\ analogue with lambdas:
JButton b2 = new JButton("Click");
b2.addActionListener(e -> System.out.println("Кнопка нажата!"));
مضمون جي آخر ۾ توهان سڀني جي توجه لاءِ مهرباني ۽ اميد اٿم ته توهان ڪجهه نئون سکيو هوندو يا ڪجهه سمجهي ورتو هوندو جيڪو توهان اڳ ۾ نه سمجهيا هوندا. مان اهو به واضح ڪرڻ چاهيان ٿو ته هي مضمون ”تفصيل ڏانهن ڌيان ڏيڻ“ جي زمري سان تعلق رکي ٿو . هي منهنجو پهريون ڪم آهي، تنهنڪري مون کي اميد آهي ته اهو ڪنهن لاء مفيد هو. ويجهي مستقبل ۾، جڏهن نوان خيال ايندا، مان ڪوشش ڪندس ته ڪجهه ٻيو لکان، منهنجو صرف هڪ خيال آهي ... سڀني کي مبارڪون ۽ پروگرامنگ ۾ ڪاميابي :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION