【问题标题】:What is the inheritance error in this code? [closed]此代码中的继承错误是什么? [关闭]
【发布时间】:2019-11-16 17:00:45
【问题描述】:

我正在研究 Java 的旧考试题,但我不知道这道题:

其中一个声明的类无法编译...

  1. 为了编译这些类,您将进行哪些更改?

  2. 假设您已正确修复编译错误,输出将是什么?简要说明你的答案。

我认为它应该是 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() { [. . .] }
}

【问题讨论】:

  • 为什么不尝试编译代码?

标签: java oop inheritance interface


【解决方案1】:

您的B#execute() 返回类型为String,而C#execute() 方法的返回类型为Object。覆盖 B#execute() 时,您只会返回 String 的子类型,但不会返回任何更通用的内容。

想一想,由于CB 的子类,它可以随时替换B。但是如果C#execute() 可以返回说DateIntegerObject,那么这种替换就不会发生。因此,在方法被覆盖的情况下,您可以返回子类型但不能返回超类型。

另一方面,被覆盖方法的参数可以是其父类方法参数的超类型。它们不能是子类型。

例如
父类 public Map doThis(List n) 中的一个方法,当被覆盖时必须处理至少是 List 的东西(比如 Collection)并且可以返回最多是 Map 的东西(比如 HashMap
所以这可以被我的这个方法public HashMap doThis(Object k)覆盖,因为它必须处理至少一个List并返回一个地图

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多