Sunteți pe pagina 1din 4

Programarea Orientata Spre Obiecte, Limbajul Java, 2019-2020 CEITI

Tema8. Polimorfism ad-hoc (static). Supraîncărcarea metodelor (overloading). Polimorfism


dinamic. Supradefinirea (suprascrierea, redefinirea) metodelor (overriding).
În ce constă supradefinirea metodelor?
Def. Atunci când o clasă rescrie o metodă a clasei părinte prin implementarea unei metode cu
acelaşi nume şi aceeaşi semnătură cu ce a superclasei are loc suprascrierea metodei.
De exemplu:
public class Vehicol {
void run(){
System.out.println("Vehicolul merge !");
}
}
class Bicicleta extends Vehicol {
void run(){
System.out.println("Bicicleta merge !");
}
}

1. Numai metodele moștenite pot fi supradefinite.


2. Metodele supradefinite trebuie să conţină același nume, aceeaşi listă de parametri şi
acelaşi tip de return altfel nu merge vorba de suprascriere.
3. Metodele de tip final, static şi constructorii nu pot fi supradefiniţi.
4. O metoda supradefinită nu trebuie să conțină un modificator de acces mai restrictiv
decât metoda originală din clasa părinte:
- Dacă metoda originală are modificatorul implicit, metoda supradefinită poate avea unul din
Rețineți !

modificatorii: implicit, protected sau public.


- Dacă metoda originală are modificatorul protected, metoda supradefinită poate avea unul
din modificatorii: protected sau public.
- Dacă metoda originală are modificatorul public, metoda supradefinită poate avea doar
modificatorul public.
5. Faptul că folosim într-o clasă o metodă cu aceeaşi semnătură ca în clasa părinte aplică
principiul moştenirii, iar faptul că în subclasă metoda clasei părinte are o implementare
diferită aplică principiul polimorfismului. Deviza polimorfismului este ,, aceeaşi metodă
implementare diferită’’.
După cum deja cunoașteți, toate clasele sunt subclase ale clasei Object. Clasa Object are metoda
toString() care returnează un obiect de tip String ca conține numele clasei și codul hash al
acesteia. Aveți posibilitatea de a supradefini această metodă pentru a afișa mai multe informații
despre clasa dată.
De exemplu:
class Elev {
private String nume, prenume;
private int virsta;

public Elev(String nume, String prenume, int virsta) {


this.nume = nume;
this.prenume = prenume;
this.virsta = virsta;
}
@Override
public String toString() {
return "Elev nume=" + nume + ", prenume=" + prenume + ", virsta=" + virsta;
}}
opreavictoria86@gmail.com © MUSTEAȚĂ Victoria
1
Programarea Orientata Spre Obiecte, Limbajul Java, 2019-2020 CEITI
public class sConstructor {
public static void main(String[] args) {
Elev e1 = new Elev("Creanga", "Ion",50);
System.out.println(e1);
}
}

În ce constă supraîncărcarea metodelor?


Def. Atunci cînd într-o clasă există metode cu acelaşi nume dar semnătură diferită spunem că
metoda este supraîncărcată. Procesul de crearea a acestui tip de metode se numeşte
supraîncărcare. (Acelaşi nume dar parametri şi posibil tip de return diferit)
Deci, metodele supraîncărcate:
- Trebuie să aibă listă de argumente diferită (număr de argumente și tip diferit)
- Pot avea tip de return diferit
- Pot avea diferiți modificatori de acees
- Pot arunca diferite tipuri de excepții
a) Exemplu de supraîncărcare a constructorului:
class Elev {
private String nume, prenume;
private int virsta;
public Elev() {
}
public Elev(String nume, String prenume) {
this.nume = nume;
this.prenume = prenume;
}
public Elev(String nume, String prenume, int virsta) {
this.nume = nume;
this.prenume = prenume;
this.virsta = virsta;
}

b) Exemplu de supraîncărcare a unei metode din clasa părinte în clasa copil:


