JavaRush /Блоги Java /Random-TG /Полиморфизм ва дӯстони он
Viacheslav
Сатҳи

Полиморфизм ва дӯстони он

Дар гурӯҳ нашр шудааст
Полиморфизм яке аз принсипҳои асосии барномасозии ба an object нигаронидашуда мебошад. Он ба шумо имкон медиҳад, ки қудрати чопкунии пурқуввати Java-ро истифода баред ва рамзи қобor истифода ва нигоҳдорӣ нависед. Дар бораи ӯ бисёр гуфта шудааст, аммо ман умедворам, ки ҳама метавонанд аз ин баррасӣ чизи наве гиранд.
Полиморфизм ва дӯстони он - 1

Муқаддима

Ман фикр мекунам, ки ҳамаи мо медонем, ки забони барномасозии Java ба Oracle тааллуқ дорад. Аз ин рӯ, роҳи мо аз сайт оғоз мешавад: www.oracle.com . Дар саҳифаи асосӣ "Меню" мавҷуд аст. Дар он, дар бахши "Ҳуҷҷатҳо" зербахши "Java" мавҷуд аст. Ҳама чизе, ки ба вазифаҳои асосии забон марбут аст, ба "ҳуҷҷатҳои Java SE" тааллуқ дорад, аз ин рӯ мо ин бахшро интихоб мекунем. Бахши ҳуҷҷатгузорӣ барои versionи охирин кушода мешавад, аммо ҳоло "Дар ҷустуҷӯи нашри дигар?" Биёед вариантро интихоб кунем: JDK8. Дар саҳифа мо бисёр вариантҳои гуногунро мебинем. Аммо мо ба Омӯзиши забон таваҷҷӯҳ дорем: " Роҳҳои омӯзиши Java Tutorials ". Дар ин саҳифа мо бахши дигареро пайдо мекунем: " Омӯзиши забони Java ". Ин муқаддастарин муқаддас аст, як дастур оид ба асосҳои Java аз Oracle. Java забони барномасозии ба an object нигаронидашуда (OOP) аст, аз ин рӯ омӯзиши забон ҳатто дар вебсайти Oracle бо муҳокимаи мафҳумҳои асосии " Мафҳумҳои барномасозии ба an object нигаронидашуда " оғоз мешавад. Аз худи ном маълум мешавад, ки Java ба кор бо an objectҳо нигаронида шудааст. Аз зербахши " Объект чист? " маълум мешавад, ки an objectҳо дар Java аз ҳолат ва рафтор иборатанд. Тасаввур кунед, ки мо суратҳисоби бонкӣ дорем. Маблағи пули дар суратҳисоб буда давлат аст ва усулҳои кор бо ин давлат рафтор аст. Объектҳо бояд ба гунае тасвир карда шаванд (гӯед, ки онҳо чӣ гуна ҳолат ва рафтор доранд) ва ин тавсиф синф аст . Вақте ки мо an objectи ягон синфро эҷод мекунем, мо ин синфро муайян мекунем ва онро " навъи an object " меноманд. Аз ин рӯ гуфта мешавад, ки Java забони сахт чопшуда аст, тавре ки дар тавсифи забони Java дар бахши " Боби 4. Намудҳо, арзишҳо ва тағирёбандаҳо " гуфта шудааст. Забони Java консепсияҳои OOP-ро пайравӣ мекунад ва меросро бо истифода аз калимаи калидии extensions дастгирӣ мекунад. Чаро васеъшавӣ? Зеро бо мерос синфи кӯдак рафтор ва ҳолати синфи волидайнро мерос мегирад ва метавонад онҳоро пурра кунад, яъне. васеъ намудани фаъолияти синфи базавӣ. Интерфейсро инчунин дар тавсифи синф бо истифода аз калимаи калидии implements муайян кардан мумкин аст. Вақте ки синф интерфейсро амалӣ мекунад, ин маънои онро дорад, ки синф ба ягон шартнома мувофиқат мекунад - эъломияи барномасоз ба муҳити боқимонда, ки синф дорои рафтори муайян аст. Масалан, плеер дорои тугмаҳои гуногун аст. Ин тугмаҳо интерфейси идоракунии рафтори плеер мебошанд ва рафтор ҳолати дохorи плеерро тағир медиҳад (масалан, садо). Дар ин ҳолат, ҳолат ва рафтор ҳамчун тавсиф синф медиҳад. Агар синф интерфейсро амалӣ созад, он гоҳ 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), имзо номи усул ва намуди параметри Object хоҳад буд. Навъи бозгашт ба имзо дохил карда нашудааст. Муҳим аст! Баъд, биёед рамзи сарчашмаи худро тартиб диҳем. Тавре ки мо медонем, барои ин code бояд дар файл бо номи синф ва васеъшавии java захира карда шавад. Рамзи Java бо истифода аз компилятори " javac " ба ягон формати фосилавӣ, ки метавонад аз ҷониби Java Virtual Machine (JVM) иҷро карда шавад, тартиб дода мешавад. Ин формати фосилавӣ bytecode номида мешавад ва дар файлҳои дорои тамдиди .class мавҷуд аст. Биёед фармони компиляцияро иҷро кунем: javac MusicPlayer.java Пас аз тартиб додани codeи java, мо метавонем онро иҷро кунем. Бо истифода аз утorтаи " java " барои оғоз кардан, раванди мошини виртуалии java барои иҷро кардани bytecodeи дар файли синф интиқолшуда оғоз мешавад. Биёед фармонро барои оғози барнома иҷро кунем: java MusicPlayer. Мо дар экран матни дар параметри вуруди усули println зикршударо мебинем. Ҷолиб он аст, ки byte-code дар файл бо тамдиди .class, мо метавонем онро бо истифода аз утorтаи " javap " бубинем. Биёед фармони <ocde>javap -c MusicPlayer-ро иҷро кунем:
Полиморфизм ва дӯстони он - 3
Аз byte-code мо мебинем, ки даъвати метод тавассути an objectе, ки навъи он синф муайян шудааст invokevirtual, бо истифода аз - анҷом дода мешавад ва компилятор ҳисоб кардааст, ки кадом имзои метод бояд истифода шавад. Чаро invokevirtual? Зеро як усули виртуалӣ занг (даъват кардан ҳамчун занг тарҷума мешавад) вуҷуд дорад. Усули виртуалӣ чист? Ин усулест, ки ҷисми онро ҳангоми иҷрои барнома бекор кардан мумкин аст. Тасаввур кунед, ки шумо рӯйхати мукотиба байни калиди муайян (имзои усул) ва бадан (code)-и метод доред. Ва ин мукотибаи байни калид ва корпуси метод метавонад хангоми ичрои программа тагйир ёбад. Аз ин рӯ, усул виртуалӣ аст. Бо нобаёнӣ, дар Java усулҳое, ки статикӣ НЕСТ, НИҲО НЕСТ ва НЕ хусусӣ ҳастанд, виртуалӣ мебошанд. Ба шарофати ин, Java принсипи барномасозии ба an object нигаронидашудаи полиморфизмро дастгирӣ мекунад. Тавре ки шумо аллакай фаҳмидед, ин баррасии имрӯзаи мост.

