JavaRush /Java блогу /Random-KY /Полиморфизм жана анын достору
Viacheslav
Деңгээл

Полиморфизм жана анын достору

Группада жарыяланган
Полиморфизм an objectиге багытталган программалоонун негизги принциптеринин бири. Бул сизге Javaнын күчтүү терүү күчүн колдонууга жана колдонууга жарамдуу жана тейлөөгө боло турган codeду жазууга мүмкүндүк берет. Ал жөнүндө көп нерсе айтылды, бирок мен ар бир адам бул кароодон жаңы нерсени алып кете алат деп үмүттөнөм.
Полиморфизм жана анын достору - 1

Киришүү

Java программалоо тor Oracleга таандык экенин баарыбыз билебиз деп ойлойм. Ошондуктан, биздин жол сайттан башталат: www.oracle.com . Башкы бетинде "Меню" бар. Анда "Документтер" бөлүмүндө "Java" бөлүмчөсү бар. Тилдин негизги функцияларына тиешелүү нерселердин баары "Java SE documentтерине" таандык, ошондуктан биз бул бөлүмдү тандайбыз. Документтер бөлүмү эң акыркы version үчүн ачылат, бирок азырынча "Башка чыгарууну издеп жатасызбы?" Келгиле, вариантты тандайлы: JDK8. Баракта биз көптөгөн ар кандай варианттарды көрөбүз. Бирок биз Тилди үйрөнүүгө кызыкдарбыз: " Java Tutorials Learning Paths ". Бул баракта биз дагы бир бөлүмдү табабыз: " Java тorн үйрөнүү ". Бул ыйыктардын эң ыйыкы, Oracleдан Java негиздери боюнча окуу куралы. Java бул an objectиге багытталган программалоо тor (OOP), ошондуктан тилди үйрөнүү жада калса Oracle веб-сайтында " Объектке багытталган программалоо концепцияларынын " негизги түшүнүктөрүн талкуулоо менен башталат. Аталышынан көрүнүп тургандай, Java an objectилер менен иштөөгө багытталган. " Объект деген эмне? " бөлүмчөсүнөн Javaдагы an objectтер абал жана жүрүм-турумдан турганы көрүнүп турат. Биздин банк эсебибиз бар деп элестетиңиз. Эсептеги акчанын суммасы – мамлекет, ал эми бул мамлекет менен иштөө ыкмалары – жүрүм-турум. Объекттерди кандайдыр бир түрдө сыпаттоо керек (алардын абалы жана жүрүм-туруму кандай болушу мүмкүн экенин айтыңыз) жана бул сүрөттөмө класс . Кандайдыр бир класстын an objectисин түзгөндө, биз бул классты белгилейбиз жана бул " an object түрү " деп аталат. Демек, Java тor катуу терилген тил деп айтылат, ал Java тorнин спецификациясында " 4-бөлүм. Типтер, баалуулуктар жана өзгөрмөлөр " бөлүмүндө айтылган. Java тor OOP түшүнүктөрүн ээрчийт жана кеңейтүү ачкыч сөзүн колдонуу менен мурасты колдойт. Эмне үчүн экспансия? Анткени тукум куучулук менен бала класс ата-эне классынын жүрүм-турумун жана абалын мурастайт жана аларды толуктай алат, б.а. базалык класстын функцияларын кеңейтүү. Интерфейс ошондой эле класстын сүрөттөмөсүндө implements ачкыч сөзүн колдонуу менен көрсөтүлүшү мүмкүн. Класс интерфейсти ишке ашырганда, бул класс кандайдыр бир келишимге ылайык келет дегенди билдирет - программисттин класстын белгилүү бир жүрүм-туруму бар чөйрөгө билдирүүсү. Мисалы, оюнчуда ар кандай баскычтар бар. Бул баскычтар оюнчунун жүрүм-турумун көзөмөлдөө үчүн интерфейс болуп саналат жана жүрүм-турум оюнчунун ички абалын өзгөртөт (мисалы, үн). Бул учурда, абал жана жүрүм-турум сүрөттөмө катары класс берет. Эгерде класс интерфейсти ишке ашырса, анда бул класс тарабынан түзүлгөн an object класстын түрү боюнча гана эмес, интерфейс менен да сүрөттөлүшү мүмкүн. Келгиле, бир мисал карап көрөлү:
public class MusicPlayer {

    public static interface Device {
        public void turnOn();
        public void turnOff();
    }