class Angajat{
protected String nume, prenume;
protected int nrOre, plataOra;
int salariu() {
return nrOre*plataOra;
}
}
class Manager extends Angajat {
int salariu(int adaos) {
return nrOre*plataOra+adaos;
}
}
c) Exemplu de supraîncărcare a unei metode pentru număr diferit de parametri:
class Operatii{
int suma(int a, int b){
return a+b;
}
int suma(int a, int b, int c){
return a+b+c;
}
opreavictoria86@gmail.com © MUSTEAȚĂ Victoria
2
Programarea Orientata Spre Obiecte, Limbajul Java, 2019-2020 CEITI
int suma(int a, int b, int c, int d){
return a+b+c+d;
}
}
d) Exemplu de supraîncărcare a unei metode pentru parametri cu tip diferit:
class Operatii{
int suma(int a, int b){
return a+b;
}
double suma(double a, double b){
return a+b;
}
double suma(int a, double b, int c){
return a+b+c;
}
}

1. Metodele supraîncărcate apar în aceeaşi clasă sau subclasă, au acelaşi nume dar lista de
parametri diferită.
Reţineţi !

2. Se realizează la etapa compilării programului.


3. Dacă vom supraîncărca metode cu aceeaşi listă de parametri, dar tip de return diferit
vom obţine eroare de compilare, aceasta nu oferă suficientă informaţie compilatorului
pentru a face diferenţă.
4. Metodele statice, private şi finale pot fi supraîncărcate.
Ce este polimorfismul static?
Polimorfismul determinat în timpul compilării unei aplicații este cunoscut ca polimorfism static.
Tehnica metodelor supraîncărcate este un exemplu de astfel de polimorfism. Anume la etapa de
compilare, compilatorul este capabil să facă diferența între diferite contexte și să realizeze
imlementarea corectă fiecărui context de utilizare a metodei.
Am menționat de constructorii supraîncărcați. Anume la faza de compilare compilatorul este în
stare să asocieze obiectului anume acel constructor al clasei ce are același număr de parametri ca
și constructorul apelat pentru obiectul dat. La fel este și în cazul metodelor. În timpul compilării,
compilatorul în dependență de numărul real de argumente și a tipurilor de argumente va executa
metoda supraîncărcată relevantă.
Ce este polimorfismul dinamic?
Polimorfismul determinat în timpul execuției unei aplicații este cunoscut ca polimorfism dinamic.
Tehnica metodelor supradefinite este un exemplu de astfel de polimorfism. La etapa de execuție se
decide care algoritm să fie executat: cel din clasa părinte (metoda inițială), sau cel din clasa copil
(cea supradefinită), în dependență de tipul obiectului și nu după tipul variabilei ce memorează
referința către obiectul respectiv.
class Parinte{
public void oMetoda(){System.out.println("Metoda parinte");}
}
class Copil extends Parinte{
public void oMetoda(){System.out.println("Metoda copil");}
public static void main(String args[]){
Parinte obj = new Copil();
obj.oMetoda();
}}
opreavictoria86@gmail.com © MUSTEAȚĂ Victoria
3
Programarea Orientata Spre Obiecte, Limbajul Java, 2019-2020 CEITI
Exerciții
1. Compuneţi în Java clasa Operaţii ce va conţine :
- metoda adunare() supraîncărcată de 5 ori: pentru 2 parametri întregi, pentru 2 parametri reali, 3
parametri întregi, 4 parametri întregi şi pentru număr variabil de argumente care vor calcula şi afişa
suma argementelor primite;
- metoda main().
2. Compuneți un proiect Java ce va conține:
- clasa Muncitor care va avea ca atribut oreLucrate, ca metode: constructorul clasei, metoda
double salariu() va returna salariul care se calculează conform formulei : numarul de ore se
înmulțește la 2000;
- clasa SefEchipa moşteneşte clasa Muncitor care va avea ca metode: constructorul clasei, metoda
salariu() modificată astfel încît să returneze salariul după formula: numărul de ore se înmulțește
la 5000;
- clasa Maistru moștenește clasa SefEchipa are ca metode constructorul clasei şi metoda salariu()
modificată astfel încît să returneze salariul după formula: numărul de ore se înmulțește la 7000.
- clasa Test în care instanțiați obiecte pentru clasele create.

opreavictoria86@gmail.com © MUSTEAȚĂ Victoria


4

S-ar putea să vă placă și