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) {
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: