确定将调用哪个方法实现(声明与实际类型)

时间:2017-12-11 04:29:24

标签: java abstract-class declaration

我正在攻读我的第一个Java认证,我遇到了一个示例考试问题,我的答案我并不完全理解。问题要求输出到下面的代码示例,正确的答案是“写...”。

abstract class Writer {
    public static void write() {
        System.out.println("Writing...");
    }
}
class Author extends Writer {
    public static void write() {
        System.out.println("Writing book");
    }
}
public class Programmer extends Writer {
    public static void write() {
        System.out.println("Writing code");
    }
    public static void main(String[] args) {
        Writer w = new Programmer();
        w.write();
    }
}

我理解声明的类型和实际类型之间的区别在这里发挥作用。关键是

Writer w = new Programmer();

在这种情况下,声明的类型(Writer)而不是实际的类型(Programmer)正在确定要调用的write()方法的实现。

我想知道为什么会这样。也许答案很简单,声明的类型总是决定调用对象方法的哪个实现。

但是另一种情况呢?例如,我可以编写类似

的内容
List<Integer> list = new ArrayList<Integer>();

并希望有

list.get

在O(1)时间运行 - 换句话说,调用实际类型(ArrayList)给出的get方法的实现,而不是声明的类型(List)。

为什么这些案例似乎按照不同的规则运作?它是否与List是一个接口,而Writer(在上面的例子中)是一个抽象类这一事实有什么关系?

我找不到关于这个主题的任何内容,但如果这是重复,请提前道歉。

谢谢!

0 个答案:

没有答案