2012-08-15 5 views
20

Können private Methoden in Java außer Kraft gesetzt werden? Wenn nein, wie funktioniert der folgende Code?Kann eine private Methode in der Superklasse in der Unterklasse überschrieben werden?

class Base{ 
     private void func(){ 
      System.out.println("In Base Class func method !!");   
     }; 
} 

class Derived extends Base{ 
     public void func(){ // Is this a Method Overriding..????   
      System.out.println("In Derived Class func method"); 
     }  
} 

class InheritDemo{ 
     public static void main(String [] args){      
      Derived d = new Derived(); 
      d.func(); 
     } 
} 

Antwort

2

Nein, ist es nicht. Sie können nur eine Überschreibung markieren wie diese sicher:

@Override 
public void func(){ 
    System.out.println("In Derived Class func method"); 
} 

Und in diesem Fall wäre es ein Compiler-Fehler sein.

+1

Gute alte '@ Override', super nützlich! – TheZ

+0

danke für die Antwort .. aber der Code funktioniert gut, auch wenn ich die Methode in der Superklasse endgültig gemacht ... Also was ich denke ist, wenn wir die gleiche Signatur der Methode in der Unterklasse mit anderen Modifikator verwenden, es ist nur eine neue Methode erstellen der Unterklasse, anstatt das oben genannte zu überschreiben. – AnkitChhajed

+0

siehe bearbeiten. Ich habe "privat" falsch gelesen. XD – Doorknob

17

Nein, eine private Methode kann nicht überschrieben werden, da sie von keiner anderen Klasse aus sichtbar ist. Sie haben eine neue Methode für Ihre Unterklasse deklariert, die keine Beziehung zur Superklassenmethode hat. Eine Möglichkeit, es zu betrachten, ist, sich zu fragen, ob es legal wäre, super.func() in der Klasse Derived zu schreiben. Es gibt keine Möglichkeit, eine übergeordnete Methode auf die Methode, die sie außer Kraft setzt, zu verbieten, aber genau das wäre hier der Fall.

+1

yeah .. und wenn es übersteuert wird, wenn ich eine Referenz der Oberklasse erstellen und das Basisklassenobjekt zuweisen. t muss auch funktionieren, aber es ist nicht – AnkitChhajed

1

Sie überschreiben nicht. Sie können private Mitglieder nicht überschreiben, Sie definieren lediglich eine neue Methode in Abgeleitet. Abgeleitet hat die Base-Implementierung von func() seit seiner Erklärung als privat. Sie erhalten keinen Compilerfehler, wenn Sie in Abgeleitet func() definieren, aber das ist, weil Derived nicht weiß Base hat eine Implementierung von func(). Um es klar zu sagen: Es wäre falsch zu sagen, dass Sie die Implementierung von Base von func() außer Kraft setzen.

+0

oh oops ich falsch gelesen "private" XD – Doorknob

1

Nein, denn wenn Sie etwas wie Base b = new Derived(); machen, können Sie immer noch nicht b.func() aufrufen. Was du machst, heißt "Verstecken".

+0

hmm .. vielen Dank – AnkitChhajed

37

Nein, Sie überschreiben es nicht. Sie können dies überprüfen, indem Sie versuchen, es mit @Override zu markieren, oder versuchen, einen Anruf an super.func(); zu tätigen. Beide werden nicht funktionieren; sie werfen Compilerfehler.

Außerdem check this out:

class Base { 
     private void func(){ 
      System.out.println("In base func method");   
     }; 
     public void func2() { 
      System.out.println("func2"); 
      func(); 
     } 
} 

class Derived extends Base { 
     public void func(){ // Is this an overriding method? 
      System.out.println("In Derived Class func method"); 
     } 
} 

class InheritDemo { 
     public static void main(String [] args) { 
      Derived D = new Derived(); 
      D.func2(); 
     } 
} 

Es druckt:

func2 
In base func method 

Wenn Sie func() in Base zu öffentlichen ändern, dann wird es eine Überschreibung sein, und der Ausgang ändern zu:

+1

@Polygnome: +1 für das Beispiel, das zeigt, es ist kein Override, und für den '@ Override'-Test. –

+2

+1, um zu zeigen, wie dynamischer Versand in diesem Fall funktioniert (oder nicht funktioniert: D). –

+1

sehr gute Antwort. –

0

Da die Methode privat ist, ist sie für die anderen Klassen nicht sichtbar. Daher erbt die abgeleitete Klasse diese Methode nicht. So ist dies nicht der Fall des Überschreibens

0

Methode Verstecken wird hier statt Überschreiben statt. Was passiert im Falle von Statik?

0

Eigentlich sind Sie nicht overriding.Before Java5

eine Rückgabetyp der überschriebene Methode muss mit übergeordneter Klasse Methode entsprechen.

Aber Java 5 führte eine neue Funktion namens kovarianter Rückgabetyp ein. Sie können eine Methode mit derselben Signatur überschreiben, geben aber eine Unterklasse des zurückgegebenen Objekts zurück. Mit anderen Worten, eine Methode in einer Unterklasse kann ein Objekt zurückgeben, dessen Typ eine Unterklasse des Typs ist, der von der Methode mit der gleichen Signatur in der Oberklasse zurückgegeben wird. Sie können diesem Thema folgen: Can overridden methods differ in return type?

-1

Sie können nicht etwas überschreiben, das unsichtbar ist oder für Unterklasse nicht existiert.

Verwandte Themen