从java中的抽象类扩展override方法

时间:2015-01-06 03:03:15

标签: java

以下是我的情景:

public interface Father{ public void sayHi(); }
public abstract class FatherImpl implements Father{
   @Override
   public void sayHi() { System.out.print("Hi"); } }

然后是孩子

public interface Child{}
public class ChildImpl extends FatherImpl implements Child{}

和测试功能是

Child c = new ChildImpl();
c.sayHi();

这会抛出编译错误。 仅当我将子界面更改为

public interface Child{} extends Father

然后程序正常运行。

任何人都可以帮我解释原因。

2 个答案:

答案 0 :(得分:3)

Child c = new ChildImpl();

Child界面没有sayHi()方法,ChildImpl。您将c引用为Child对象,因此您无法访问该方法。

您可以将对象引用为ChildImpl或添加另一个类。

ChildImpl c = new ChildImpl();

或者

public abstract class TalkingChild {
    @Override
    public void sayHi() {
        System.out.print("Hi");
    }
}

或者

public interface TalkingChild {
    public void sayHi();
}

最佳解决方案完全取决于您的具体情况。

答案 1 :(得分:2)

问题是编译器只关心声明的类型 - 分配的类型是无关紧要的。

将此应用于您的案例,类型Child没有方法。它并不认为您为ChildImpl变量分配了sayHi(),其中 具有Child方法。