2013-03-16 19 views
5

Wie Sub-Klassenobjekte auf die Superklasse verweisen können? Zum Beispiel:Vererbung: Zugriff auf Basisklassenfelder aus einer Unterklasse

public class ParentClass { 

    public ParentClass() {}  // No-arg constructor. 

    protected String strField; 
    private int intField; 
    private byte byteField; 
} 


public class ChildClass extends ParentClass{ 

    // It should have the parent fields. 
} 

Hier, wenn der ChildClass Konstruktor aufgerufen wird, ein Objekt vom Typ ParentClass erstellt wird, nicht wahr?

ChildClass erbt strField vom ParentClass-Objekt, so dass es (ChildClass Objekt) Zugriff auf ParentClass Objekt irgendwie haben sollte, aber wie?

+0

Verwenden Super Stichwort: P – Sach

+0

Das ist wirklich schlecht Titel. Stellen Sie sich vor, dass Sie dort einen Kontext einfügen. – Nishant

+0

ich stimme zu, (:-) jetzt ist es besser! –

Antwort

5

Wenn Sie ChildClass childClassInstance = new ChildClass() tun, wird nur ein neues Objekt erstellt.

Sie können die Child als Objekt sehen wie folgt definiert:

  • Felder aus Child + Felder aus Parent.

Also das Feld strField Teil Child und kann durch childClassInstance.strField zugegriffen werden

So Ihre Annahme, dass

Child Konstruktor ein Objekt vom Typ Parent erstellt aufgerufen wird

ist nicht genau richtig. Die erstellte ChildClass-Instanz ist ALSO, eine ParentClass-Instanz und dasselbe Objekt.

1

Sie können auf strField zugreifen, als ob es in ChildClass deklariert ist. Um Verwirrung zu vermeiden, können Sie eine super.strField hinzufügen, was bedeutet, dass Sie auf das Feld in der Elternklasse zugreifen.

4

Eine Instanz ChildClass keinen ParentClass Objekt, es ist ein ParentClass Objekt. Als untergeordnete Klasse hat sie Zugriff auf öffentliche und geschützte Attribute/Methoden in ihrer übergeordneten Klasse. Also hier ChildClass hat Zugriff auf strField, aber nicht intField und byteField, weil sie privat sind.

Sie können es ohne eine bestimmte Syntax verwenden.

1

Ja. Sie können auf die strField Form der ChildClass zugreifen, ohne eine spezielle Aktion durchzuführen (beachten Sie jedoch, dass nur eine Instanz erstellt wird. Die untergeordnete, die alle Eigenschaften und Methoden von der übergeordneten erben wird).

1

Wenn der ChildClass-Konstruktor ein Objekt vom Typ aufgerufen wird, wird ParentClass erstellt, oder?

Nein!Child Konstruktor heißt >> Elternklasse constr genannt wird und kein Objekt des Parent ist nur zugänglich Feld von der übergeordneten Klasse erstellt werden, in Child geerbt

die Child erbt von der Parent OBJECT strField, so dass es (ChildClass-Objekt) sollte irgendwie Zugriff auf ParentClass-Objekt haben, aber wie?

Nein, es ist nur eine die Vorlage von Parent Wiederverwendung neuen Child zur Schaffung

0

nur auf das Geschäft der nicht-arg Konstruktor und Compiler Beteiligung Durch die Fokussierung, während die abgeleitete Klasse (ChildClass) 's Standard Konstruktor (Nicht-Arg-Konstruktor) wird aufgerufen, ein Unterobjekt der Basisklasse (ParentClass) wird durch den Mechanismus der Hilfe des Compilers erstellt (Basisklassenkonstruktoraufrufe in die abgeleitete Klasse einfügen) und in das Objekt der abgeleiteten Klasse eingeschlossen.

class Parent{ 
    String str = "i_am_parent"; 
    int i = 1; 
    Parent(){System.out.println("Parent()");} 
} 
class Child extends Parent{ 
    String str = "i_am_child"; 
    int i = 2; 
    Child(){System.out.println("Child()");} 
    void info(){ 
     System.out.println("Child: [String:" + str + 
          ", Int: " + i+ "]"); 
     System.out.println("Parent: [String: ]" + super.str + 
          ", Int: " + super.i + "]"); 
    } 
    String getParentString(){ return super.str;} 
    int getParentInt(){ return super.i;} 
    public static void main(String[] args){ 
     Child child = new Child(); 
     System.out.println("object && subojbect"); 
     child.info(); 
     System.out.println("subojbect read access"); 
     System.out.println(child.getParentString()); 
     System.out.println(child.getParentInt()); 

    } 
} 

Ergebnis:

Parent() 
Child() 
object && subojbect 
Child: [String:i_am_child, Int: 2] 
Parent: [String: ]i_am_parent, Int: 1] 
subojbect read access 
i_am_parent 
1 
Verwandte Themen