从 Main Class 中的接口调用默认方法

Calling a default method from Interface in Main Class

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

接口:

public interface Pozdrav {

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

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

主要class:

public class KonkretniPozdrav  implements Pozdrav{

    public static void main(String[] args) {

        Pozdrav.stat();
    }
}

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

Error:(8, 16) java: non-static method osn() cannot be referenced from a static context.

如何调用这个默认方法?

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

new Pozdrav() {}.osn();

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

new Pozdrav() {
}.osn();

产出

Ja sam osnovni metod
new KonkretniPozdrav().osn();

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

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

中实施 osn

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

你的主要 class 会像这样。

public class KonkretniPozdrav implements Pozdrav{

    public static void main(String[] args) {

        Pozdrav.stat();
        KonkretniPozdrav konkretnipozdrav = new KonkretniPozdrav();
        konkretnipozdrav.osn();
    }
}

对您的代码的一个考虑是接口不应该有代码实现,除了在 static 方法和 default 方法中,它们是主体中允许的代码。接口是实现接口的 classes 应该 comply/obey 的契约。通常是以字母I作为接口开头的约定,例如:IPozdravHere a document about Java interfaces

也许,您会看看 Abstract classInterfaces

之间的区别