由于家庭作业应该测试我们对继承的理解,我有许多不同的子类,所有子类都以相同的实例变量结束。在每个子类中,我都有一个方法printInfo()
来打印所有实例变量。 printInfo()
在它所存在的每个类中完全相同,但我相当确定我无法将其移动到任何父类,因为某些实例变量仅存在于该子类中class(也就是包含printInfo()
的类)。根据我的阅读,我可以使用父类创建一个包含每个对象的ArrayList:
ArrayList<Parent> myArrayList = new ArrayList<Parent>;
myArrayList.add(new Child1());
myArrayList.add(new Child2());
我的问题是我希望能够在此ArrayList中的每个对象上调用printInfo()
。我尝试使用这样的for循环:
for(int i = 0; i < myArrayList.size(); ++i) {
myArrayList.get(i).printInfo();
}
但它不会识别我的printInfo()
方法,因为它只存在于子类中,而不存在于ArrayList使用的父类中。我假设这是因为ArrayList包含Parent类的对象,因此它不会调用子类的任何成员函数。有什么办法可以使用ArrayList(或类似的数据结构)调用printInfo()
方法吗?
注意:我知道这个程序的设计很差,因为有多个子类具有相同的方法,但我被告知这正是分配所期望的。我不需要关于如何重构类的建议,我只想找到一种方法在不同类的多个对象上有效地调用相同的方法。
答案 0 :(得分:2)
有没有办法可以使用ArrayList(或类似的数据结构)调用printInfo()方法?
仅当父类或接口具有printInfo()
方法时。请注意,即使父类具有printInfo()
方法,每个子类也可以覆盖它,并在方法中打印自己的变量。通常,这种方法在调用自己的变量之前首先会调用父超级方法。
例如:
import java.util.ArrayList;
import java.util.List;
public class ParentChild {
public static void main(String[] args) {
List<Parent> parentList = new ArrayList<>();
parentList.add(new Parent());
parentList.add(new Child1());
for (Parent obj : parentList) {
obj.printInfo();
System.out.println();
}
}
}
class Parent {
private int a = 0;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void printInfo() {
System.out.print("a: " + a);
}
}
class Child1 extends Parent {
private int b = 2;
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
public void printInfo() {
super.printInfo();
System.out.println("; b: " + b);
}
}
答案 1 :(得分:1)
好像在每个子类中,我都有一个printInfo()方法,用于打印所有实例变量。 printInfo()与
中存在的每个类完全相同
但我相当确定我无法将其移动到任何父类,因为某些实例变量只存在于该子类(也就是包含printInfo()的类中)。
但是,您可以移动该方法。您需要在每个子项中覆盖它。如果父变量中不存在某些变量并不重要,只需打印您拥有的变量即可。这些方法的内容旨在不同。这是任务 - 了解继承和方法覆盖。
如果需要打印父变量,可以在子类中调用super.printInfo()
。
例如,如果父和子都有一些同名的实例变量,则子类是&#34;阴影&#34;父变量。应该不需要复制任何东西。
但它不会识别我的printInfo()方法。
在Parent类上实现该方法后,它将会。一旦你有一个扩展Parent的对象,它就会调用重写的方法。
因为它只存在于子类中,而不存在于ArrayList使用的父类
让我们说你出于某种原因无法移动方法......我想你可以做到这一点。不过不确定。我一直不擅长搞这种遗产,因为我对这些设计有很多经验。
Parent p = myArrayList.get(i);
if (p instanceof Child1) {
((Child1) p).printInfo();
}