JavaRush /Java Blog /Random-TK /Synplar, mysallar bilen höwürtgelenen synplaryň görnüşler...
Ярослав
Dereje
Днепр

Synplar, mysallar bilen höwürtgelenen synplaryň görnüşleri

Toparda çap edildi
Hemmäňize salam! Bu mowzukda, täze öwrenýänlere bu mowzuga düşünmäge kömek etmek üçin Java synplary we olaryň görnüşleri barada jikme-jik gürleşmek isleýärin, belki-de täze bolmadyklar täze bir zat öwrenerler. Mümkin bolan ýagdaýynda, kod kodlary bilen hakyky durmuşdaky mysallary ulanyp hemme zat görkeziler. Başlalyň. Synplar, mysallar bilen höwürtgelenen synplaryň görnüşleri - 1Iň esasy zat, synplaryň ilkinji iki görnüşine düşünmekdigini, ýerli we anonimleriň diňe içki synpyň görnüşleri bolandygyny belläsim gelýär.

Sapak näme?

Synp, bir zadyň logiki beýany, şol zadyň hakyky mysallaryny döredip boljak şablon. Başga sözler bilen aýdylanda, bu diňe döredilen guramalaryň nähili bolmalydygynyň beýany: haýsy häsiýetlere we usullara eýe bolmaly. Sypatlar bir zadyň häsiýetleri, usullar ýerine ýetirip biljek hereketlerdir. Synpyň nämedigine düşünýän hakyky durmuşdan synpyň gowy mysaly, çyzgylar hasaplanyp bilner: çyzgylar gurluşlary (katapult, tornavida) beýan etmek üçin ulanylýar, ýöne çyzgy dizaýn däl. In engineenerleriň dizaýn döretmek üçin meýilnamalary ulanşy ýaly, programmirleme häsiýetleri we usullary beýan eden obýektleri döretmek üçin sapaklary ulanýar.
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
}
Bu mysalda, “talyp” guramany suratlandyrýan Java synpyny döretdik: her bir okuwçynyň ady, topary we hünäri bar. Indi, programmanyň beýleki ýerlerinde bu synpyň hakyky mysallaryny döredip bileris. Başga sözler bilen aýdylanda: eger synp Studentokuwçynyň nähili bolmalydygyny görkezýän portret bolsa, döredilen mysal hakyky okuwçynyň özi. Täze okuwçy döretmegiň mysaly: new Student("Ivan", "KI-17-2", "Computer Engineering");Operator newsynpy gözleýär Studentwe soňra bu synpyň ýörite usulyny (konstruktory) çagyrýar. Gurluşykçy taýýar synp obýektini Student- stipendiýasyz eziz, aç okuwçymyzy yzyna gaýtaryp berýär :))

Java-da sapaklaryň görnüşleri

Java-da başga bir synpyň içinde 4 görnüşli synp bar:
  1. Içerki içerki synplar daşarky synpyň içinde statik däl synplardyr.

  2. Içerki statiki synplar daşarky synpyň içindäki statiki synplardyr.

  3. Java ýerli synplar usullaryň içinde sapaklardyr.

  4. Anonim Java synplary, uçuşda döredilen sapaklardyr.

Olaryň hersi barada aýratyn gürleşeris.

Daşarky synpyň içinde statik däl synplar

