11

サブクラスオブジェクトはどのようにしてスーパークラスを参照できますか?例えば:

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

ここでChildClassコンストラクターが呼び出されると、型のオブジェクトParentClassが作成されますよね?

ChildClassstrFieldはParentClassオブジェクトを継承するため、ChildClass(ChildClassオブジェクト)は何らかの方法でオブジェクトにアクセスできる必要がありますParentClassが、どのようにしたらよいでしょうか。

4

6 に答える 6

9

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

ChildClassは、次のように定義されたオブジェクトとして表示されます。

  • ChildClass+からのフィールドParentClass

したがって、このフィールドstrFieldはChildClassの一部であり、childClassInstance.strField

だからあなたの仮定は

コンストラクターが呼び出されると、ChildClassタイプのオブジェクトParentClassが作成されます

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

于 2013-03-16T17:46:02.980 に答える
5

のインスタンスにオブジェクトChildClassがなく、オブジェクトです。子クラスとして、親クラスのパブリックおよび保護された属性/メソッドにアクセスできます。したがって、ここではにアクセスできますが、プライベートであるためアクセスできません。ParentClassParentClassChildClassstrFieldintFieldbyteField

特定の構文なしで使用できます。

于 2013-03-16T17:45:15.477 に答える
1

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

于 2013-03-16T17:42:51.563 に答える
1

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

于 2013-03-16T17:46:18.680 に答える
1

ここで、ChildClassコンストラクターが呼び出されると、ParentClass型のオブジェクトが作成されます。

いいえ!ChildClassコンストラクターが呼び出されます>>親クラスconstrが呼び出され、ParentClassのオブジェクトは作成されません親クラスからアクセス可能なフィールドがChildClassに継承されます

ChildClassはParentClassOBJECTからstrFieldを継承するため、ChildClass(ChildClassオブジェクト)は何らかの方法でParentClassオブジェクトにアクセスできる必要がありますが、どのようにしたらよいでしょうか。

いいえ、ParentClassのテンプレートを再利用して新しいChildClassを作成するだけです。

于 2013-03-16T17:56:50.580 に答える
0

非引数コンストラクターとコンパイラーの関与のみのビジネスに焦点を当てることにより、派生クラス(ChildClass)のデフォルトコンストラクター(非引数コンストラクター)が呼び出されている間、基本クラス(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
于 2017-07-23T19:51:09.303 に答える