    public static class Mp3Player implements Device {
        public void turnOn() {
            System.out.println("On. Ready for mp3.");
        }
        public void turnOff() {
            System.out.println("Off");
        }
    }

    public static class Mp4Player extends Mp3Player {
        @Override
        public void turnOn() {
            System.out.println("On. Ready for mp3/mp4.");
        }
    }

    public static void main(String []args) throws Exception{
        // Какое-то устройство (Тип = Device)
        Device mp3Player = new Mp3Player();
        mp3Player.turnOn();
        // У нас есть mp4 проигрыватель, но нам от него нужно только mp3
        // Пользуемся им How mp3 проигрывателем (Тип = Mp3Player)
        Mp3Player mp4Player = new Mp4Player();
        mp4Player.turnOn();
    }
}
Түрү - бул абдан маанилүү сүрөттөмө. Бул an object менен кантип иштей турганыбызды айтат, б.а. an objectтен кандай жүрүм-турумду күтөбүз. Жүрүм-турум ыкмалары болуп саналат. Ошондуктан, келгиле, ыкмаларын түшүнүп көрөлү. Oracle веб-сайтында методдордун Oracle үйрөткүчүндө өз бөлүмү бар: " Методдорду аныктоо ". Макаладан алып салуу керек болгон биринчи нерсе: Метод кол тамгасы бул ыкманын аталышы жана параметрлердин түрлөрү :
Полиморфизм жана анын достору - 2
Мисалы, методду public void ыкмасын жарыялоодо(Object o), кол тамга методдун аты жана Объект параметринин түрү болот. Кайтаруу түрү кол коюлган ЭМЕС. Бул маанилүү! Андан кийин, келгиле, баштапкы codeубузду түзөлү. Белгилүү болгондой, бул үчүн code класстын аталышы жана java кеңейтүүсү менен файлда сакталышы керек. Java codeу " javac " компилятору аркылуу Java Virtual Machine (JVM) тарабынан аткарыла турган кээ бир ортоңку форматка түзүлөт . Бул аралык формат byte code деп аталат жана .class кеңейтүүсү бар файлдарда камтылган. Келгиле, компиляциялоо буйругун иштетели: javac MusicPlayer.java Java codeу компиляциялангандан кийин, биз аны аткара алабыз. Баштоо үчүн " java " утorтасын колдонуп, класс файлында берилген byte codeду аткаруу үчүн Java виртуалдык машина процесси ишке киргизилет. Колдонмону ишке киргизүү үчүн буйрукту иштетели: java MusicPlayer. Экранда println методунун киргизүү параметринде көрсөтүлгөн текстти көрөбүз. Кызыктуусу, byte-code .class кеңейтүүсү менен файлда болгондуктан, биз аны " javap " утorтасынын жардамы менен көрө алабыз. <ocde>javap -c MusicPlayer буйругун иштетели:
Полиморфизм жана анын достору - 3
Байтcodeдон биз класс көрсөтүлгөн an object аркылуу методду чакыруу аркылуу жүргүзүлөрүн көрөбүз invokevirtualжана компилятор кайсы метод кол тамгасын колдонуу керектигин эсептеп чыккан. Неге invokevirtual? Анткени виртуалдык методдун чакыруусу (invoke чакыруу деп которулат) бар. Виртуалдык ыкма деген эмне? Бул программаны аткаруу учурунда денеси жокко чыгарыла турган ыкма. Жөн эле сизде белгилүү бир ачкыч (ыкма кол тамгасы) менен методдун корпусунун (codeу) ортосундагы кат алышуунун тизмеси бар экенин элестетиңиз. Жана методдун ачкычы менен корпусунун ортосундагы бул кат алышуу программаны аткаруу учурунда өзгөрүшү мүмкүн. Ошондуктан ыкма виртуалдык болуп саналат. Демейки боюнча, Javaда статикалык ЭМЕС, акыркы ЭМЕС жана жеке ЭМЕС методдор виртуалдык болуп саналат. Мунун аркасында Java полиморфизмдин an objectиге багытталган программалоо принцибин колдойт. Сиз буга чейин эле түшүнгөн болушу мүмкүн, бул биздин карап чыгуу жөнүндө бүгүн.

Полиморфизм

Oracle веб-сайтында алардын расмий окуу куралында өзүнчө бөлүм бар: " Полиморфизм ". Келгиле, Java онлайн компиляторун колдонуп , Java тorнде полиморфизм кантип иштээрин көрөлү. Мисалы, бизде Java тorндеги санды билдирген абстракттуу класс саны бар. Ал эмнеге жол берет? Ал бардык мураскорлор ээ боло турган кээ бир негизги ыкмалары бар. Сандан мурас алган адам түзмө-түз: "Мен санмын, сен мени менен сан катары иштей аласың" дейт. Мисалы, ар кандай мураскор үчүн анын Integer маанисин алуу үчүн intValue() ыкмасын колдонсоңуз болот. Эгерде сиз Number үчүн java api карасаңыз, метод абстракттуу экенин көрө аласыз, башкача айтканда, Сандын ар бир мураскери бул ыкманы өзү ишке ашырышы керек. Бирок бул бизге эмне берет? Келгиле, бир мисал карап көрөлү:
public class HelloWorld {

    public static int summ(Number first, Number second) {
        return first.intValue() + second.intValue();
    }

    public static void main(String []args){
        System.out.println(summ(1, 2));
        System.out.println(summ(1L, 4L));
        System.out.println(summ(1L, 5));
        System.out.println(summ(1.0, 3));
    }
}
Мисалдан көрүнүп тургандай, полиморфизмдин аркасында биз Сандын тукуму боло турган ар кандай типтеги аргументтерди киргизүү катары кабыл ала турган ыкманы жаза алабыз (санды ала албайбыз, анткени ал абстракттуу класс). Оюнчу мисалында болгондой, бул учурда биз Number сыяктуу бир нерсе менен иштегибиз келет деп жатабыз. Сан болгон ар бир адам анын бүтүн санын бере алышы керек экенин билебиз. Ал эми бул бизге жетиштүү. Биз конкреттүү an objectти ишке ашыруунун майда-чүйдөсүнө чейин кирүүнү каалабайбыз жана бул an object менен Сандын бардык урпактары үчүн жалпы ыкмалар аркылуу иштөөнү каалайбыз. Бизге жеткorктүү болгон ыкмалардын тизмеси компиляция учурунда түрү боюнча аныкталат (byteеcodeдо мурун көргөндөй). Бул учурда биздин түрү Сан болот. Мисалдан көрүнүп тургандай, биз ар кандай типтеги ар кандай сандарды өткөрүп жатабыз, башкача айтканда, сумма ыкмасы Integer, Long жана Double киргизүү катары кабыл алат. Бирок алардын бардыгына окшош нерсе, алар абстракттуу Сандын тукумдары, ошондуктан intValue методунда алардын жүрүм-турумун жокко чыгарышат, анткени ар бир конкреттүү түр бул типти бүтүн санга кантип чыгарууну билет. Мындай полиморфизм англисче Overriding деп аталган overriding аркылуу ишке ашырылат.
Полиморфизм жана анын достору - 4
Ашыкча же динамикалык полиморфизм. Ошентип, HelloWorld.java файлын төмөнкү мазмун менен сактоо менен баштайлы:
public class HelloWorld {
    public static class Parent {
        public void method() {
            System.out.println("Parent");
        }
    }
    public static class Child extends Parent {
        public void method() {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();
        parent.method();
        child.method();
    }
}
кылалы javac HelloWorld.javaжана javap -c HelloWorld:
Полиморфизм жана анын достору - 5
Көрүнүп тургандай, чалуу ыкмасы бар саптар үчүн byte-codeдо, чакыруу ыкмасына бирдей шилтеме көрсөтүлгөн invokevirtual (#6). Келгиле java HelloWorld. Көрүнүп тургандай, ата-эне жана бала өзгөрмөлөрү Ата-эне түрү менен жарыяланат, бирок ишке ашыруунун өзү өзгөрмөгө кайсы an object ыйгарылганына жараша (б.а. an objectтин кандай түрү) чакырылат. Программанын аткарылышынын жүрүшүндө (иштөө убактысында да айтышат), JVM an objectке жараша, бир эле кол тамганы колдонуу менен методдорду чакырганда, ар кандай ыкмаларды аткарган. Башкача айтканда, тиешелүү колдун ачкычын колдонуп, биз адегенде бир методдун корпусун алдык, андан кийин башкасын алдык. Өзгөрмөдө кандай an object бар экенине жараша. Программанын аткарылышынын учурундагы бул аныктоо ыкмасын чакыра тургандыгы кеч байланыш же динамикалык байланыш деп аталат. Башкача айтканда, кол тамга менен методдун корпусунун ортосундагы дал келүү, метод чакырылган an objectке жараша динамикалык түрдө аткарылат. Албетте, сиз класстын статикалык мүчөлөрүн (Класс мүчөсү), ошондой эле жеке же акыркы кирүү түрү бар класс мүчөлөрүн жокко чыгара албайсыз. @Override annotationлары да иштеп чыгуучуларга жардам берет. Бул компиляторго ушул учурда биз ата-баба ыкмасынын жүрүм-турумун жокко чыгара турганыбызды түшүнүүгө жардам берет. Эгерде биз метод кол тамгасында ката кетирген болсок, компилятор бул тууралуу бизге дароо айтып берет. Мисалы:
public static class Parent {
        public void method() {
            System.out.println("parent");
        }
}
public static class Child extends Parent {
        @Override
        public void method(String text) {
            System.out.println("child");
        }
}
Ката менен компиляцияланbyte: ката: метод супертиптен методду жокко чыгарbyte же ишке ашырbyte
Полиморфизм жана анын достору - 6
Кайра аныктоо “ ковариация ” түшүнүгү менен да байланыштуу . Келгиле, бир мисал карап көрөлү:
public class HelloWorld {
    public static class Parent {
        public Number method() {
            return 1;
        }
    }
    public static class Child extends Parent {
        @Override
        public Integer method() {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(new Child().method());
    }
}
Көрүнүп турган абструкцияга карабастан, мааниси үстөмдүк кылууда ата-бабада көрсөтүлгөн типти гана эмес, конкреттүү бир типти да кайтара ала тургандыгыбыздан келип чыгат. Мисалы, ата-баба Санды кайтарды, биз Integer - Сандын тукумун кайтара алабыз. Ошол эле ыкманын ыргытууларында жарыяланган өзгөчөлүктөргө да тиешелүү. Мурасчылар ыкманы жокко чыгарып, ыргытылган өзгөчөлүктү тактай алышат. Бирок алар кеңейе алbyte. Башкача айтканда, эгер ата-эне IOException ыргытса, анда биз такыраак EOFException ыргыта алабыз, бирок биз Exception ыргыта албайбыз. Ошо сыяктуу эле, сиз чөйрөнү кыскарта албайсыз жана кошумча чектөөлөрдү киргизе албайсыз. Мисалы, сиз статикти кошо албайсыз.
Полиморфизм жана анын достору - 7

Жашыруу

“ Жашыруун ” деген да бар . Мисал:
public class HelloWorld {
    public static class Parent {
        public static void method() {
            System.out.println("Parent");
        }
    }
    public static class Child extends Parent {
        public static void method() {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();
        parent.method();
        child.method();
    }
}
Эгер бул жөнүндө ойлонуп көрсөк, бул абдан ачык нерсе. Класстын статикалык мүчөлөрү класска таандык, б.а. өзгөрмөнүн түрүнө. Демек, эгер бала Ата-эне тибинде болсо, анда ыкма балага эмес, Ата-энеге чакырылат. Мурункудай byte codeду карасак, статикалык ыкма invokestatic аркылуу чакырылганын көрөбүз. Бул JVMге invokevirtual же invokeinterface сыяктуу ыкма үстөлүнө эмес, түрүн карашы керектигин түшүндүрөт.
Полиморфизм жана анын достору - 8

Ашыкча жүктөө ыкмалары

Java Oracle окуу куралында дагы эмнени көрөбүз? Мурда изилденген бөлүмдө " Методдорду аныктоо " ашыкча жүктөө жөнүндө бир нерсе бар. Бул эмне? Орус тorнде бул "метод перегрузка" деп аталат жана мындай ыкмалар "ашкере жүктөө" деп аталат. Ошентип, ыкманы ашыкча жүктөө. Бир караганда, баары жөнөкөй. Келгиле, онлайн Java компиляторун ачалы, мисалы tutorialspoint online java компилятору .
public class HelloWorld {

	public static void main(String []args){
		HelloWorld hw = new HelloWorld();
		hw.say(1);
		hw.say("1");
	}

	public static void say(Integer number) {
		System.out.println("Integer " + number);
	}
	public static void say(String number) {
		System.out.println("String " + number);
	}
}
Демек, бул жерде баары жөнөкөй көрүнөт. Oracle окуу куралында айтылгандай, ашыкча жүктөлгөн методдор (бул учурда айта турган ыкма) методго берилген аргументтердин саны жана түрү боюнча айырмаланат. Сиз бир эле аталышты жана бирдей сандагы аргументтердин бирдей түрлөрүн жарыялай албайсыз, анткени компилятор аларды бири-биринен айырмалай алbyte. Бул дароо абдан маанилүү нерсени белгилей кетүү керек:
Полиморфизм жана анын достору - 9
Башкача айтканда, ашыкча жүктөөдө, компилятор тууралыгын текшерет. Бул маанилүү. Бирок компилятор белгилүү бир ыкманы чакыруу керектигин кантип аныктайт? Ал Java тorнин спецификациясында сүрөттөлгөн "Эң конкреттүү ыкма" эрежесин колдонот: " 15.12.2.5. Эң өзгөчө ыкманы тандоо ". Анын кантип иштээрин көрсөтүү үчүн, келгиле, Oracle Certified Professional Java программистинен мисал алалы:
public class Overload{
  public void method(Object o) {
    System.out.println("Object");
  }
  public void method(java.io.FileNotFoundException f) {
    System.out.println("FileNotFoundException");
  }
  public void method(java.io.IOException i) {
    System.out.println("IOException");
  }
  public static void main(String args[]) {
    Overload test = new Overload();
    test.method(null);
  }
}
Бул жерден мисал алалы: https://github.com/stokito/OCPJP/blob/master/src/ru/habrahabr/blogs/java/OCPJP1/question1/Overload.j... Көрүп тургандай, биз өтүп баратабыз. методго нөл. Компилятор эң белгилүү түрүн аныктоого аракет кылат. Объект ылайыктуу эмес, анткени бардык нерсе андан мураска калган. Уланта бер. Өзгөчөлүктөрдүн 2 классы бар. Келгиле, java.io.IOException дарегин карап көрөлү жана "Түздөн-түз белгилүү субкласстарда" FileNotFoundException бар экенин көрөлү. Башкача айтканда, FileNotFoundException эң өзгөчө түрү экени белгилүү болду. Демек, натыйжа "FileNotFoundException" сабынын чыгышы болот. Бирок, эгерде биз IOException менен EOFException алмаштырсак, анда бизде тип дарагында иерархиянын бирдей деңгээлинде эки метод бар экени, башкача айтканда, экөө үчүн тең IOException ата-эне болуп саналат. Компилятор кайсы ыкманы чакырууну тандай алbyte жана компиляция катасын ыргытат: reference to method is ambiguous. Дагы бир мисал:
public class Overload{
    public static void method(int... array) {
        System.out.println("1");
    }

    public static void main(String args[]) {
        method(1, 2);
    }
}
Ал 1 чыгарат. Бул жерде эч кандай суроолор жок. int... түрү vararg https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html жана чындыгында "синтаксистик кант" дегенден башка эч нерсе эмес жана чындыгында int. .. массив int[] массиви катары окулат. Эгерде биз азыр бир ыкманы кошсок:
public static void method(long a, long b) {
	System.out.println("2");
}
Ошондо ал 1 эмес, 2ди көрсөтөт, анткени биз 2 санды өткөрүп жатабыз жана 2 аргумент бир массивге караганда жакшыраак дал келет. Эгерде биз бир ыкманы кошсок:
public static void method(Integer a, Integer b) {
	System.out.println("3");
}
Анда биз дагы эле 2ни көрөбүз. Анткени бул учурда примитивдер Integerдеги бокска караганда так дал келет. Бирок, биз аткарсак, анда method(new Integer(1), new Integer(2));ал басып чыгарат 3. Javaдагы конструкторлор методдорго окшош жана алар кол тамга алуу үчүн да колдонулушу мүмкүн болгондуктан, аларга ашыкча жүктөлгөн ыкмалар сыяктуу эле "ашыкча жүктөө токтому" эрежелери колдонулат. Java тorнин спецификациясы " 8.8.8. Конструктордун ашыкча жүктөлүшү " ушунда айтылат . Методдун ашыкча жүктөлүшү = Эрте туташтыруу (ака Static Binding) Сиз статикалык байланыш же динамикалык байланыш катары да белгилүү болгон эрте жана кеч байланышты көп уга аласыз. Алардын ортосундагы айырма абдан жөнөкөй. Эрте - компиляция, кеч - программа аткарылган учур. Демек, эрте байлоо (статикалык байланыш) - бул компиляция учурунда кимге кандай ыкма чакырыларын аныктоо. Ооба, кеч байланыш (динамикалык байланыш) - бул программаны аткаруу учурунда түздөн-түз кайсы ыкманы чакырууну аныктоо. Мурда көргөндөй (IOExceptionди EOFException деп өзгөрткөндө), эгерде компилятор кайсы жерде чалууну жасоону түшүнбөшү үчүн методдорду ашыкча жүктөгөн болсок, анда компиляция убактысынын катасын алабыз: методго шилтеме түшүнүксүз. Англис тorнен которгондо эки анжы деген сөз түшүнүксүз же белгисиз, так эмес дегенди билдирет. Көрсө, ашыкча жүктөө эрте милдеттүү, анткени текшерүү компиляция убагында жүргүзүлөт. Корутундубузду ырастоо үчүн, келгиле, " 8.4.9. Ашыкча жүктөө " бөлүмүндөгү Java тorнин спецификациясын ачалы :
Полиморфизм жана анын достору - 10
Көрсө, компиляция учурунда аргументтердин түрлөрү жана саны жөнүндө маалымат (ал компиляция учурунда бар) методдун кол тамгасын аныктоо үчүн колдонулат. Эгерде метод an objectтин методдорунун бири болсо (б.а., инстанция ыкмасы), иш жүзүндөгү ыкма чалуу динамикалык ыкманы издөө (б.а. динамикалык байланыштыруу) аркылуу аткаруу убагында аныкталат. Түшүнүктүү болушу үчүн, мурда талкууланганга окшош бир мисалды алалы:
public class HelloWorld {
    public void method(int intNumber) {
        System.out.println("intNumber");
    }
    public void method(Integer intNumber) {
        System.out.println("Integer");
    }
    public void method(String intNumber) {
        System.out.println("Number is: " + intNumber);
    }

    public static void main(String args[]) {
        HelloWorld test = new HelloWorld();
        test.method(2);
    }
}
Келгиле, бул codeду HelloWorld.java файлына сактайлы жана аны колдонуу менен компиляция кылалы. javac HelloWorld.java Эми компиляторубуз byte codeго эмне жазганын карап көрөлү: javap -verbose HelloWorld.
Полиморфизм жана анын достору - 11
Айтылгандай, компилятор келечекте кандайдыр бир виртуалдык ыкма чакырыла турганын аныктады. Башкача айтканда, методдун денеси иштөө убагында аныкталат. Бирок компиляция учурунда үч ыкманын ичинен компилятор эң ылайыктуусун тандап алган, ошондуктан ал санды көрсөткөн:"invokevirtual #13"
Полиморфизм жана анын достору - 12
Бул кандай методреф? Бул ыкманын шилтемеси. Болжол менен айтканда, бул иш убагында Java виртуалдык машинасы аткаруу үчүн кайсы ыкманы издөө керектигин аныктай турган кандайдыр бир ишарат. Көбүрөөк маалыматты супер макаладан тапса болот: " JVM ички ашыкча жүктөө жана жокко чыгаруу ыкмасын кантип чечет ".

Жыйынтык чыгаруу

Ошентип, биз Java an objectиге багытталган тил катары полиморфизмди колдой турганын билдик. Полиморфизм статикалык (Статикалык Байланыш) же динамикалык (Динамикалык Байланыш) болушу мүмкүн. Статикалык полиморфизм менен, ошондой эле эрте байланыш катары белгилүү болгон, компилятор кайсы ыкманы жана кайда чакырылышы керектигин аныктайт. Бул ашыкча жүктөө сыяктуу механизмди колдонууга мүмкүндүк берет. Динамикалык полиморфизмде, методдун мурда эсептелген кол тамгасынын негизинде, кеч байланыш деп да белгилүү, метод кайсы an object колдонулганына (б.а., кайсы an objectтин ыкмасы деп аталат) негизинде иштөө убагында эсептелет. Бул механизмдер кантип иштээрин byte code аркылуу көрүүгө болот. Ашыкча жүктөө методдун кол тамгаларын карайт жана ашыкча жүктөөнү чечүүдө эң конкреттүү (эң так) вариант тандалат. Кайсы ыкмалар бар экенин аныктоо үчүн түрдү карап чыгуу жана методдордун өзү an objectинин негизинде деп аталат. Ошондой эле тема боюнча материалдар: #Вячеслав
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION