2013-02-18 18 views
9

Ich lerne Java. Ich habe Zweifel an der Vererbung. Wenn eine untergeordnete Klasse die übergeordnete Klasse erweitert und die übergeordnete Klasse über eine Methode verfügt, die auf eine Instanzvariable verweist, die in parent deklariert ist. Die untergeordnete Klasse dint überschreibt jedoch diese Methode und hat die Instanzvariable mit demselben Namen wie die übergeordnete Instanz deklariert. In diesem Fall wird auf die Instanzvariable von child verwiesen oder es wird auf die Eltern verwiesen. Unten ist der Code-SchnipselJava-Vererbung überschreiben Instanzvariable

class parent { 
    int a; 
    parent() { 
     System.out.println("in parent"); 
     a = 10; 
    } 
    void method() { 
     System.out.println(a); 
    } 
} 
class child extends parent { 
    int a; 
    child() { 
     System.out.println("in child"); 
     a = 11; 
    } 
} 

public class Test { 
    public static void main(String args[]) throws IOException { 
     parent p1 = new child(); 
     p1.method(); 
    } 
} 

Der Ausgang I erhalten

in Mutter
in Kind

Kann jemand mir bitte, warum die mit Bezug Elternklasse Instanzvariable a verstehen und nicht Kinderklasse a.

Ein weiterer Zweifel ist, ich habe verstanden, die Methode zu verstecken, wenn es eine statische Methode in Eltern- und Kind-Klasse hat auch eine statische Methode mit der gleichen Unterschrift deklariert. Hier bedeutet Verstecken? Welche Methode wird versteckt? Wenn es die Elternmethode ist, kannst du mir bitte erklären?
Vielen Dank im Voraus.

+2

Sind Sie sicher, dass Ihr Code auch kompiliert wird? Hast du deinen Code ausgeführt? –

+1

Dies sollte nicht kompilieren, Eltern hat keine Methode 'method()' –

+0

Sorry, das wurde falsch formatiert. den Code jetzt aktualisiert. – Mojoy

Antwort

17
  1. Java-Instanz-Variablen können nicht in einer Unterklasse überschrieben werden. Java-Vererbung funktioniert nicht auf diese Weise.

  2. In Ihrem Beispiel wird keine Methode zum Verbergen (oder Überschreiben oder Überladen) ausgeführt.

  3. Es gibt jedoch ein Verstecken von Instanzvariablen. In der Klasse child verbirgt die Erklärung der a die Deklaration von a in parent, und alle Verweise auf a in der child Klasse auf die child.a beziehen sich nicht die parent.a.

Um dies zu verdeutlichen deutlich mehr, versuchen Sie dies ausführen:

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    parent p1 = c1; 

    System.out.println("p1.a is " + p1.a); 
    System.out.println("c1.a is " + c1.a); 
    System.out.println("p1 == c1 is " + (p1 == c1)); 
} 

Es sollte Ausgabe:

p1.a is 10 
    c1.a is 11 
    p1 == c1 is true 

Dies zeigt, dass es ein Objekt mit zwei verschiedenen Feldern a genannt ist .. und Sie können beide Werte erhalten, wenn der Zugriff es erlaubt.


Schließlich sollten Sie lernen, den Standardkonventionen für Java-Bezeichner zu folgen. Ein Klassenname sollte IMMER mit einem Großbuchstaben beginnen.

2

Instance variables are not overriden in sub-class. Wenn Sie in Ihrer Klasse eine Variable mit dem gleichen Namen wie in Ihrer Superklasse definieren, heißt das shadowing von Variableninheretence and polymorphism gilt nicht für Instanzvariablen. Wenn Sie method() in parent definieren und in der Child-Klasse überschreiben. die unten würde rufen die Kinder Methode() aufgrund der Laufzeit-Polymorphismus

parent p1 = new child(); 
  1. ruft Kindkonstruktors
  2. mit der super() Aufruf invoke übergeordneten Konstruktor Druck
  3. Print-en „in Mutter "und initialisiert ein Parent bis 10
  4. Druck ist in der Kinder- und initialisiert Chils ein bis 11

    p1.method();// this invokes Child's method() during run-time 
    
0

Das Problem besteht darin, dass Sie eine untergeordnete Instanz erstellt und in einer Referenz des übergeordneten Objekts gespeichert haben. Wenn Sie auf die Eigenschaft des Objekts zugreifen, verweist JVM daher auf den Variablenwert des übergeordneten Elements.

Wenn es sich um Referenzvariablen einer untergeordneten Klasse handeln würde, hätten Sie den variablen Wert der untergeordneten Klasse erhalten.

Das Obige ist eine Eigenschaft von Java.

0

Beim Erstellen der Instanz von Parent. Daher ruft der Compiler in der Laufzeit das übergeordnete Objekt versucht den Code unten.

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    c1.method(); 
} 
1

Wenn Sie das tun

Eltern P1 = new Kind();

was JVM tun ist

   first Initialize Parent() 

         || 

       second Initialize Child() 

Also, erste Elternteil Konstruktor aufgerufen und dann das Kind, sondern der Ausgangswert 11 sein wird, weil p1 auf Kinder Objekt verweisen.

1

Wie Sie zwingende nicht-Methode() in der Kinderklasse, wenn die Anweisung,

parent p1 = new child(); 

ausgeführt wird, übergeordnete Version des Verfahrens() ausgeführt wird, und das nur einen Wert zu übergeordneten Klasse bekannt ist seine eigene a. daher wird a = 10 gedruckt (wie es zu diesem Zeitpunkt auf dem Stapel ist).

Schließlich schirmen Sie nur die Variable a von der Elternklasse zur Kindklasse.

Verwandte Themen