接口中的数据成员是final、static和final,final方法不能被重写,那么我们如何在实现接口的类中实现抽象方法呢??
这段代码是如何工作的,任何人都可以帮助我理解吗?
interface Test1{
default void fun(){
System.out.println("Inside Test1");
}
}
interface Test2{
default void fun(){
System.out.println("Inside Test2");
}
}
class Sample implements Test1,Test2{
public void fun(){
Test1.super.fun();
Test2.super.fun();
}
}
public class Main
{
public static void main(String[] args) {
Sample s = new Sample();
s.fun();
}
}
你似乎忘记了自己句子中的一个单词。我将用粗体突出显示它:
在接口中data成员是final、static和final,final方法不能被重写,那么我们如何在实现接口的类中实现抽象方法呢??
“数据成员”不是官方术语,但无论您从哪本书或教程中获得该文本,都意味着:字段。不是方法。
因此:
public interface Example {
int foo = 5;
}
等同于:
public interface Example {
public static final int foo = 5;
}
因为
foo
是一个“数据成员”(用 Java 官方用语:字段声明或字段成员),并且接口中的字段声明确实是 public static final
,无论您是否声明它们如此。尝试撤消此操作会导致编译器错误(例如,private int foo = 5;
在接口声明中无效)。
您在代码片段中显示的内容不是字段声明。它们是方法声明。哪些不是“数据成员”,因此不是“公共静态和最终的”。事实上,
final
毫无意义,实际上是无效的:
public interface Example {
default final void whatever() {}
}
无法编译。你不能将任何方法声明为
default
,无论是否已定义为 final
。不过,在现代 Java 版本中,您可以声明私有方法,这些方法实际上是最终的(所有私有方法都是私有方法,因为您如何覆盖它们?)。接口中私有方法的目的是唯一允许您为默认实现编写辅助方法。它们没有其他目的。