【问题标题】:Calling a default method from Interface in Main Class从主类中的接口调用默认方法
【发布时间】:2018-08-28 12:50:54
【问题描述】:

我在从接口调用默认方法时遇到问题。这是我的代码:

界面:

public interface Pozdrav {

    public static void stat(){
        System.out.println("Ja sam staticni metod");
    }

    default void osn(){
        System.out.println("Ja sam osnovni metod");
    }
}

主类:

public class KonkretniPozdrav  implements Pozdrav{

    public static void main(String[] args) {

        Pozdrav.stat();
    }
}

现在,我需要调用默认方法Pozdrav.osn();,但是当我这样做时,我收到了这个错误:

错误:(8, 16) java: 不能从静态上下文引用非静态方法 osn()。

如何调用这个默认方法?

【问题讨论】:

  • 你没有显示你尝试调用osn()
  • 我知道。我使用了 Pozdrav.osn();但它没有用,所以我删除了它。
  • 忘记它是默认方法的事实;从调用者的角度来看,它只是一个普通的接口方法。您可以像调用任何其他接口方法一样调用它——在接口的实例上。
  • 哦,这很有帮助。我不知道为什么静态方法有效,而默认方法无效。那么,这意味着我也可以通过实例化来调用静态方法?

标签: java interface java-8 default-method


【解决方案1】:

你需要一个Pozdrav 的实例来调用它的实例方法。例如:

new Pozdrav() {}.osn();

【讨论】:

  • 谢谢,它有效。你能解释一下为什么这是调用默认方法的方式吗?我渴望学习。
  • 如第一句所说:你需要一个类的实例来调用它的实例方法。默认方法是实例方法;静态方法不是实例方法。
【解决方案2】:

您需要一个具体实例来调用该方法。如果您尚未创建具体类型,则可以匿名创建。喜欢,

new Pozdrav() {
}.osn();

输出

Ja sam osnovni metod

【讨论】:

    【解决方案3】:
    new KonkretniPozdrav().osn();
    

    为了调用osn,需要Pozdrav 的实例。

    default 方法(实例成员)并不意味着 static 方法(类成员)。它表明该方法将在接口中包含主体。 default 方法为实现提供了默认行为。这就是您不必在 KonkretniPozdrav 中实现 osn 的原因。

    【讨论】:

    • 我知道,我像使用 stat 方法一样使用它。但它没有用
    • @MilanMaxaMaksimović new KonkretniPozdrav().
    • @MilanMaxaMaksimović, osninstance 成员,因此不能从静态上下文中调用它。有意义吗?
    • 好的,谢谢。我还是 Java 新手,这个实例对我来说仍然有点复杂。但你为我清除了它。
    • @MilanMaxaMaksimović 当您不了解对象实例时,您在玩弄接口和默认方法时就走错了路。如果您之前没有了解类和对象,您将错过接口的全部用途。看看the tutorials
    【解决方案4】:

    要调用非静态方法,您应该使用关键字new 创建类的实例,例如:KonkretniPozdrav pozdrav = new KonkretniPozdrav();。要调用静态方法,您不需要实例。只需使用 CLASS.Method() 调用。

    你的主类会看起来像这样。

    public class KonkretniPozdrav implements Pozdrav{
    
        public static void main(String[] args) {
    
            Pozdrav.stat();
            KonkretniPozdrav konkretnipozdrav = new KonkretniPozdrav();
            konkretnipozdrav.osn();
        }
    }
    

    您的代码的一个注意事项是接口不应该实现代码,除了static 方法和default 方法,它们允许在主体中使用代码。接口是实现接口的类应该遵守/服从的契约。通常是一个约定,以字母I开头的接口表示接口,例如:IPozdravHere a document about Java interfaces

    也许,你会看看 Abstract classInterfaces

    之间的区别

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 2019-03-03
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 2014-08-08
      相关资源
      最近更新 更多