使用接口和抽象类的多态性

-2 java oop polymorphism

abstract class B extends A implements C {

// why I have to add implementation here for add() function


}
class A{
    void add(){        
    }
}
interface C{
    void add();

}

Run Code Online (Sandbox Code Playgroud)

我期望我不需要add()在抽象类中实现该方法B。为什么会发生这种情况?

rzw*_*oot 5

接口的一个怪癖是它们包含的所有成员本质上 public都是. 而在类中,它们本质上是包私有的。(如:如果您没有指定访问修饰符(publicprivateprotected) - 在接口中,那么问题是public,在类中,它们是包私有的)。

因此,add()inclass A是包私有的,而add()ininterface C是公共的。您不能降低访问级别 - 如果您实现 C,您的void add()方法也必须public(或任何更高的访问级别,但public已经是最高的)。

如果你add()A课堂上做到了这一点public,一切都会好起来的。

请注意,您收到的错误是:

Test.java:1: error: add() in A cannot implement add() in C
abstract class B extends A implements C {
         ^
  attempting to assign weaker access privileges; was public
1 error
Run Code Online (Sandbox Code Playgroud)

这确实说明了一切,不是吗?为了便于将来参考,当询问有关 SO 的问题时,您应该包括这样的内容。错误不是用火星语写成的巫毒魔法。你可以阅读它们,它们往往指出了问题。