我遇到从界面调用默认方法的问题。这是我的代码:
接口:
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()不能从静态上下文中引用。
如何调用此默认方法?
答案 0 :(得分:3)
new KonkretniPozdrav().osn();
要拨打osn
,需要Pozdrav
的实例。
default
方法(实例成员)并不意味着static
方法(类成员)。它表明该方法将身体置于界面中。 default
方法提供了实现的默认行为。这就是为什么您不必在osn
中实施KonkretniPozdrav
。
答案 1 :(得分:2)
您需要Pozdrav
的实例来调用实例方法。例如:
new Pozdrav() {}.osn();
答案 2 :(得分:1)
您需要一个具体的实例来调用该方法。如果您尚未创建具体类型,则可以匿名进行。像,
new Pozdrav() {
}.osn();
输出
Ja sam osnovni metod
答案 3 :(得分:1)
要调用非静态方法,您应该使用关键字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 来表示界面,例如: IPozdrav 。
Here a document about Java interfaces。
也许,您会看到抽象类与接口
之间的区别