java中接口中的数据成员

问题描述 投票:0回答:1

接口中的数据成员是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();
    }
}
java interface abstract default-interface-member
1个回答
0
投票

你似乎忘记了自己句子中的一个单词。我将用粗体突出显示它:

在接口中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 版本中,您可以声明私有方法,这些方法实际上是最终的(所有私有方法都是私有方法,因为您如何覆盖它们?)。接口中私有方法的目的是唯一允许您为默认实现编写辅助方法。它们没有其他目的。

© www.soinside.com 2019 - 2024. All rights reserved.