Java >> Java Tutorial >  >> Java

Methode, die Regeln in Java überschreibt

Methodenüberschreibungsregeln Java

Parameter, die beim Überschreiben von Methoden berücksichtigt werden müssen, sind

Was ist Methodenüberschreibung?

Im Falle einer Vererbung, bei der eine Eltern-Kind-Beziehung besteht,
Elternklasse Definieren Sie eine Methode, sagen Sie connect (), die eine Verbindung zu einem entfernten Dienst herstellt.
Kinderklasse hat eine bessere Möglichkeit, eine Verbindung herzustellen als die Elternklasse und möchte die connect()-Methode der Elternklasse nicht verwenden. Daher überschreibt sie die connect()-Methode der Elternklasse, indem sie eine eigene Implementierung der connect()-Methode bereitstellt,

Wenn jetzt die connect()-Methode mit dem Objekt der untergeordneten Klasse aufgerufen wird, dann wird die connect()-Methode der untergeordneten Klasse aufgerufen und nicht die connect()-Methode der übergeordneten/übergeordneten Klasse. Dieses Konzept wird Methodenüberschreibung genannt.

Beispiel für Methodenüberschreibung:
class Parent{
 public void connect(){  
  System.out.println("Doing connection in Parent way");  
 }
}

class Child extends Parent {
 @Override
 public void connect() { 
  System.out.println("Doing connection in Child way");
 }
}

Regeln zum Überschreiben von Methoden

Parameter, die bei Method Overriding berücksichtigt werden müssen,
  1. Zugriffsbezeichner der Methode
  2. Rückgabeart der Methode
  3. Name der Methode
  4. Argumente/Parameter der Methode
  5. Ausnahme, die die Methode auslöst.

Zugriffsbezeichner der Methode
Das Überschreiben der Methode in der untergeordneten Klasse kann entweder denselben Zugriffsspezifizierer wie die Methode der übergeordneten Klasse haben oder die Sichtbarkeit erhöhen, aber nicht verringern.

Wenn die Methode der übergeordneten Klasse als deklariert ist,
protected void connect(){}
dann ist ein gültiger Zugriffsspezifizierer für die untergeordnete Klasse, die die Methode connect() überschreibt,
public void connect(){} OR
protected void connect(){}


Return Art der Methode:
Die überschreibende Methode in der untergeordneten Klasse kann entweder denselben Rückgabetyp haben oder sollte eine Unterklasse des Rückgabetyps sein, die in der Methode der Superklasse deklariert ist.

Wenn die Methode der übergeordneten Klasse als deklariert ist,
protected Number connect(){}

Dann ist der gültige Rückgabetyp zum Überschreiben der connect()-Methode in der untergeordneten Klasse entweder die Number-Klasse oder alle Unterklassen der Number-Klasse,
public Integer connect(){}
protected Long connect(){}
protected Number connect(){}

Name der Methode:
Der Name der überschreibenden Methode in der untergeordneten Klasse muss genau derselbe sein wie der der in der übergeordneten Klasse deklarierten Methode


Argumente/Parameter der Methode:
Gesamtzahl und Typ der Argumente, die beim Überschreiben der untergeordneten Klassenmethode vorhanden sind, müssen genau dieselben sein wie die der übergeordneten Klassenmethode.

Hinweis:
Argumente, die in der Methode der untergeordneten Klasse vorhanden sind, sollten genau vom gleichen Typ sein (Unterklasse funktioniert nicht) wie die der Methode der übergeordneten Klasse.
Warum das Argument der Unterklasse nicht funktioniert, lassen Sie es uns anhand des folgenden Beispiels verstehen.
class A1{}
class A2 extends A1{}
class A3 extends A1{}

class Parent{
 protected Number connect(A1 a1){  
  System.out.println("Doing connection in Parent way"); 
  return null;
 }
}

class Child extends Parent {
 @Override
 public Long connect(A2 a2) { 
  System.out.println("Doing connection in Child way");
  return null;
 }
}
Im obigen Beispiel
überschreibt die Verbindungsmethode der Superklasse das generische Agument A1.
Die untergeordnete Klasse, die die Verbindungsmethode überschreibt, nimmt das spezifische Agument A2

Wenn kovariante Parameter in der Methodenüberschreibung zulässig sind, wird dies der Fall sein Ausgabe der folgenden Zeilen,
Parent p = new Child();
p.connect(new A3());

Die obige Zeile ruft aufgrund des polymorphen Verhaltens die connect()-Methode der untergeordneten Klassenmethode auf. Außerdem sollte es gemäß der Definition der Methode der übergeordneten Klasse funktionieren, aber gemäß der Definition der überschreibenden Klasse der untergeordneten Klasse wird es nicht funktionieren.

Dieses Problem trat auf, weil die überschreibende Methode der untergeordneten Klasse im Vergleich zur Methode der übergeordneten Klasse ein bestimmtes Argument (Unterklasse) akzeptierte was ein generisches Argument akzeptiert.

Um diese Situation zu vermeiden, muss der Parameter in der überschreibenden Methode genau gleich sein.


Ausnahme, die die Methode auslöst:

Ungeprüfte Ausnahme:
Die überschreibende Methode in der untergeordneten Klasse kann eine beliebige Anzahl von ungeprüften Ausnahmen auslösen, unabhängig davon, ob die überschriebene Methode der übergeordneten Klasse eine geprüfte/nicht geprüfte Ausnahme deklariert hat oder nicht.
Das folgende Beispiel zeigt gültige überschriebene Methoden connect() und connect1().
    class Parent{
     protected Object connect(String s1) {  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
    
     protected Object connect1(String s1) throws NullPointerException{  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
    }
    
    class Child extends Parent {
     @Override
     public Integer connect(String s2) throws RuntimeException, NullPointerException{ 
      System.out.println("Doing connection in Child way");
      return null;
     }
    
     @Override
     protected Object connect1(String s1) throws RuntimeException{  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
    
     public static void main(String[] args) {
      Parent p = new Child();
      p.connect("hello");
     }
    }
    
    

    Geprüfte Ausnahme:
    Wenn beispielsweise die überschriebene Methode der übergeordneten Klasse IOException auslöst, dann kann die überschreibende Methode in der untergeordneten Klasse entweder
    auslösen
    1. Keine Ausnahme,
    2. Gleiche IOException,
    3. Beliebige Anzahl von Unterklassen von IOException wie FileNotFoundException, EOFException usw.


    Nicht erlaubt:
    Wenn beispielsweise die überschriebene Methode der übergeordneten Klasse IOException auslöst, dann kann die überschreibende Methode in der untergeordneten Klasse
    nicht auslösen
    1. Es kann keine Ausnahme von einer völlig neuen Vererbungshierarchie wie SQLException auslösen.
    2. Es kann in unserem Fall keine breitere Ausnahme wie Throwable oder Exception auslösen.

    Fazit:
    Die überschreibende Methode der untergeordneten Klasse kann eine beliebige Anzahl von ungeprüften Ausnahmen auslösen, unabhängig davon, ob die überschriebene Methode der Superklasse eine Ausnahme auslöst oder nicht auslöst.

    Wenn die überschriebene Methode der Superklasse eine überprüfte Ausnahme auslöst, dann überschreibt die Methode von Die untergeordnete Klasse kann entweder keine Ausnahme auslösen oder dieselbe Ausnahme auslösen oder eine beliebige Anzahl von Unterklassen von Ausnahmen auslösen, die von der überschriebenen Methode ausgelöst werden

    Sehen wir uns ein paar Beispiele an und verstehen Sie:
    class Parent{
     protected Object connect(String s1) {  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
     
     protected Object connect1(String s1) throws Exception{  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
    
     protected Object connect2(String s1) throws IOException, SQLException{  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
     
     protected Object connect3(String s1) throws IOException{  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
    
     protected Object connect4(String s1){  
      System.out.println("Doing connection in Parent way"); 
      return null;
     }
    
    }
    
    class Child extends Parent {
     @Override
     public Integer connect(String s2){ //It will work
      System.out.println("Doing connection in Child way");
      return null;
     }
    
     protected Object connect1(String s1) throws Exception, FileNotFoundException, MalformedURLException{ //It will work  
      System.out.println("Doing connection in Child way"); 
      return null;
     }
     
     protected Object connect2(String s1) throws FileNotFoundException{ //It will work
      System.out.println("Doing connection in Child way"); 
      return null;
     }
     
     protected Object connect3(String s1) throws Exception{ //It will NOT work  
      System.out.println("Doing connection in Child way"); 
      return null;
     }
     
     protected Object connect4(String s1) throws Exception{ //It will NOT work  
      System.out.println("Doing connection in Child way"); 
      return null;
     }
     
     public static void main(String[] args) {
      Parent p = new Child();
      p.connect("hello");
     }
    }
    
    

    Falls Sie ein Programm mit einer anderen Ausnahmehierarchie ausprobieren möchten, hier ist der Baum der Ausnahmehierarchie.



    Java-Tag