Полиморфизм

Дар вебсайти Oracle дар дастури расмии онҳо бахши алоҳида мавҷуд аст: " Полиморфизм ". Биёед аз Java Online Compiler истифода барем , то бубинем, ки полиморфизм дар Java чӣ гуна кор мекунад. Масалан, мо рақами синфи абстрактӣ дорем , ки рақамро дар Java ифода мекунад. Он чӣ иҷозат медиҳад? Вай якчанд усулҳои асосӣ дорад, ки ҳамаи ворисон хоҳанд дошт. Ҳар касе, ки аз Рақам мерос гирифтааст, айнан мегӯяд: "Ман рақам ҳастам, шумо метавонед бо ман ҳамчун рақам кор кунед." Масалан, барои ҳар як вориси шумо метавонед усули intValue()-ро истифода баред, то ки арзиши бутуни онро ба даст оред. Агар шумо ба java api барои Number назар кунед, шумо мебинед, ки усул абстрактӣ аст, яъне ҳар як вориси Рақам бояд худи ин усулро амалӣ кунад. Аммо ин ба мо чӣ медиҳад? Биёед як мисолро дида бароем:
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 хоҳад буд (мо Number гирифта наметавонем, зеро он синфи абстрактист). Тавре ки дар мисоли плеер буд, дар ин ҳолат мо мегӯем, ки мо мехоҳем бо чизе кор кунем, ба монанди Number. Мо медонем, ки ҳар касе, ки Рақам аст, бояд арзиши бутуни онро таъмин кунад. Ва ин барои мо басанда аст. Мо намехоҳем ба тафсилоти амалисозии an objectи мушаххас ворид шавем ва мехоҳем бо ин an object тавассути усулҳои барои ҳамаи наслҳои Number умумӣ кор кунем. Рӯйхати усулҳое, ки барои мо дастрас хоҳанд буд, аз рӯи намуд дар вақти тартибдиҳӣ муайян карда мешавад (чунон ки мо қаблан дар byte code дида будем). Дар ин ҳолат навъи мо Рақам хоҳад буд. Тавре ки шумо аз мисол мебинед, мо рақамҳои гуногуни намудҳои гуногунро мегузарем, яъне усули ҷамъкунӣ ҳамчун вуруди Integer, Long ва Double қабул мешавад. Аммо он чизе, ки ҳамаи онҳо як чизи умумӣ доранд, ин аст, ки онҳо насли рақами абстрактӣ мебошанд ва аз ин рӯ рафтори онҳоро дар усули intValue бекор мекунанд, зеро ҳар як намуди мушаххас медонад, ки чӣ тавр ин навъи онро ба Integer интиқол диҳад. Чунин полиморфизм тавассути ба истилоҳ 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
Тавре ки шумо мебинед, дар bytecodeи сатрҳо бо усули занг, ҳамон истинод ба усули занг нишон дода шудааст invokevirtual (#6). Биёед, инро кунем java HelloWorld. Тавре ки мо мебинем, тағирёбандаҳои волидайн ва кӯдак бо навъи Parent эълон карда мешаванд, аммо худи амалисозӣ мувофиқи он, ки кадом an object ба тағирёбанда таъин шудааст (яъне кадом намуди an object) даъват карда мешавад. Ҳангоми иҷрои барнома (онҳо дар вақти корӣ низ мегӯянд), JVM вобаста ба an object, ҳангоми даъват кардани усулҳо бо як имзо усулҳои гуногунро иҷро мекард. Яъне, бо истифода аз калиди имзои мувофиқ, мо аввал як ҷузъи методро гирифтем ва баъд дигарро гирифтем. Вобаста ба кадом an object дар тағирёбанда. Ин муайянкунӣ дар вақти иҷрои барнома, ки усули он номида мешавад, инчунин ҳатмии дер ё динамикӣ номида мешавад. Ин аст, ки мувофиқати байни имзо ва ҷисми метод вобаста ба an objectе, ки метод даъват карда мешавад, динамикӣ иҷро карда мешавад. Табиист, ки шумо наметавонед аъзои статикии синфро (аъзои синф), инчунин аъзоёни синфро бо навъи дастрасии хусусӣ ё ниҳоӣ бекор кунед. Эзоҳҳои @Override инчунин ба кӯмаки таҳиягарон меоянд. Он ба компилятор кӯмак мекунад, ки дарк кунад, ки дар ин лаҳза мо рафтори усули аҷдодиро бекор мекунем. Агар мо дар имзои метод хато карда бошем, компилятор фавран дар ин бора ба мо хабар медиҳад. Барои намуна:
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");
        }
}
Бо хатогӣ тартиб намедиҳад: хатогӣ: усул усулро аз супертипҳо бекор намекунад ё амалӣ намекунад
Полиморфизм ва дӯстони он - 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 - насли Рақамро баргардонем. Ҳамин чиз ба истисноҳои дар партовҳои метод эълоншуда дахл дорад. Ворисҳо метавонанд усулро бекор кунанд ва истиснои партофташударо такмил диҳанд. Аммо онхо васеъ карда наметавонанд. Яъне, агар волидайн як IOException партофт, мо метавонем дақиқтар EOFException партоем, аммо мо наметавонем Истисноро партояд. Ба ҳамин монанд, шумо наметавонед миқёсро танг кунед ва шумо наметавонед маҳдудиятҳои иловагӣ ҷорӣ кунед. Масалан, шумо наметавонед статикиро илова кунед.
Полиморфизм ва дӯстони он - 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 боз чиро мебинем? Дар бахши қаблан омӯхташуда " Муайян кардани усулҳо " чизе дар бораи изофаборкунӣ мавҷуд аст. Ин чист? Дар забони русӣ ин «метод изображение» аст ва чунин усулҳоро «борборӣ» меноманд. Ҳамин тавр, аз ҳад зиёди усул. Дар назари аввал, ҳама чиз оддӣ аст. Биёед як компилятори онлайни Java кушоем, масалан tutorialspoint online java compiler .
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 гуфта шудааст, усулҳои изофабор (дар ин ҳолат усули гуфтан) аз рӯи миқдор ва намуди далелҳои ба метод интиқолшуда фарқ мекунанд. Шумо наметавонед як ном ва шумораи якхелаи аргументҳоро эълон кунед, зеро мураттиб онхоро аз хамдигар фарк карда наметавонад. Дарҳол як чизи хеле муҳимро қайд кардан лозим аст:
Полиморфизм ва дӯстони он - 9
Яъне, ҳангоми аз ҳад зиёд бор кардан, компилятор дурустии онро тафтиш мекунад. Муҳим аст. Аммо чӣ тавр компилятор воқеан муайян мекунад, ки усули муайянро даъват кардан лозим аст? Он қоидаи "Усули мушаххасеро" истифода мебарад, ки дар тавсифи забони Java тавсиф шудааст: " 15.12.2.5. Интихоби усули мушаххастарин ". Барои нишон додани он, ки он чӣ гуна кор мекунад, биёед аз Oracle Certified Professional Java Programmer мисол гирем:
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 волидайн аст. Компилятор наметавонад интихоб кунад, ки кадом усулро даъват кунад ва хатои компилятсионӣ содир мекунад: 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 [] хондан мумкин аст. Агар мо ҳоло як усул илова кунем:
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 ба мо дар " 8.8.8. Боркунии изофӣ аз конструктор " мегӯяд. Усули изофабори = Пайвасткунии барвақт (бо номи ҳатмии статикӣ) Шумо аксар вақт дар бораи ҳатмии барвақт ва дер шунида метавонед, ки ҳамчун ҳатмии статикӣ ё динамикӣ низ маълум аст. Фарқи байни онҳо хеле оддӣ аст. Барвақт тартиб додан аст, дер лаҳзаи иҷро шудани барнома. Аз ин рӯ, ҳатмии барвақтӣ (ҳатмии статикӣ) муайян кардани он аст, ки кадом усул дар вақти тартибдиҳӣ ба кӣ даъват карда мешавад. Хуб, ҳатмии дер (ҳатмии динамикӣ) ин муайян кардани он аст, ки кадом усул мустақиман ҳангоми иҷрои барнома даъват карда мешавад. Тавре ки мо қаблан дидем (вақте ки мо IOException-ро ба EOFException иваз кардем), агар мо усулҳоро аз ҳад зиёд бор кунем, то компилятор дарк накунад, ки кадом зангро дар куҷо анҷом диҳад, мо хатои вақти компилятсионӣ мегирем: истинод ба усул дучандон аст. Калимаи номуайян, ки аз инглисӣ тарҷума шудааст, маънои норавшан ё номуайян, номуайян аст. Маълум мешавад, ки изофаборӣ барвақт аст, зеро тафтиш дар вацти тартиб додан ба чо оварда мешавад. Барои тасдиқи хулосаҳои худ, биёед Мушаххасоти забони Java-ро дар боби " 8.4.9. Аз ҳад зиёд боркунӣ " кушоем:
Полиморфизм ва дӯстони он - 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 усули изофаборкунӣ ва изофакунии дохorро идора мекунад ".