Ilki bilen, hakyky mysal bilen nämedigine düşünmegiňizi isleýärin, sebäbi düşünmegi has aňsatlaşdyrýar. Şonuň üçin indi hakyky uly bir zady kiçijik böleklere böleris we uçary sökeris! Şeýle-de bolsa, mysal üçin azajyk görkezmek ýeterlik bolar, biz ony doly bozmarys. Bu prosesi göz öňüne getirmek üçin uçar diagrammasyny ulanarys. Ilki bilen azajyk düşündiriş goşup biljek Synplar, mysallar bilen höwürtgelenen synplaryň görnüşleri - 2 synpymyzy döretmeli : uçaryň ady, şahsyýet kody, uçuş.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
}
Indi ganat goşmak isleýäris. Aýry synp dörediň? Uçarlary dizaýn etmek üçin çylşyrymly programmamyz bar bolsa we köp sanly alnan synplary (ene-atalar synpy bilen birmeňzeş logika eýe bolan synplar, ýagny miras alýan synplar) döretmeli ýerimiz bar bolsa, bu mantykdyr. şonuň üçin logika ýa-da has jikme-jik aýratynlyklary goşup ene-atalar synpyny giňeldýärler), ýöne diňe bir uçarymyz bar bolan oýun bar bolsa näme etmeli? Şonda ähli gurluşy bir ýerde (bir synpda) tamamlamak has rasional bolar. Bu ýerde statik däl höwürtge synplary oýnaýar. Aslynda, bu daşarky synpymyzyň käbir jikme-jiklikleriniň has jikme-jik beýanydyr. Bu mysalda, uçar üçin çep we saga ganat döretmeli. Geliň döredeliň!
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Şeýlelik bilen bir synpyň (uçaryň) içinde statik däl höwürtge synpyny (ganat) döretdik Airplanewe iki üýtgeýjini goşduk - çep ganat we sag ganat. Her ganatyň üýtgedip biljek aýratynlyklary (reňki, modeli) bar. Şeýlelik bilen, gurluşlary näçe gerek bolsa işgär edip bilersiňiz. Üns beriň: ozal diagrammada uçar üçin bölekler gaty köpdi we aslynda ähli bölekleri içerki synplara bölüp bileris, ýöne beýle amal hemişe maslahat berilmeýär. Şeýle pursatlary meselä baglylykda yzarlamaly. Meseläni çözmek üçin asla ganat gerek bolmazlygy mümkin. Onda olary etmegiň zerurlygy ýok. Adamy aýaklaryna, gollaryna, göwresine we kellesine kesen ýaly - bu mümkin, ýöne näme üçin bu synp diňe adamlar hakda maglumatlary saklamak üçin ulanylsa? Statik däl öýjükli Java synplarynyň aýratynlyklary:
  1. Olar diňe obýektlerde bar, şonuň üçin olary döretmek üçin bir obýekt gerek. Başga sözler bilen aýdylanda: ganatymyzy uçaryň bir bölegi hökmünde düzdük, şonuň üçin ganat döretmek üçin uçar gerek, ýogsam bize gerek däl.
  2. Java synpynyň içinde statiki üýtgeýjiler bolup bilmez. Käbir yzygiderlilik ýa-da statik başga bir zat gerek bolsa, olary daşarky synpa geçirmeli. Bu, statik däl höwürtge synpynyň daşarky synp bilen ýakyn birleşmegi bilen baglanyşykly.
  3. Bu synp daşarky synpyň ähli hususy meýdanlaryna doly girip biler. Bu aýratynlyk iki ugurda işleýär.
  4. Daşarky synpyň mysalyna salgylanma alyp bilersiňiz. Mysal: Uçar. Bu uçara baglanyşyk, bu ganata baglanyşyk.

Daşarky synpyň içindäki statiki synplar

Synpyň bu görnüşi, adaty bir synpdan tapawudy ýok, bir zatdan başga: şeýle synpyň mysalyny döretmek üçin daşarky synpdan islenýän tarapa nokat bilen bölünen ähli ýoly sanamaly. Mysal üçin: Building.Plaftorm platform = new Building.Platform(); Logiki gurluş bilen işlemek has aňsat bolar ýaly, statiki synplar baglanyşykly synplary gapdala goýmak üçin ulanylýar. Mysal üçin: daşarky synp döredip bileris Building, bu ýerde belli bir binany görkezjek synplaryň belli bir sanawy bolar.
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
}
Bu mysal, statiki synplaryň logiki gurluşy has amatly görnüşde gaplamaga nädip mümkinçilik berýändigini görkezýär. Eger olar ýok bolsa, düýbünden 4 dürli synp döretmeli bolarys. Bu çemeleşmäniň artykmaçlyklary:
  1. Sapaklaryň sany azaldy.
  2. Classeshli synplar ene-atalar synpynda. Her synpy aýratyn açmazdan tutuş iýerarhiýany yzarlap bilýäris.
  3. Gurluşyk synpyna ýüz tutup bileris we IDE eýýäm bu synpyň ähli kiçi toparlarynyň sanawyny sorar. Bu size zerur sapaklary tapmagy we tutuş suraty has birmeňzeş görkezmegi aňsatlaşdyrar.
Içindäki statiki synpyň mysalyny döretmegiň mysaly:Building.Shop myShop = new Building.Shop(“Food & Fun!”, “Kalyaeva 8/53”); Bu strategiýanyň AWT 2D synplarynda Line2D, Arc2D, Ellipse2D we beýlekiler ýaly şekilleri suratlandyrmak üçin ulanylýandygyny belläsim gelýär.

Classeserli synplar

