当前位置: 首页 > 知识库问答 >
问题:

java接口中的默认方法

杨腾
2023-03-14

我试图使用以下代码理解Java接口中的默认方法,但我无法编译它:

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class Clazz implements A {
}

class c
{
    public static void main(String[]args)
    {
        Clazz clazz = new Clazz();
        clazz.foo(); // Calling A.foo()
    }
}

编译器生成了以下输出:

c.java:2: error: illegal start of type
    default void foo(){
    ^
c.java:2: error: = expected
    default void foo(){
            ^
c.java:2: error: ';' expected
    default void foo(){
                ^
c.java:2: error: illegal start of type
    default void foo(){
                    ^
c.java:2: error:  expected
    default void foo(){
                     ^
c.java:2: error: = expected
    default void foo(){
                      ^
c.java:2: error: ';' expected
    default void foo(){
                       ^
c.java:3: error: illegal start of type
       System.out.println("Calling A.foo()");
             ^
c.java:3: error: = expected
       System.out.println("Calling A.foo()");
                 ^
c.java:3: error:  expected
       System.out.println("Calling A.foo()");
                         ^
c.java:3: error: illegal start of type
       System.out.println("Calling A.foo()");
                          ^
c.java:5: error: class, interface, or enum expected
       }

我无法理解这些错误。我如何更正代码中的问题?

共有1个答案

符渊
2023-03-14

defaultmodifier不适用于早于8的java版本,因此请确保您的源代码使用了正确的编译器。

 类似资料:
  • 我想通过创建一个具体实现类的对象来执行接口中默认方法的定义体,该对象也覆盖了该方法。无论我是直接创建具体实现类的对象,还是通过动态绑定/多态,实现类中定义/重写的主体都只是得到执行。请看下面的代码 我想知道如何在控制台内部界面银行打印以下内容--loan()

  • 问题内容: 考虑以下情况, 在上面的例子中我得到以下输出这是 相当 期待。 我一直在阅读有关默认方法的信息, 尤其是 关于扩展包含默认方法的接口的信息 2 第二子弹:重新声明的默认方法,这使得它的抽象。 在上面的示例中,我有两个接口的默认方法具有相同的名称,并且当我实现这两个接口时,我只能实现对的引用。 我对此几乎没有疑问, 我怎样才能 到达 的方法 和 如果我不能比,为什么? 没有这种行为从本质

  • Java8在接口上引入了默认方法,为collections接口的实现提供向下兼容,以避免遗留库上的MethodNotFound错误。 也就是说,具有Java7实现List的库不会实现stream()方法。如果Java8代码使用这个库,默认实现提供了一个后退。 我在实践中看到的是,许多开发人员过度使用这个特性,以类似scala特性的风格来模拟混合和多重继承。 我担心的一个问题是,这种编程风格模糊了接

  • 我想给出一个完整的答案: “为什么/何时使用抽象类而不是接口。” 并寻求对以下方面的验证/建议。 “一个原因是:接口方法都是公共的,字段成员都是常量(final和public)。您可能需要限制方法的访问权限和/或使它们在非常量状态下操作。 另一个是:子代类可以通过super调用抽象类方法,而它不能对默认接口方法调用抽象类方法。此外,接口没有可由后代调用的构造函数。 其余的原因与上面的pre-Jav

  • 问题内容: 向所有Java专家致敬! 从Java8开始,我们可以在接口中使用默认实现(是的!)。但是,当您想从默认方法登录时会出现问题。 我有种感觉,每次我想在默认方法中记录某些内容时都调用.getLogger()是不明智的。 是的,可以在接口中定义静态变量-但这对于接口而言不是一个好习惯,而且+暴露了记录器(必须是公开的)。 我目前的解决方案: LogHolder仍然对所有人可见,这实际上没有任

  • 当我注意到现在可以在接口中定义静态和默认方法时,我正在通过接口学习。 请解释两者的区别,如果有一个我们什么时候会使用它的例子,那就好了。界面上有点混乱。