JavaRush /Java блогы /Random-KK /Класстар, мысалдармен кірістірілген кластардың түрлері
Ярослав
Деңгей
Днепр

Класстар, мысалдармен кірістірілген кластардың түрлері

Топта жарияланған
Бәріңе сәлем. Бұл тақырыпта мен жаңадан бастаушыларға осы тақырыпты түсінуге көмектесу үшін Java сыныптары және олардың түрлері туралы егжей-тегжейлі сөйлескім келеді, мүмкін, жаңадан басталмағандар жаңа нәрсені үйренуі мүмкін. Мүмкін болса, барлығы ілеспе code мысалдарымен нақты өмірден алынған мысалдар арқылы көрсетіледі. Бастайық. Класстар, мысалдармен кірістірілген кластардың түрлері – 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
}
Бұл мысалда біз «студент» нысанын сипаттайтын Java сыныбын жасадық: әр студенттің аты, тобы және мамандығы бар. Енді бағдарламаның басқа жерлерінде біз осы сыныптың нақты мысалдарын жасай аламыз. Басқаша айтқанда: егер сынып Studentоқушының қандай болуы керек портреті болса, онда жасалған дананың өзі нақты оқушы болып табылады. Жаңа оқушыны құру мысалы: new Student("Ivan", "KI-17-2", "Computer Engineering");Оператор newсыныпты іздейді Student, содан кейін осы класстың арнайы әдісін (конструкторын) шақырады. Конструктор дайын сынып нысанын қайтарады Student- біздің қымбатты, аш студент шәкіртақысыз :))

Java тіліндегі сыныптардың түрлері

Java тілінде басқа сынып ішінде 4 түрлі сыныптар бар:
  1. Кірістірілген ішкі сыныптар сыртқы сынып ішіндегі статикалық емес сыныптар болып табылады.

  2. Кірістірілген статикалық сыныптар сыртқы сынып ішіндегі статикалық сыныптар болып табылады.

  3. Java жергілікті сыныптары әдістер ішіндегі сыныптар болып табылады.

  4. Анонимді Java сыныптары - жылдам жасалатын сыныптар.

Олардың әрқайсысы туралы бөлек айтатын боламыз.

Сыртқы класс ішіндегі статикалық емес сыныптар

Біріншіден, нақты мысал арқылы оның не екенін түсінгеніңізді қалаймын, өйткені бұл түсінуді жеңілдетеді. Енді біз нағыз үлкен нәрсені кішірек құрамдас бөліктерге бөліп, ұшақты бөлшектейтін боламыз! Дегенмен, мысал үшін аздап көрсету жеткілікті болады, біз оны толығымен бұзбаймыз. Бұл процесті бейнелеу үшін біз ұшақ диаграммасын қолданамыз. Біріншіден, біз кішкене сипаттама қосуға болатын Класстар, мысалдармен кірістірілген кластардың түрлері – 2 класс жасауымыз керек : ұшақ атауы, сәйкестендіру codeы, ұшу.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, екі айнымалыны қостық - сол қанат және оң қанат. Ал әр қанаттың біз өзгерте алатын өзіндік қасиеттері (түсі, үлгісі) бар. Осылайша сіз құрылымдарды қажетінше құра аласыз. Назар аударыңыз: бұрын диаграммада ұшақтың бөліктері өте көп болды, және, шын мәнінде, біз барлық бөліктерді ішкі сыныптарға бөлуге болады, бірақ мұндай процесс әрқашан ұсынылмайды. Мұндай сәттерді тапсырмаға байланысты қадағалау керек. Мәселені шешу үшін сізге қанаттар мүлдем қажет болмауы мүмкін. Содан кейін оларды жасаудың қажеті жоқ. Бұл адамның аяғына, қолына, денесіне және басына кесу сияқты - бұл мүмкін, бірақ неге бұл сынып тек адамдар туралы деректерді сақтау үшін пайдаланылса? Статикалық емес кірістірілген Java сыныптарының мүмкіндіктері:
  1. Олар тек нысандарда бар, сондықтан оларды жасау үшін an object қажет. Басқаша айтқанда: біз қанатымызды ұшақтың бөлігі болатындай етіп жасадық, сондықтан қанат жасау үшін бізге ұшақ керек, әйтпесе ол бізге қажет емес.
  2. Java класында статикалық айнымалылар болуы мүмкін емес. Егер сізге тұрақты мәндер немесе басқа статикалық нәрсе қажет болса, оларды сыртқы сыныпқа жылжыту керек. Бұл статикалық емес кірістірілген класстың сыртқы сыныппен тығыз байланысына байланысты.
  3. Сыныптың сыртқы сыныптың барлық жеке өрістеріне толық рұқсаты бар. Бұл мүмкіндік екі жолмен жұмыс істейді.
  4. Сыртқы сынып данасына сілтеме алуға болады. Мысалы: Ұшақ.бұл ұшақтың сілтемесі, бұл қанаттың сілтемесі.

