JavaRush /Блоги Java /Random-TG /Синфҳо, намудҳои синфҳои лона бо мисолҳо
Ярослав
Сатҳи
Днепр

Синфҳо, намудҳои синфҳои лона бо мисолҳо

Дар гурӯҳ нашр шудааст
Салом ба ҳама. Дар ин мавзӯъ, ман мехоҳам дар бораи дарсҳои Java ва навъҳои онҳо муфассал сӯҳбат кунам, то ба шурӯъкунандагон дар фаҳмидани ин мавзӯъ ва шояд навкорон чизи навро омӯзанд. Агар имконпазир бошад, ҳама чиз бо мисолҳои воқеии ҳаёт бо мисолҳои рамзӣ нишон дода мешавад. Биёед оғоз кунем. Синфҳо, намудҳои синфҳои лона бо мисолҳо - 1Ва ман мехоҳам қайд намоям, ки чизи асосӣ фаҳмидани ду намуди аввали синфҳо аст ва маҳаллӣ ва беном танҳо зергурӯҳҳои синфи дохилӣ мебошанд.

Синф чист?

Синф тавсифи мантиқии чизест, шаблонест, ки бо он шумо метавонед мисолҳои воқеии ҳамон чизеро эҷод кунед. Ба ибораи дигар, ин танҳо тавсифи он аст, ки an objectҳои офаридашуда бояд чӣ гуна бошанд: онҳо бояд чӣ гуна хосиятҳо ва усулҳо дошта бошанд. Хусусиятҳо хусусиятҳои an object мебошанд, усулҳо амалҳое мебошанд, ки онҳо метавонанд иҷро кунанд. Намунаи хуби синфро аз ҳаёти воқеӣ, ки дарки чӣ будани синфро медиҳад, расмҳо ҳисоб кардан мумкин аст: расмҳо барои тавсифи сохторҳо (катапульт, отвертка) истифода мешаванд, аммо расм тарҳрезӣ нест. Чӣ тавре ки муҳандисон нақшаҳоро барои эҷоди тарҳҳо истифода мебаранд, барномасозӣ синфҳоро барои сохтани an objectҳое истифода мебарад, ки хосиятҳо ва усулҳоро тавсиф кардаанд.
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
}
Дар ин мисол, мо синфи Java эҷод кардем, ки an objectи "донишҷӯ"-ро тавсиф мекунад: ҳар як донишҷӯ ном, гурӯҳ ва ихтисос дорад. Акнун, дар ҷойҳои дигари барнома, мо метавонем намунаҳои воқеии ин синфро эҷод кунем. Ба ибораи дигар: агар синф Studentпортрети он чизест, ки донишҷӯ бояд чӣ гуна бошад, пас намунаи офаридашуда худи донишҷӯи воқеӣ аст. Намунаи эҷоди донишҷӯи нав: new Student("Ivan", "KI-17-2", "Computer Engineering");Оператор newсинфро ҷустуҷӯ мекунад Studentва сипас усули махсуси (конструктори) ин синфро даъват мекунад. Конструктор an objectи тайёри синфиро бармегардонад Student- донишҷӯи азизи мо, гурусна бе стипендия :))

Намудҳои дарсҳо дар Java

Дар Java 4 намуди синфҳо дар дохor синфи дигар мавҷуданд:
  1. Синфҳои дохorи дохилӣ синфҳои ғайристатикӣ дар дохor синфи берунӣ мебошанд.

  2. Синфҳои статикии дохилӣ синфҳои статикӣ дар дохor синфи берунӣ мебошанд.

  3. Синфҳои маҳаллии Java синфҳо дар дохor усулҳо мебошанд.

  4. Синфҳои беном Java синфҳое мебошанд, ки дар парвоз сохта мешаванд.

Дар бораи ҳар кадоми онҳо дар алоҳидагӣ сӯҳбат хоҳем кард.

Синфҳои ғайристатикӣ дар дохor синфи беруна

Аввалан, ман мехоҳам, ки шумо фаҳмед, ки ин бо як мисоли воқеӣ чист, зеро он фаҳмидани онро хеле осон мекунад. Ҳамин тавр, ҳоло мо як чизи воқеии бузургро ба ҷузъҳои хурдтар тақсим мекунем ва мо ҳавопайморо ба қисмҳо ҷудо мекунем! Аммо, барои мисол каме нишон додан кифоя аст, мо онро пурра вайрон намекунем. Барои тасаввур кардани ин раванд, мо диаграммаи ҳавопайморо истифода мебарем. Синфҳо, намудҳои синфҳои лона бо мисолҳо - 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Ҳамин тавр, мо дар дохor синф (ҳавопаймо) як синф (ҷинҳо) -и ғайристатикӣ эҷод кардем Airplaneва ду тағирёбанда - ҷиноҳи чап ва ҷиноҳи ростро илова кардем. Ва ҳар як бол дорои хосиятҳои худро (ранг, модел) дорад, ки мо метавонем онҳоро тағир диҳем. Бо ин роҳ шумо метавонед сохторҳоро ба қадри зарурӣ таъмин кунед. Ва қайд кунед: қаблан дар диаграмма қисмҳои зиёди ҳавопаймо мавҷуд буданд ва дар асл, мо метавонем ҳамаи қисмҳоро ба синфҳои дохилӣ тақсим кунем, аммо чунин раванд на ҳамеша тавсия дода мешавад. Чунин лаҳзаҳоро вобаста ба вазифа пайгирӣ кардан лозим аст. Шояд барои ҳалли мушкилот ба шумо болҳо лозим набошад. Он гоҳ ба онҳо лозим нест. Ин мисли буридани одам ба пойҳо, дастҳо, тан ва сар аст - ин имконпазир аст, аммо чаро агар ин синф танҳо барои нигоҳ доштани маълумот дар бораи одамон истифода шавад? Хусусиятҳои синфҳои лонаҳои ғайристатикии Java:
  1. Онҳо танҳо дар an objectҳо мавҷуданд, аз ин рӯ барои сохтани онҳо ба шумо an object лозим аст. Ба ибораи дигар: мо боли худро тарҳрезӣ кардем, ки як қисми ҳавопаймо бошад, пас барои сохтани бол ба мо ҳавопаймо лозим аст, вагарна ба мо лозим нест.
  2. Дар дохor синфи Java тағирёбандаҳои статикӣ буда наметавонанд. Агар ба шумо константаҳо ё ягон чизи дигари статикӣ лозим бошад, шумо бояд онҳоро ба синфи беруна интиқол диҳед. Ин ба пайвастагии зичи синфи ғайристатикӣ бо синфи беруна вобаста аст.
  3. Синф ба ҳама соҳаҳои хусусии синфи берунӣ дастрасии пурра дорад. Ин хусусият бо ду роҳ кор мекунад.
  4. Шумо метавонед истинод ба мисоли синфи беруна гиред. Мисол: Ҳавопаймо.ин пайванд ба ҳавопаймо аст, ин пайванд ба бол аст.

Синфҳои статикӣ дар дохor синфи беруна

Ин навъи синф аз синфи берунии муқаррарӣ фарқ надорад, ба истиснои як чиз: барои сохтани мисоли чунин синф, шумо бояд тамоми роҳро аз синфи берунӣ то роҳи дилхоҳро бо нуқта ҷудо карда номбар кунед. Масалан: 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. Ҳама синфҳо дар дохor синфи волидайни худ ҳастанд. Мо метавонем тамоми иерархияро бидуни кушодани ҳар як синф алоҳида пайгирӣ кунем.
  3. Мо метавонем ба синфи Building муроҷиат кунем ва IDE аллакай рӯйхати тамоми зерсинфҳои ин синфро пешниҳод мекунад. Ин пайдо кардани синфҳои ба шумо лозимиро осонтар мекунад ва тамоми тасвирро ба таври ҳамаҷониба нишон медиҳад.
Намунаи эҷоди як намунаи синфи статикии лона:Building.Shop myShop = new Building.Shop(“Food & Fun!”, “Kalyaeva 8/53”); Ман инчунин мехоҳам қайд намоям, ки ин стратегия дар синфҳои AWT 2D барои тавсифи шаклҳо, ба монанди Line2D, Arc2D, Ellipse2D ва дигарон истифода мешавад.

Синфҳои маҳаллӣ

Ин синфҳо дар дохor усулҳои дигар эълон карда мешаванд. Дарвоқеъ, онҳо дорои тамоми хосиятҳои синфи ғайристатикӣ мебошанд, танҳо мисолҳои онҳоро танҳо дар метод сохтан мумкин аст ва метод статикӣ буда наметавонад (барои сохтани онҳо ба шумо намунаи синфи беруна, истинод ба синф лозим аст. мисоли an objectи даъватшаванда ба таври ғайримустақим ба усулҳои ғайристатикӣ интиқол дода мешавад ва дар усули статикӣ барои ин пайванд усуле вуҷуд надорад). Аммо онҳо хусусиятҳои худро доранд:
  1. Синфҳои маҳаллӣ танҳо бо тағирёбандаҳои усули ниҳоӣ кор карда метавонанд. Гап дар он аст, ки мисолҳои синфҳои маҳаллӣ метавонанд пас аз ба итмом расидани усул дар теппа нигоҳ дошта шаванд ва тағирёбандаро тоза кардан мумкин аст. Агар тағирёбанда ниҳоӣ эълон шуда бошад, пас компилятор метавонад нусхаи тағирёбандаро барои истифодаи минбаъдаи an object захира кунад. Ва як чизи дигар: аз 8+ versionҳои Java, шумо метавонед тағирёбандаҳои ниҳоӣро дар синфҳои маҳаллӣ истифода баред, аммо танҳо ба шарте, ки онҳо тағир наёбанд.
  2. Синфҳои маҳаллиро бо тағирдиҳандаҳои дастрасӣ эълон кардан мумкин нест.
  3. Синфҳои маҳаллӣ ба тағирёбандаҳои метод дастрасӣ доранд.
Синфҳои маҳаллиро хеле кам пайдо кардан мумкин аст, зеро онҳо хондани codeро душвор мегардонанд ва ягон бартарият надоранд, ба истиснои як дастрасӣ ба тағирёбандаҳои метод. Ман намедонам, ки кадом намунаи синфи маҳаллиро гирифтан мумкин аст, ки истифодаи самараноки онҳоро нишон диҳад, бинобар ин ман танҳо намунаи худро нишон медиҳам. Фарз мекунем, ки мо як синф дорем Person(фарз карда мешавад, ки ин шахс аст) дорои моликият street(кӯча), house(хона). Мо мехоҳем ягон an objectро баргардонем, то танҳо ба маҳалли ҷойгиршавии шахс дастрасӣ пайдо кунем. Барои ин, мо интерфейси 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
}
Тавре ки шумо мебинед, мо дар дохor усул синферо таъсис додем, ки нигоҳдории ҷойгиршавии шахсро амалӣ мекунад, дар он ҷо тағирёбандаҳои доимиро эҷод кардем (то он ки пас аз баромадан аз усул тағирёбандаҳо дар an object нигоҳ дошта мешуданд) ва усули гирифтани суроға ва хона. Акнун мо метавонем ин an objectро дар дигар ҷойҳо дар барнома барои дарёфти ҷойгиршавии шахс истифода барем. Ман мефаҳмам, ки ин мисол идеалӣ нест ва дурусттар аст, ки он танҳо бо гузоштани гетерҳо дар синф анҷом дода шавад 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) ва эҷоди як намунаи синфи дохorи вориси он ( Tiger). Дар акси ҳол, ба мо лозим аст, ки синфро алоҳида эҷод кунем ва барои ба даст овардани як натиҷа конструксияҳои дарозтарро истифода барем. Истифодаи синфҳои беном дар бисёр ҳолатҳо асоснок аст, аз ҷумла, вақте ки:
  • бадани синф хеле кӯтоҳ аст;
  • танҳо як мисоли синф лозим аст;
  • синф дар ҷое, ки сохта шудааст ё фавран пас аз он истифода мешавад;
  • Номи синф муҳим нест ва фаҳмидани рамзро осон намекунад.
Синфҳои беном аксар вақт дар GUI барои эҷоди коркардкунандагони рӯйдодҳо истифода мешаванд. Масалан, барои сохтани тугма ва вокуниш ба пахши он:
JButton b2 = new JButton("Click");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Кнопка нажата!");
    }
});
Бо вуҷуди ин, пас аз Java 8 онҳо ба истифодаи ифодаҳои лямбда шурӯъ карданд, аммо то ҳол пеш аз versionи 8 codeҳои зиёде навишта шуда буданд ва шумо метавонед бо чунин навиштаҷот дучор шавед (ва ҳангоми омӯзиши JavaRush бо JavaRush дучор хоҳед шуд).\ Аналог бо лямбдаҳо:
JButton b2 = new JButton("Click");
b2.addActionListener(e -> System.out.println("Кнопка нажата!"));
Анҷоми мақола Ташаккур ба ҳама барои таваҷҷуҳ ва ман умедворам, ки шумо чизи навро фаҳмидед ё чизеро, ки қаблан нафаҳмида будед, фаҳмидед. Ман инчунин мехоҳам фаҳмонам, ки ин мақола ба категорияи "диққат ба тафсилот" тааллуқ дорад . Ин аввалин кори ман аст, бинобар ин умедворам, ки он барои касе муфид буд. Дар ояндаи наздик вакте ки идеяхои нав меоянд, кушиш мекунам, ки чизи дигар нависам, танхо як фикр дорам... Барори кор ба хама ва дар барномасози муваффакият :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION