2013-03-16 18 views
5

サブクラスオブジェクトがスーパークラスを参照する方法は?たとえば、次のようにChildClassコンストラクタが呼び出される。ここ継承:サブクラスの基本クラスフィールドへのアクセス

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. 
} 

、タイプParentClassのオブジェクトが作成され、右?

ChildClassはParentClassオブジェクトからstrFieldを継承していますので、何とかParentClassオブジェクトにアクセスする必要があります(ChildClassオブジェクト)。

+0

利用superキーワード:P – Sach

+0

これは本当に悪いタイトルです。そこにいくつかのコンテキストを置くことを考えてください – Nishant

+0

私は同意する、(:-)今それは良いです! –

答えて

5

ChildClass childClassInstance = new ChildClass()を実行すると、新しいオブジェクトが1つだけ作成されます。

次の方法で定義されたオブジェクトとしてChildClassを見ることができます:ParentClassからChildClass +フィールドから

  • フィールド。だから、フィールドstrFieldがChildClassの一部であるので、

    ChildClassコンストラクタは型ParentClassのオブジェクトと呼ばれていることを、あなたの仮定が作成され

    childClassInstance.strFieldを介してアクセスすることができ

は正確ではありません。作成されたchildClassインスタンスは、ALSO ParentClassインスタンスであり、同じオブジェクトです。

1

strFieldにはChildClassと宣言されているかのようにアクセスできます。混乱を避けるために、親クラスのフィールドにアクセスしていることを意味するsuper.strFieldを追加することができます。

4

ChildClassのインスタンスがParentClassオブジェクトである、ParentClassオブジェクトを持っていません。子クラスとして、親クラスのpublicおよびprotected属性/メソッドにアクセスできます。従ってChildClassstrFieldにアクセスできますが、intFieldbyteFieldはプライベートなのでアクセスできません。

これは特別な構文なしで使用できます。

1

はい。特別な操作を実行することなく、のstrFieldフォームにアクセスすることができます(インスタンスは1つだけ作成されますが、親からすべてのプロパティとメソッドを継承します)。

1

ここで、ChildClassコンストラクタが という名前のオブジェクトと呼ばれる場合、ParentClassが作成されます。

いいえ!ChildClassコンストラクタは、それは( ChildClassがParentClassオブジェクトからstrFieldを継承

ChildClass

に継承される>>親クラスのコンストラクタが と呼ばれ、ParentClassのオブジェクトが親クラスからだけアクセスできるフィールドを作成していないと呼ばれる、そうされますChildClassオブジェクト)は何とかParentClassオブジェクトにアクセスする必要がありますが、 ではどうですか?

ありませんが、それだけで、唯一の非引数コンストラクタとコンパイラの関与の事業に注力することで、新たなChildClass

0

を作成するにはParentClassのテンプレートを再利用している派生クラス(ChildClass)のデフォルトながら、コンストラクタ(非argコンストラクタ)が呼び出されると、コンパイラのヘルプ(派生クラスで基本クラスコンストラクタ呼び出しを挿入する)のメカニズムによって基本クラス(ParentClass)のサブオブジェクトが作成され、派生クラスのオブジェクト内にラップされます。

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()); 

    } 
} 

結果:

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 
関連する問題