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

并按预期打印“asdf 有空字符串。”。请注意,它obj已准备好进行垃圾收集,因为在此代码执行后它不再可访问。也就是说,这两行是不必要的,它们唯一的作用是输出“The asdf has null strings”。当您编写 super("something") 时,已经调用了超类的构造函数。

然后,两个 Child 对象最终被打印出来,并带有正确的值。

于 2012-09-12T08:03:39.443 回答
3

有问题的行是这样的:

MyClass obj = new MyClass("asdf");

如果你只是简单地调用 getDescription() 而不是 obj.getDescription(),应该没问题。由于 'Child' 扩展了 'MyClass' 超级构造函数调用用于初始化超类中的所有内容(假设您现在可以将其想象为隐式new MyClass("...")),因此您不必显式实例化 'MyClass'。

于 2012-09-12T07:57:53.037 回答