logo

Overschrijven op Java

Wanneer een subklasse een specifieke implementatie biedt voor een methode die al is gedefinieerd in de bovenliggende klasse, wordt dit methodeoverschrijving genoemd. De overschreven methode in de subklasse moet dezelfde naamparameters en hetzelfde retourtype hebben als de methode in de bovenliggende klasse.

Regels voor het overschrijven van methoden

  • Naamparameters en retourtype moeten overeenkomen met de bovenliggende methode.
  • Java kiest welke methode tijdens runtime moet worden uitgevoerd op basis van het daadwerkelijke objecttype en niet alleen van het type referentievariabele.
  • Statische methoden kunnen niet worden overschreven.
  • De @Annotatie overschrijven vangt fouten zoals typefouten op in methodenamen.
Java
class Animal {    void move(){  System.out.println(  'Animal is moving.');     }  void eat(){    System.out.println(  'Animal is eating.');     } } class Dog extends Animal{    @Override void move(){     // move method from Base class is overriden in this  // method  System.out.println('Dog is running.');  }  void bark(){    System.out.println('Dog is barking.');     } } public class Geeks {  public static void main(String[] args)  {  Dog d = new Dog();  d.move();   d.eat();   d.bark();  } } 

Uitvoer
Dog is running. Animal is eating. Dog is barking. 

Uitleg: De klasse Animal definieert basisfunctionaliteiten zoals beweging() En eten() . De klasse Dog erft van Animal en overschrijft de move() methode om specifiek gedrag te bieden Hond rent. Beide klassen hebben toegang tot hun eigen methoden. Bij het maken van een Dog-object dat move() aanroept, wordt de overschreven methode uitgevoerd.



willekeurig, niet in Java
Methode overschrijven in Java' title=

Speciale gevallen bij overschrijven

1. Oudermethode bellen met behulp van super

De supertrefwoord kan de bovenliggende klassemethode aanroepen vanuit de overschrijvende methode.

Java
class Parent{    void show(){    System.out.println('Parent's show()');  } } class Child extends Parent{    @Override  void show(){    super.show();  System.out.println('Child's show()');  } } public class Main{    public static void main(String[] args){    Parent obj = new Child();  obj.show();  } } 

Uitvoer
Parent's show() Child's show() 

2.  Definitieve methoden kunnen niet worden overschreven

Als we niet willen dat een methode wordt overschreven, declareren we deze als  definitief . Zie alstublieft  Finale gebruiken met erfenis

Java
class Parent{    // Can't be overridden  final void show(){    } } class Child extends Parent{    // This would produce error  void show() {} } 


Uitvoer :



MethodeOverschrijven' loading='lazy' title=

3. Statische methoden

  • Statische methoden kunnen niet worden overschreven; het definiëren van een statische methode in een subklasse met dezelfde signatuur als in de superklasse verbergt de superklassemethode.
  • Instantiemethoden kunnen worden overschreven, maar een subklasse kan een statische superklassemethode niet overschrijven.
  • Een statische methode in een subklasse met dezelfde signatuur als een statische methode van een superklasse verbergt de oorspronkelijke methode.
Java
class Parent{  static void staticMethod(){    System.out.println('Parent static method');  }  void instanceMethod(){    System.out.println('Parent instance method');  } } class Child extends Parent{    static void staticMethod(){    // Hides Parent's static method  System.out.println('Child static method');  }  @Override  void instanceMethod(){     // Overrides Parent's instance method  System.out.println('Child instance method');  } } public class GFG{    public static void main(String[] args){    Parent p = new Child();    // Calls Parent's static method (hiding)  p.staticMethod();    // Calls Child's overridden instance method  p.instanceMethod();   } } 

Uitvoer
Parent static method Child instance method 

4. Privémethoden

  • Privémethoden kunnen niet worden overschreven omdat ze niet zichtbaar zijn voor subklassen.
  • Een subklassemethode met dezelfde naam wordt behandeld als een nieuwe onafhankelijke methode die geen verband houdt met de bovenliggende klasse.
Java
class Parent{    private void display(){    System.out.println('Parent private method');  } } class Child extends Parent{    void display(){    // This is a new method not overriding  System.out.println('Child method');  } } public class GFG{    public static void main(String[] args){    Child c = new Child();    // Calls Child's method  c.display();   } } 

Uitvoer
Child method 

5. Covariante retourtypen

  • Bij het overschrijven van een methode kan het retourtype van de overschrijvende methode een subklasse zijn van het retourtype van de overschreven methode.
  • Deze functie staat bekend als covariant retourtype en maakt meer specifieke retourtypen in de subklasse mogelijk.
Java
class Parent{    Parent getObject(){    System.out.println('Parent object');  return new Parent();  } } class Child extends Parent{    @Override    // Covariant return type  Child getObject() {   System.out.println('Child object');  return new Child();  } } public class GFG{    public static void main(String[] args){    Parent obj = new Child();    // Calls Child's method  obj.getObject();     } } 

Uitvoer
Child object 

Afhandeling van uitzonderingen bij overschrijven

  • De overschrijvende methode kan geen nieuwe of breder gecontroleerde uitzonderingen genereren dan de methode in de superklasse.
  • Het kan minder of smaller gecontroleerde uitzonderingen opleveren.
  • Het kan alle niet-gecontroleerde uitzonderingen genereren (zoals RuntimeException), ongeacht de superklassemethode.
Java
import java.io.IOException; class Parent {  void display() throws IOException {  System.out.println('Parent method');  } } class Child extends Parent {  @Override  void display() throws IOException {  System.out.println('Child method');  } } public class GFG{    public static void main(String[] args){    // Parent reference Child object  Parent obj = new Child();   try{    // Calls Child's overridden method  obj.display();   } catch (IOException e){    System.out.println('Exception caught: ' + e.getMessage());  }  } } 

Uitvoer
Child method 

Waarom gebruiken we methodeoverschrijving?

  • Om het gedrag van een bestaande methode in een subklasse te veranderen of te verbeteren.
  • Om runtime-polymorfisme te bereiken, zijn methodeaanroepen afhankelijk van het daadwerkelijke objecttype.
  • Om methodenamen te hergebruiken, waardoor redundantie logischerwijs wordt verminderd.

Voorbeeld uit de praktijk: werknemersbeheersysteem

Laten we het overschrijven begrijpen met een analogie uit de echte wereld.

Stel je het werknemersbeheersysteem van een organisatie voor. Alle werknemers delen bepaalde gedragingen, zoals raiseSalary() en promote(), maar de logica verschilt voor verschillende rollen, zoals Manager of Engineer. We kunnen een enkele werknemersarray maken waarin individuele werknemers van verschillende typen zijn (verkooptechnologie, enz.) en hun functies aanroepen. Dit vereenvoudigt de algehele code aanzienlijk.

Java
abstract class Employee {  abstract void raiseSalary();  abstract void promote(); } class Manager extends Employee{  @Override void raiseSalary(){    System.out.println(  'Manager salary raised with incentives.');  }  @Override void promote(){    System.out.println(  'Manager promoted to Senior Manager.');  } } class Engineer extends Employee{    @Override void raiseSalary(){    System.out.println(  'Engineer salary raised with bonus.');  }  @Override void promote(){    System.out.println(  'Engineer promoted to Senior Engineer.');  } } public class Company{    public static void main(String[] args){    Employee[] employees  = { new Manager() new Engineer() };  System.out.println('--- Raising Salaries ---');  for (Employee e : employees){    e.raiseSalary();   }  System.out.println('n--- Promotions ---');  for (Employee e : employees) {  e.promote();  }  } } 

Uitvoer
--- Raising Salaries --- Manager salary raised with incentives. Engineer salary raised with bonus. --- Promotions --- Manager promoted to Senior Manager. Engineer promoted to Senior Engineer. 

Uitleg: Hoewel er naar zowel Manager- als Engineer-objecten wordt verwezen met het type Werknemer, roept Java de overschreven methoden van de werkelijke objecten tijdens runtime aan, wat de dynamische methodeverzending demonstreert (runtime polymorfisme).



Gerelateerd artikel: Methode-overbelasting en methode-overschrijving