JavaRush /Java Blog /Random-TK /Java-da polimorfizm

Java-da polimorfizm

Toparda çap edildi
OOP baradaky soraglar, Java kompaniýasynyň IT kompaniýasyndaky wezipesi üçin tehniki söhbetdeşligiň aýrylmaz bölegidir. Bu makalada OOP ýörelgelerinden biri - polimorfizm hakda gürleşeris. Söhbetdeşlikler wagtynda köplenç soralýan taraplara ünsi jemläris we aýdyňlyk üçin kiçijik mysallar bereris.

Polimorfizm näme?

Polimorfizm , programmanyň bu obýektiň belli bir görnüşi barada maglumat bolmazdan, şol bir interfeýsli obýektleri birmeňzeş ulanmak ukybydyr. Polimorfizm näme diýen soraga şu görnüşde jogap berseňiz, näme diýjek bolýandygyňyzy düşündirmegiňiz mümkin. Againene-de bir topar goşmaça sorag soraman, söhbetdeş üçin hemme zady düzüň.

Söhbetdeşlikde Java-da polimorfizm - 1
OOP çemeleşmesiniň synplara esaslanýan obýektleriň özara täsirine esaslanýan Java programmasyny gurmagy öz içine alýandygyna başlap bileris. Sapaklar programmada haýsy obýektleriň dörediljekdigini öňünden ýazylan çyzgylar (şablonlar). Mundan başga-da, synpyň elmydama belli bir görnüşi bolýar, oňat programmirleme stili bilen maksadyny ady bilen “aýdýar”. Mundan başga-da, Java-yň güýçli ýazylan dili bolany üçin, programma kody üýtgeýjiler yglan edilende obýektiň görnüşini görkezmelidir. Gaty ýazmak, kod howpsuzlygyny we programmanyň ygtybarlylygyny ýokarlandyrýar we düzmek tapgyrynda görnüşiň gabat gelmeýän ýalňyşlyklarynyň (mysal üçin, setiri san bilen bölmek synanyşygynyň) öňüni almaga mümkinçilik berýär. Elbetde, düzüji yglan edilen görnüşi “bilmeli” - bu JDK-dan ýa-da özümiziň döreden synpymyz bolup biler. Söhbetdeşlige programma kody bilen işlänimizde, yglan edenimizde diňe bellän görnüşimizi däl, eýsem onuň nesillerini hem ulanyp biljekdigimize üns bermegiňizi haýyş edýäris. Bu möhüm bir nokat: köp görnüşlere edil bir görnüşi ýaly seredip bileris (şol görnüşler esasy görnüşden alnança). Bu, şeýle hem, superklass görnüşiniň üýtgeýjisini yglan edip, oňa nesilleriniň biriniň bahasyny belläp biljekdigimizi aňladýar. Mysal berseňiz, söhbetdeş göwnünden turar. Obýektleriň topary üçin umumy (esas) bolup biljek käbir obýekti saýlaň we ondan birnäçe synp miras alyň. Esasy synp:
public class Dancer {
    private String name;
    private int age;

    public Dancer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void dance() {
        System.out.println(toString() + "I dance like everyone else.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. " ;
    }
}
Nesillerde esasy synp usulyny ýok ediň:
public class ElectricBoogieDancer extends Dancer {
    public ElectricBoogieDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance() {
        System.out.println( toString() + "I dance electric boogie!");
    }
}

public class BreakDankDancer extends Dancer{

    public BreakDankDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance(){
        System.out.println(toString() + "I'm breakdancing!");
    }
}
Java-da polimorfizmiň we programmada obýektleriň ulanylmagynyň mysaly:
public class Main {

    public static void main(String[] args) {
        Dancer dancer = new Dancer("Anton", 18);

        Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);// upcast to base type
        Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20); // upcast to base type