Bu synplar beýleki usullaryň içinde yglan edilýär. Aslynda, statik däl höwürtge synpynyň ähli häsiýetleri bar, diňe mysallary diňe bir usul bilen döredilip bilner we usul statik bolup bilmez (olary döretmek üçin daşarky synpyň mysaly, salgylanma gerek) çagyryş obýektiniň mysaly statiki däl usullara gönüden-göni geçýär we statiki usulda bu baglanyşyk üçin usul ýok). Emma olaryň öz aýratynlyklary bar:
  1. Classeserli synplar diňe soňky usul üýtgeýjileri bilen işläp biler. .Eri gelende aýtsak, ýerli synplaryň mysallary usul gutarandan soň üýşmekde saklanyp bilner we üýtgeýjini pozup bolýar. Üýtgeýji gutarnykly diýlip yglan edilse, düzüji üýtgeýjiniň göçürmesini obýekt tarapyndan soňraky ulanmak üçin saklap biler. Moreene bir zat: Java-yň 8+ wersiýasyndan bäri, ýerli synplarda gutarnykly üýtgeýjileri ulanyp bilersiňiz, ýöne üýtgemezligi şerti bilen.
  2. Accesserli synplary giriş üýtgedijileri bilen yglan edip bolmaz.
  3. Classeserli synplarda usul üýtgeýjileri bar.
Classeserli synplary gaty seýrek tapyp bolýar, sebäbi kody okamagy kynlaşdyrýar we birinden başga hiç hili artykmaçlygy ýok - usul üýtgeýjilerine girmek. Netijeli ulanylyşyny görkezýän ýerli synpyň haýsy mysalyny alyp boljakdygyny bilemok, şonuň üçin diňe mysalymy görkezerin. Aýratynlyklary (köçesi), (jaýy) bolan synpymyz bar Person(bu adamdyr öýdüler) . Diňe adamyň ýerleşýän ýerine girmek üçin käbir obýekti yzyna gaýtarmak isleýäris. Munuň üçin adamyň ýerleşýän ýeri barada maglumatlaryň saklanmagyny göz öňünde tutýan “AddressContainer” interfeýsini döretdik. 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
}
Görşüňiz ýaly, usulyň içinde adamyň ýerleşýän ýerini saklaýan, şol ýerde hemişelik üýtgeýänleri döredýän synp döreddik (usuldan çykandan soň üýtgeýjiler bir obýektde saklanýar) we adresi almak usulyny durmuşa geçirdik we jaý. Indi bu obýekti adamyň ýerleşýän ýerini almak üçin programmanyň beýleki ýerlerinde ulanyp bileris. Bu mysalyň ideal däldigine düşünýärin we muny diňe synpda goýup goýmak has dogry bolardy Person, ýöne bu synpyň döredilmegi we ulanylmagy mümkin görkezildi, soň bolsa size bagly.

Anonim synplar

Kapotyň aşagynda, anonim synplar diňe statik däl höwürtge sapaklarydyr. Olaryň aýratynlygy, ulanmagyň aňsatlygydyr. Başga bir synpyň mysaly döredilende synpyňyzy göni ýazyp bilersiňiz.
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!");
        }
    }
}
Aslynda, iki zady bir ýerde birleşdirýäris: bir synpyň ( Animal) mysalyny döretmek we mirasdüşeriň içki synpynyň ( Tiger) mysalyny döretmek. Otherwiseogsam, synpy aýratyn döretmeli we şol bir netijä ýetmek üçin has uzyn gurluşlary ulanmaly. Anonim synplaryň ulanylmagy köp halatlarda, esasanam:
  • synp bedeni gaty gysga;
  • synpyň diňe bir mysaly zerur;
  • synp döredilen ýerinde ýa-da ondan soň derrew ulanylýar;
  • Synpyň ady möhüm däl we kody düşünmegi aňsatlaşdyrmaýar.
Anonim synplar köplenç hadysalary dolandyrmak üçin GUI-lerde ulanylýar. Mysal üçin, düwme döretmek we onuň basylmagyna reaksiýa döretmek üçin:
JButton b2 = new JButton("Click");
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Кнопка нажата!");
    }
});
Şeýle-de bolsa, Java 8-den soň lambda aňlatmalaryny ulanyp başladylar, ýöne 8-nji wersiýadan öň köp kod ýazyldy we siz şeýle ýazgylara duş gelip bilersiňiz (we JavaRush-da tälim alanyňyzda duşarsyňyz). \ Lambdas bilen analog:
JButton b2 = new JButton("Click");
b2.addActionListener(e -> System.out.println("Кнопка нажата!"));
Makalanyň soňy Üns bereniňiz üçin hemmäňize sag bolsun aýdýaryn we täze bir zat öwrendiňiz ýa-da ozal düşünmedik zadyňyza düşünersiňiz diýip umyt edýärin. Şeýle hem, bu makalanyň “jikme-jikliklere üns” kategoriýasyna degişlidigini düşündirmek isleýärin . Bu meniň ilkinji işim, şonuň üçin kimdir biri üçin peýdaly diýip umyt edýärin. Ideasakyn geljekde täze pikirler gelende, başga bir zat ýazjak bolaryn, diňe bir pikirim bar ... Hemmäňize üstünlik we programmirlemekde üstünlik :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION