我使用多态数组创建了一个基本的继承程序。从父类开始,循环访问此数组,并在每个索引处的每个对象(从子类创建)执行父类的实例方法。
作为一个实验,我在其父类类型的子类构造函数中创建了一个对象,并从那里执行了父类的实例方法。
由于我不知道的原因,这导致实例方法(从子类'构造函数执行)执行次数作为父类'多态数组的长度(如果是多态的数组有 5 元素,子类'方法调用将执行 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.
答案 0 :(得分:3)
有问题的一行是:
MyClass obj = new MyClass("asdf");
如果你只是简单地调用getDescription()而不是obj.getDescription(),它应该没问题。由于'Child'扩展了'MyClass',超级构造函数调用用于初始化超类中的所有内容(我只想说你现在可以想象它是一个隐式的new MyClass("...")
)你不必明确地实例化'MyClass'
答案 1 :(得分:3)
任何地方都没有奇怪的继承循环。您创建两个Child实例,每个实例都执行此代码
MyClass obj = new MyClass("asdf");
obj.getDescription();
并按预期打印“asdf有空字符串。”。请注意obj
已准备好进行垃圾收集,因为在执行此代码后无法再访问它。也就是说,这两行是不必要的,它们唯一的作用是输出“asdf有空字符串”。当你写super(“something”)时,已经调用了超类的构造函数。
然后,最后打印两个Child对象,并使用正确的值。