Fie A o clasă, iar B o subclasă a clasei A și fie declarațiile
A a1, a2, a3;
B b1;
Object ob1, ob2, ob3;
Unei variabile referință dintr-o clasă, i se pot atribui ca
valori referințe la instanțe ale subclaselor sale. În
consecință, pot exista instrucțiuni de atribuire de forma
a1=new A(); a2=new B(); b1=new B(); a3=b1;
ob1=new B(); ob2=a1; ob3=b1;
Ultimele două atribuiri sunt posibile deoarece, în limbajul Java, toate
clasele sunt subclase ale clasei Object.
Se pune întrebarea: dacă o metodă din clasa A, fie aceasta metoda1(),
a fost redefinită în clasa B, care din ele va fi executata în expresia a2.metoda1()?
Observăm că, în această expresie, variabila a2 aparține clasei A, în
timp ce obiectul indicat de această variabilă aparține efectiv clasei B.
Conform principiului polimorfismului, va fi executata metoda1()
din clasa B.
Atenție: polimorfismul se aplică numai metodelor de instanță. În cazul câmpurilor statice și metodelor statice, care sunt redeclarate în subclasa, nu are loc o redefinire, ci o ascundere. În consecință, legarea acestora este statică (la compilare), iar la execuție se vor folosi câmpurile și metodele statice din clasa căreia ii aparține variabila-referința, nu din clasa căreia îi aparține instanța indicată de aceasta. |
În atentia programatorilor de C++ În limbajul C++ polimorfismul se manifestă numai pentru metodele virtuale. Metodele care nu au fost declarate cu modificatorul virtual sunt legate static (la compilare), deci la execuție se invocă în astfel de cazuri metoda clasei căreia îi aparține variabila-referința (sau pointerul) și nu cea căreia îi aparține obiectul indicat. Folosind conceptele din C++, se poate considera că în limbajul Java toate metodele de instanță sunt implicit virtuale (sunt legate dinamic), în timp ce metodele statice nu sunt virtuale (sunt legate static). |
Având în vedere că B este subclasă a lui A, iar variabila ob1 indică
efectiv un obiect din clasa B, atât în expresia ((B)ob1).metoda1(),
cât și în expresia ((A)ob1).metoda1() se va invoca metoda1()
din clasa B, adică din clasa căreia îi aparține efectiv obiectul indicat
de variabila-referință ob1.
Exemplu În fișierul Polimorf1.java se da următorul exemplu de aplicație în care se testează polimorfismul, folosind clasa S1 și subclasele ei CD1 și CD2 definite anterior:
La executarea acestei aplicații se obțin pe ecran următoarele
rezultate:
Remarcăm următoarele: |