Сыртқы сынып ішіндегі статикалық сыныптар

Класстың бұл түрі кәдімгі сыртқы сыныптан еш айырмашылығы жоқ, тек бір нәрседен басқа: мұндай класс данасын жасау үшін сыртқы сыныптан қажеттіге дейінгі барлық жолды нүктемен бөліп көрсету керек. Мысалы: 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. Біз Building класына сілтеме жасай аламыз және IDE қазірдің өзінде осы сыныптың барлық ішкі сыныптарының толық тізімін ұсынады. Бұл сізге қажет сыныптарды табуды жеңілдетеді және бүкіл суретті тұтастай көрсетеді.
Кірістірілген статикалық класс данасын жасау мысалы:Building.Shop myShop = new Building.Shop(“Food & Fun!”, “Kalyaeva 8/53”); Сондай-ақ, бұл стратегия AWT 2D сыныптарында Line2D, Arc2D, Ellipse2D және т.б. сияқты кескіндерді сипаттау үшін қолданылатынын атап өткім келеді.

Жергілікті сыныптар

Бұл сыныптар басқа әдістер ішінде жарияланған. Шындығында, оларда статикалық емес кірістірілген сыныптың барлық қасиеттері бар, тек олардың даналары әдісте ғана жасалуы мүмкін және әдіс статикалық болуы мүмкін емес (оларды жасау үшін сізге сыртқы класс данасы, сілтеме қажет. шақырушы an objectінің данасы статикалық емес әдістерге жанама түрде беріледі, ал статикалық әдісте бұл сілтеме үшін әдіс жоқ). Бірақ олардың өзіндік ерекшеліктері бар:
  1. Жергілікті сыныптар тек соңғы әдіс айнымалыларымен жұмыс істей алады. Мәселе мынада, жергілікті сыныптардың даналарын әдіс аяқталғаннан кейін үймеде сақтауға болады және айнымалыны өшіруге болады. Егер айнымалы түпкілікті деп жарияланса, онда компилятор айнымалының көшірмесін кейінірек нысанмен пайдалану үшін сақтай алады. Тағы бір нәрсе: Java-ның 8+ нұсқасы болғандықтан, сіз жергілікті сыныптарда соңғы емес айнымалыларды пайдалана аласыз, бірақ олар өзгермейтін жағдайда ғана.
  2. Жергілікті сыныптарды қатынас модификаторларымен жариялау мүмкін емес.
  3. Жергілікті сыныптар әдіс айнымалыларына қол жеткізе алады.
Жергілікті сыныптарды өте сирек кездестіруге болады, өйткені олар codeты оқуды қиындатады және ешқандай артықшылықтарға ие емес, тек біреуінен басқа - әдіс айнымалыларына қол жеткізу. Мен олардың тиімді қолданылуын көрсететін жергілікті сыныптың қандай мысалын алуға болатынын білмеймін, сондықтан мен өз мысалымды көрсетемін. Бізде қасиеттері (көше), (үй) Personбар класс (бұл адам деп болжанатын болады) бар делік . Біз тек адамның орналасқан жеріне қол жеткізу үшін кейбір нысанды қайтарғымыз келеді. Ол үшін біз AddressContainer интерфейсін жасадық, ол адамның орналасқан жері туралы деректерді сақтауды білдіреді. streethouse
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
}
Көріп отырғаныңыздай, әдіс ішінде біз адамның орналасқан жерін сақтауды жүзеге асыратын класс құрдық, сол жерде тұрақты айнымалылар құрдық (әдістен шыққаннан кейін айнымалылар 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) және оның мұрагер ішкі класының данасын жасау ( Tiger). Әйтпесе, сыныпты бөлек жасап, сол нәтижеге жету үшін ұзағырақ конструкцияларды пайдалануымыз керек. Анонимді сыныптарды пайдалану көптеген жағдайларда, атап айтқанда:
  • сынып құрамы өте қысқа;
  • сыныптың бір ғана данасы қажет;
  • сынып құрылған жерде немесе одан кейін бірден қолданылады;
  • Сынып атауы маңызды емес және codeты түсінуді жеңілдетпейді.
Оқиға өңдегіштерін жасау үшін GUI-де анонимді сыныптар жиі пайдаланылады. Мысалы, түймені жасау және оның басылуына әрекет ету үшін:
JButton b2 = new JButton("Click");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Кнопка нажата!");
    }
});
Дегенмен, Java 8 нұсқасынан кейін олар лямбда өрнектерін қолдана бастады, бірақ әлі де 8 нұсқасына дейін көптеген code жазылған және сіз мұндай жазуларды кездестіруіңіз мүмкін (және 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