2


     ポリモーフィック配列を使用して、基本的な継承プログラムを作成しました。親クラスから、この配列がループされ、各インデックスの各オブジェクト(子クラスから作成された)が親クラスのインスタンスメソッドを実行します。

     実験として、親クラス型の子クラスコンストラクター内にオブジェクトを作成し、そこから親クラスのインスタンスメソッドを実行しました。

     私にはわからない理由で、これにより、インスタンスメソッド(子クラスのコンストラクターから実行)が親クラスのポリモーフィック配列の長さとして何度も実行されます(ポリモーフィック配列に5つの要素がある場合、子-class'メソッド呼び出しは5回実行されます)。


親クラスは次のとおりです。

public class MyClass
{
    // instance variables
    protected String name;
    protected String numStrings;

    // constructor
    public MyClass(String name)
    {
        this.name = name;
    }

    // instance method
    public void getDescription()
    {
        System.out.println("The " + name + " has " + numStrings + " strings.");
    }

    // main method
    public static void main(String[] args)
    {
        MyClass[] instruments = new MyClass[2];

        instruments[0] = new Child("Ibanez bass guitar");
        instruments[1] = new Child("Warwick fretless bass guitar");

        for(int i = 0, len = instruments.length; i < len; i++)
        {
            instruments[i].getDescription();
        }
    } // end of main method
} // end of class MyClass


...ここに子クラスがあります:

public class Child extends MyClass
{
    // constructor
    public Child(String name)
    {
        super(name); // calling the parent-class' constructor
        super.numStrings = "four";

        MyClass obj = new MyClass("asdf");
        obj.getDescription();
    }
} // end of class Child


...そしてここに出力があります:

The asdf has null strings.
The asdf has null strings.
The Ibanez bass guitar has four strings.
The Warwick fretless bass guitar has four strings.


4

2 に答える 2

3

問題のある行はこれです:

MyClass obj = new MyClass("asdf");

obj.getDescription()の代わりにgetDescription()を呼び出すだけであれば、問題ありません。'Child'は'MyClass'を拡張するため、スーパーコンストラクター呼び出しはスーパークラス内のすべてを初期化するためのものです(今のところ暗黙的に想像できるとしましょうnew MyClass("..."))。'MyClass'を明示的にインスタンス化する必要はありません。

于 2012-09-12T07:57:53.037 に答える
3

どこにも奇妙な継承ループはありません。2つの子インスタンスを作成し、それぞれがこのコードを実行します

    MyClass obj = new MyClass("asdf");
    obj.getDescription();

そして、予想通り、「asdfにはnull文字列があります。」と出力します。objこのコードの実行後はアクセスできなくなるため、ガベージコレクションの準備ができていることに注意してください。つまり、これらの2行は不要であり、その唯一の効果は「asdfにはnull文字列があります」を出力することです。super( "something")を作成すると、スーパークラスのコンストラクターが既に呼び出されます。

そして、2つの子オブジェクトが最終的に正しい値で出力されます。

于 2012-09-12T08:03:39.443 に答える