În acest tutorial, vom învăța despre suprascrierea metodelor în Java cu ajutorul exemplelor.
În ultimul tutorial, am aflat despre moștenire. Moștenirea este o proprietate OOP care ne permite să derivăm o nouă clasă (subclasă) dintr-o clasă existentă (superclasă). Subclasa moștenește atributele și metodele superclasei.
Acum, dacă aceeași metodă este definită atât în superclasă, cât și în subclasă, atunci metoda clasei de subclasă suprascrie metoda superclasei. Acest lucru este cunoscut sub numele de metoda suprascriere.
Exemplul 1: Metoda suprascriere
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Ieșire :
Sunt un caine.
În programul de mai sus, displayInfo()
metoda este prezentă atât în superclasa Animal, cât și în subclasa Dog.
Când apelăm displayInfo()
folosind obiectul d1 (obiectul subclasei), se numește metoda din interiorul subclasei Dog. displayInfo()
Metoda subclasei suprascrie aceeași metodă de superclasa.
Observați utilizarea @Override
adnotării în exemplul nostru. În Java, adnotările sunt metadatele pe care le-am folosit pentru a furniza informații compilatorului. Aici, @Override
adnotarea specifică compilatorul că metoda după această adnotare suprascrie metoda superclasei.
Nu este obligatoriu să se utilizeze @Override
. Cu toate acestea, atunci când folosim acest lucru, metoda ar trebui să respecte toate regulile de suprascriere. În caz contrar, compilatorul va genera o eroare.
Reguli de suprascriere Java
- Atât superclasa, cât și subclasa trebuie să aibă același nume de metodă, același tip de returnare și aceeași listă de parametri.
- Nu putem suprascrie metoda declarată ca
final
șistatic
. - Ar trebui să trecem întotdeauna peste metodele abstracte ale superclasei (vom discuta în tutoriale ulterioare).
super cuvânt cheie în Java Overriding
O întrebare comună care apare în timpul efectuării suprascrierii în Java este:
Putem accesa metoda superclasei după suprascriere?
Ei bine, răspunsul este Da . Pentru a accesa metoda superclasei din subclasă, folosim super
cuvântul cheie.
Exemplul 2: utilizarea super cuvântului cheie
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Ieșire :
Sunt un animal. Sunt un caine.
În exemplul de mai sus, subclasa Dog suprascrie metoda displayInfo()
superclasei Animal.
Când apelăm metoda displayInfo()
folosind obiectul d1 al subclasei Dog, se numește metoda din interiorul subclasei Dog; nu se apelează metoda din interiorul superclasei.
În interiorul displayInfo()
subclasei câinilor, obișnuiam super.displayInfo()
să apelăm displayInfo()
la superclasă.
Este important să rețineți că constructorii din Java nu sunt moșteniți. Prin urmare, nu există un lucru cum ar fi constructorul care suprascrie în Java.
Cu toate acestea, putem numi constructorul superclasei din subclasele sale. Pentru asta, folosim super()
. Pentru a afla mai multe, vizitați cuvântul cheie super Java.
Specificații de acces în Metoda suprascriere
Aceeași metodă declarată în superclasă și subclasele acesteia poate avea specificatori de acces diferiți. Cu toate acestea, există o restricție.
Putem folosi acei specificatori de acces numai în subclasele care oferă acces mai mare decât specificatorul de acces al superclasei. De exemplu,
Să presupunem că myClass()
este declarată o metodă din superclasă protected
. Apoi, aceeași metodă myClass()
din subclasă poate fi public
sau protected
, dar nu private
.
Exemplul 3: Specificator de acces în suprascriere
class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Ieșire :
Sunt un caine.
În exemplul de mai sus, subclasa Dog suprascrie metoda displayInfo()
superclasei Animal.
Ori de câte ori apelăm displayInfo()
folosind d1 (obiectul subclasei), se apelează metoda din interiorul subclasei.
Observați că, displayInfo()
este declarat protected
în superclasa Animal. Aceeași metodă are public
specificatorul de acces în subclasa Dog. Acest lucru este posibil, deoarece public
oferă acces mai mare decât protected
.
Metode abstracte superioare
În Java, clasele abstracte sunt create pentru a fi superclasa altor clase. Și, dacă o clasă conține o metodă abstractă, este obligatoriu să o suprascrieți.
Vom afla mai multe despre clasele abstracte și suprascrierea metodelor abstracte în tutoriale ulterioare.