是否可以在Java中使用ArrayList在同一父类的不同对象类型上调用相同的方法?

时间:2016-10-05 01:31:10

标签: java inheritance arraylist

由于家庭作业应该测试我们对继承的理解,我有许多不同的子类,所有子类都以相同的实例变量结束。在每个子类中,我都有一个方法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()方法吗?

注意:我知道这个程序的设计很差,因为有多个子类具有相同的方法,但我被告知这正是分配所期望的。我不需要关于如何重构类的建议,我只想找到一种方法在不同类的多个对象上有效地调用相同的方法。

2 个答案:

答案 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();
}