2017-05-06 1 views
1

ich diese Frage gegeben haben:Vererbung in Java hatte verwirrend Ausgang

public class A { 

    private void a() { 
     System.out.println("a"); 
    } 

    public static void main(String[] args) { 
     A t = new B(); 
     t.a(); 
    } 
} 


class B extends A { 
    public void a() { 
     System.out.println("b"); 
    } 
} 

Dieser druckt Ausgabe: a

Ich bin nicht sehr sicher über die Antwort. Ich weiß, dass wenn Sie ein untergeordnetes Objekt erstellen und es an die übergeordnete Referenz weitergeben. Es führt Funktionen überschrieben nur über A. Aber hier ist die Funktion privat, wie funktioniert das ???

Ich weiß, das ist nicht übergeordnet. Aber wie kommt es, dass die Ausgabe "a" druckt?

+3

drucken Sie können eine 'private' Methode nicht überschreiben. –

+0

'a()' ist eine private Funktion auf A und wird nicht vererbt. – SomeDude

+0

private Methoden sind nicht vererbt –

Antwort

-1

Obwohl sowohl die Eltern- als auch die Kindklasse die Methode a() hat, überschreibt sie nicht die Methode, da a() in der Elternklasse A privat ist.

Private Methode ist nicht sichtbar außerhalb der Klasse, nicht einmal in seiner Klasse Kind. Hier weiß die Klasse B nicht, dass in der Elternklasse eine Methode mit dem gleichen Namen existiert.

Also, wenn Sie ein() mit Bezug der Klasse A nennen, wird es die Methode der Klasse A anrufen und nicht von ihm ist Kind Klasse B.

Wenn Sie den Modifikator der Methode A() in der Klasse ändern A für public, protected oder default, dann können Sie das Überschreiben des Verhaltens der Methode sehen. Und es wird 'b'

+1

aber das Objekt, das Sie erstellt haben, ist von B nicht A. Das bedeutet, dass private Mitglieder von A über B's Objekt erreichbar sind. Das klingt nicht richtig. –

+0

Nein. Sie können nicht auf private Mitglieder der Klasse A zugreifen, die Objekte der Klasse B verwenden. In Ihrem Fall sieht der Compiler a() als eine Methode der Klasse A und nicht der Klasse B. –

+0

Wenn Sie die Methode a() aus der Klasse B entfernen und dann den Code schreiben: B b = new B(); b.a(); Es wird nicht kompiliert. –