我正在攻读我的第一个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(在上面的例子中)是一个抽象类这一事实有什么关系?
我找不到关于这个主题的任何内容,但如果这是重复,请提前道歉。
谢谢!