我正在研究Java的旧考试题,但我无法弄清楚这一题:
已声明的类之一无法编译...
您将更改哪些内容以编译类?
假设正确纠正了编译错误,输出将是什么?简要说明您的答案。
我认为这将是C类,我想是因为它没有应用适当的OOP原则,但是有人可以帮我更好地解释它吗?
public interface A {
public void doSomeProcess(String s);
}
public class AImpl implements A {
public void doSomeProcess(String s) {
System.out.println("A Imple Code"); [. . .] }
}
public class B {
public A doIt() { [. . .] }
public String execute() { [. . .] }
}
public class C extends B {
public AImpl doIt() { [. . .] }
public Object execute() { [. . .] }
}
答案 0 :(得分:1)
您的B#execute()
返回类型为String
,而C#execute()
方法的返回类型为Object
。覆盖B#execute()
时,您只会返回String
的子类型,而不会返回更通用的子类型。
考虑一下,由于C
是B
的子类,因此可以随时替换B
。但是,如果C#execute()
可以返回说Date
或Integer
或Object
,那么这种替换就不会发生。因此,在重写方法的情况下,您可以返回子类型,但不能返回超类型。
另一方面,被覆盖方法的参数可以是其父类方法参数的超类型。它们不能是子类型。
例如
父类public Map doThis(List n)
中的方法在被重写时必须处理至少为List
的内容(例如Collection
),并且可以返回最多为Map
的内容(说HashMap
)
因此,此方法public HashMap doThis(Object k)
可以覆盖此方法,因为它必须至少处理List
并返回Map