        List<Dancer> discotheque = Arrays.asList(dancer, breakDanceDancer, electricBoogieDancer);
        for (Dancer d : discotheque) {
            d.dance();// polymorphic method call
        }
    }
}
Usul kodunda setirlerdäki zatlary maingörkeziň :
Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);
Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20);
Superklass görnüşli üýtgeýjini yglan etdik we oňa nesilleriň biriniň bahasyny belledik. Javahtimal, Java-da berk ýazuw barlygy sebäpli, düzüjiniň çepde we bellik belgisiniň sagynda yglan edilen görnüşleriň arasyndaky gabat gelmezlikden nägilelik bildirmezligi soralar. Typeokarky görnüşli öwrülişigiň bu ýerde işleýändigini düşündiriň - bir obýekte salgylanma esasy synpa salgylanma hökmünde düşündirilýär. Mundan başga-da, düzüji kodda şeýle gurluşyk bilen ýüzbe-ýüz bolup, muny awtomatiki we aç-açan edýär. DancerMysal kody esasynda, bellik belgisiniň çep tarapynda yglan edilen synp görnüşiniň sag tarapda yglan edilen birnäçe görnüşiniň (görnüşiniň) bardygyny görkezip bolýar BreakDankDancer, ElectricBoogieDancer. Formalaryň hersiniň superklass - usulda kesgitlenen umumy işlemegi üçin özboluşly häsiýeti bolup biler dance. Supagny, superklasda yglan edilen usul onuň nesillerinde başgaça durmuşa geçirilip bilner. Bu ýagdaýda, usuly ýokaşdyrmak bilen iş salyşýarys we dürli görnüşleri (özüni alyp barşyny) döredýän zat şu. Muny ýerine ýetirmek üçin esasy usul kody bilen görüp bilersiňiz: Programmanyň çykyşy Men Anton, 18 ýaşymda. Men hemmeler ýaly tans edýärin. Men Alekseý, 19 ýaşymda Men bozulýaryn! Men Igor, 20 ýaşymda Elektrik bogini tans edýärin! Nesillerde artykmaç ulanmagy ulanmasak, başgaça hereket etmeris. Mysal üçin, sapaklarymyzyň usulyny düşündirsek BreakDankDancer, programmanyň netijesi şeýle bolar: Men Anton, 18 ýaşymda. Men hemmeler ýaly tans edýärin. Men Alekseý, 19 ýaşymda Men hemmeler ýaly tans edýärin. Men Igor, 20 ýaşymda Men hemmeler ýaly tans edýärin. we bu täze synplary döretmegiň manysynyň ýokdugyny aňladýar . Java polimorfizm prinsipi näme? Programmada obýektiň aýratyn görnüşini bilmän ulanmak nirede gizlenýär? Mysalymyzda, bu görnüşdäki obýekte çagyryş usulydyr . Java polimorfizm, programmanyň obýektiň ýa-da obýektiň haýsy görnüşini bilmeginiň zerurlygynyň ýokdugyny aňladýar . Esasy zat, bu synpyň nesli . Nesiller hakda aýtsak, Java-da mirasyň diňe bir däl , eýsem-de bolsa bardygyny hem bellemelidiris . Indi Java-yň birnäçe mirasy goldamaýandygyny ýatdan çykarmagyň wagty geldi - her bir görnüşde bir ene-atasy (superklass) we çäksiz nesil (kiçi klass) bolup biler. Şonuň üçin interfeýsler sapaklara köp funksiýa goşmak üçin ulanylýar. Interfeýsler miras bilen deňeşdirilende obýektleriň ene-atanyň birleşmegini azaldýar we örän giňden ulanylýar. Java-da interfeýs salgylanma görnüşidir, şonuň üçin bir programma görnüşi interfeýs görnüşiniň üýtgeýjisi diýip yglan edip biler. Mysal bermek üçin bu amatly pursat. Interfeýsi döredeliň: ElectricBoogieDancerdanceBreakDankDancerElectricBoogieDancerd.dance()dDancerBreakDankDancerElectricBoogieDancerDancerextendsimplements
public interface Swim {
    void swim();
}
Has düşnükli bolmak üçin, geliň dürli we baglanyşyksyz zatlary alalyň we interfeýsi durmuşa geçireliň:
public class Human implements Swim {
    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void swim() {
        System.out.println(toString()+"I swim with an inflatable ring.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. ";
    }

}

public class Fish implements Swim{
    private String name;

    public Fish(String name) {
        this.name = name;
    }

    @Override
    public void swim() {
        System.out.println("I'm a fish " + name + ". I swim by moving my fins.");

    }

public class UBoat implements Swim {

    private int speed;

    public UBoat(int speed) {
        this.speed = speed;
    }

    @Override
    public void swim() {
        System.out.println("The submarine is sailing, rotating the propellers, at a speed" + speed + " knots.");
    }
}
Usul main:
public class Main {