Ҷамъбаст кардан

Ҳамин тавр, мо фаҳмидем, ки Java ҳамчун забони ба an object нигаронидашуда полиморфизмро дастгирӣ мекунад. Полиморфизм метавонад статикӣ (ҳатмии статикӣ) ё динамикӣ (ҳатмии динамикӣ) бошад. Бо полиморфизми статикӣ, ки ҳамчун ҳатмии барвақт маълум аст, компилятор муайян мекунад, ки кадом усул бояд ва дар куҷо даъват карда шавад. Ин имкон медиҳад, ки механизме, ба монанди изофабор истифода шавад. Бо полиморфизми динамикӣ, ки бо номи дер ҳатмӣ низ маълум аст, дар асоси имзои қаблан ҳисобшудаи усул, метод дар вақти корӣ дар асоси он, ки кадом an object истифода мешавад (яъне кадом усули an object номида мешавад) ҳисоб карда мешавад. Чӣ тавр ин механизмҳо кор мекунанд, бо истифода аз byte code дидан мумкин аст. Сарбории изофӣ ба имзоҳои усул назар мекунад ва ҳангоми ҳалли изофабор варианти мушаххастарин (дақиқтарин) интихоб карда мешавад. Барқароркунӣ ба намуд назар мекунад, то муайян кунад, ки кадом усулҳо мавҷуданд ва худи усулҳо дар асоси an object номида мешаванд. Инчунин маводҳо оид ба мавзӯъ: #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION