2016-06-17 18 views
5
class Clidder { 
    private final void flipper() { 
     System.out.println("Clidder"); 
    } 
} 
public class Clidlet extends Clidder { 
    public final void flipper() { 
     System.out.println("Clidlet"); 
    } 
    public static void main(String args[]) { 
     new Clidlet().flipper(); 
    } 
} 

was ist das ergebnis? auf diese Frage habe ich die Antwort "Kompilierung fehlgeschlagen" erwartet, da die finale Methode nicht überschrieben werden kann und keine Vererbung zulässt. aber die Antwort war "Cliddet" warum ist das? habe ich in diesem Konzept etwas falsch verstanden. Wie kann das die Ausgabe sein? bitte erkläre.genau wie methode funktioniert in java

+0

Interessanter Randfall. Faustregel: tun Sie das nicht einfach :) – dimo414

+0

Wenn Sie wirklich überprüfen möchten, entfernen Sie 'private' Schlüsselwort – emotionlessbananas

Antwort

4

Der private Modifikator gibt an, dass die Methode von flipper() in der Klasse von Clidder nicht von der untergeordneten Klasse Clidlet gesehen werden kann. Es überschreibt also nicht, sondern sieht wie eine neue Methodendeklaration in der Kindklasse aus. Private Methode/Feld kann nicht überschrieben werden, da sie nicht angezeigt werden kann.

+0

Puh! Ich wurde ausgetrickst. danke für die Erklärung. – vidya

1

private Methoden werden nicht überschrieben, daher gibt es hier keine Überschreibung, also keine Verletzung von final. In der Tat final auf eine private Methode ist sinnlos, oder redundant, treffen Sie Ihre Wahl.

0

Die Antwort sollte "Cliddet" sein, da Ihre letzte Methode private Zugriffsmodifikator hat, die es für die untergeordnete Klasse unsichtbar macht. Die Flipper-Methode in der Klasse Clidlet versteckt die gleiche Methode in der Elternklasse. Dies ist ziemlich gefährlich, als Ergebnis wird davon abhängen, ob es von der Oberklasse oder der Unterklasse aufgerufen wird.

Clidlet clidlet = new Clidlet(); 
clidlet.flipper(); // prints Clidlet 

Clidder clidder = new Clidlet(); 
clidder.flipper(); // prints Clidder 
0

In diesem Fall verhindert das Schlüsselwort private, dass die Unterklasse auf die Methode zugreift. Als Ergebnis Clidlet fragt Clidder über die Eigenschaften der Methode, erhält die Antwort "Ich halte es privat" und führt eine eigene Methode aus.

Dieser Fall veranschaulicht, dass die Tatsache, dass private vorausgeht (höhere Priorität hat als) final, dass private final == private und die Verwirrung zeigt, um es zu führen.

+0

Private + Finale ist weniger, aber es ist legal? wenn es kein privates Schlüsselwort gab und nur endgültig, dann ist die Antwort, dass die Kompilierung fehlschlägt, habe ich recht? – vidya