    public static void main(String[] args) {
        Swim human = new Human("Anton", 6);
        Swim fish = new Fish("whale");
        Swim boat = new UBoat(25);

        List<Swim> swimmers = Arrays.asList(human, fish, boat);
        for (Swim s : swimmers) {
            s.swim();
        }
    }
}
Interfeýsde kesgitlenen polimorf usuly ýerine ýetirmegiň netijesi, şol interfeýsi amala aşyrýan görnüşleriň özüni alyp barşynda tapawutlary görmäge mümkinçilik berýär. Usuly ýerine ýetirmegiň dürli netijelerinden ybarat swim. Mysalymyzy öwrenenimizden soň, söhbetdeş näme üçin kod ýerine ýetirilende sorap bilermain
for (Swim s : swimmers) {
            s.swim();
}
Bu synplarda kesgitlenen usullar obýektlerimiz üçin çagyrylýarmy? Bir programma ýerine ýetirilende usulyň islenýän ýerine ýetirilişini nädip saýlamaly? Bu soraglara jogap bermek üçin giç (dinamiki) baglanyşyk hakda gürleşmeli. Baglamak bilen, usul çagyryşy bilen synplarda onuň ýerine ýetirilişiniň arasynda baglanyşyk gurmagy göz öňünde tutýarys. Aslynda, kod synplarda kesgitlenen üç usulyň haýsysynyň ýerine ýetiriljekdigini kesgitleýär. Java adaty ýagdaýda giç baglanyşygy ulanýar (irki baglanyşykda bolşy ýaly, düzmek wagty däl-de, iş wagty). Diýmek, kod düzülende
for (Swim s : swimmers) {
            s.swim();
}
Humandüzüji koduň haýsy synpdadygyny ýa Fish-da Uboatýerine ýetiriljekdigini entek bilenok swim. Bu diňe programma dinamiki iberiş mehanizminiň kömegi bilen ýerine ýetirilende kesgitlener - programma ýerine ýetirilende obýektiň görnüşini barlamak we bu görnüş üçin usulyň islenýän ýerine ýetirilişini saýlamak. Munuň nähili amala aşyrylýandygyny sorasaňyz, JVM obýektler ýüklenende we işe girizilende, tablisalary ýatda saklaýar we üýtgeýjileri bahalary bilen, obýektleri bolsa usullary bilen baglanyşdyrýar diýip jogap berip bilersiňiz. Mundan başga-da, bir obýekt miras galan ýa-da interfeýsi amala aşyrýan bolsa, ilki bilen öz synpynda artykmaç usullaryň barlygy barlanýar. Eger bar bolsa, bu görnüş bilen baglanyşdyrylýar, ýok bolsa, köp derejeli iýerarhiýada kök derejesine çenli bir synpda (ene-atada) we ş.m. kesgitlenen usul gözlenýär. OOP-da polimorfizm we onuň programma kodunda ýerine ýetirilişi barada aýdanymyzda, abstrakt synplary we interfeýsleri ulanyp, esasy synplary kesgitlemek üçin abstrakt beýany ulanmagyň gowy tejribe bolandygyny belläris. Bu tejribe abstraksiýany ulanmaga esaslanýar - umumy özüni alyp barşy we häsiýetleri izolirlemek we abstrakt synpyň içinde saklamak ýa-da diňe umumy häsiýeti izolirlemek - bu ýagdaýda interfeýs döredýäris. Interfeýslere we synp mirasyna esaslanýan obýektleriň iýerarhiýasyny gurmak we taslamak OOP polimorfizm ýörelgesini ýerine ýetirmek üçin zerur şertdir. Java-da polimorfizm we täzelikler meselesi barada aýdanymyzda, Java 8-den başlap abstrakt synplary we interfeýsleri döredenimizde, açar söz ulanyp esasy synplarda abstrakt usullaryň deslapky ýerine ýetirilişini ýazyp boljakdygyny belläp bileris default. Mysal üçin:
public interface Swim {
    default void swim() {
        System.out.println("Just floating");
    }
}
Käwagt polimorfizm ýörelgesiniň bozulmazlygy üçin esasy synplarda usullary yglan etmegiň talaplary barada sorap bilerler. Bu ýerde hemme zat ýönekeý: bu usullar statiki , şahsy we gutarnykly bolmaly däldir . Hususy usuly diňe synpda elýeterli edýär, ony nesilde ýok edip bolmaz. Statik usuly obýekt däl-de, synpyň emlägine öwürýär, şonuň üçin superklass usuly hemişe atlandyrylar. Final usuly üýtgewsiz we mirasçylaryndan gizlär.

Java-da polimorfizm bize näme berýär?

Polimorfizmiň ulanylmagy bize näme berýär diýen sorag hem ýüze çykar. Bu ýerde haşal otlara gaty çuňňur girmän gysga jogap berip bilersiňiz:
  1. Obýektiň ýerine ýetirilişini çalyşmaga mümkinçilik berýär. Synag şu esaslanýar.
  2. Programmanyň giňelmegini üpjün edýär - geljege esas döretmek has aňsat bolýar. Bar bolanlara esaslanyp täze görnüşleri goşmak, OOP stilinde ýazylan programmalaryň işleýşini giňeltmegiň iň giň ýaýran usulydyr.
  3. Obýektleri umumy görnüş ýa-da özüni alyp barşy bilen bir kolleksiýa ýa-da massiwde birleşdirmäge we olary birmeňzeş dolandyrmaga mümkinçilik berýär (mysallarymyzdaky ýaly, hemmeleri tans etmek - usul danceýa-da ýüzmek - usul swim).
  4. Täze görnüşleri döredeniňizde çeýeligi: bir usuly ene-atadan durmuşa geçirmegi ýa-da çagada ýokaşdyryp bilersiňiz.

Syýahat üçin sözleri bölmek

Polimorfizm ýörelgesi örän möhüm we giň mowzuk. Java-yň OOP- yň ýarysyny we dil esaslarynyň gowy bölegini öz içine alýar. Söhbetdeşlikde bu ýörelgäni kesgitlemek bilen gutulyp bilmersiňiz. Jahyllyk ýa-da düşünmezlik söhbetdeşligiň soňuna çykar. Şonuň üçin bilimiňizi synagdan ozal barlamaga we zerur bolsa täzelemäge ýalta bolmaň.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION