Java 为什么可以使用默认方法的接口签名访问类方法?

Java 为什么可以使用默认方法的接口签名访问类方法?,java,methods,interface,default,Java,Methods,Interface,Default,也许这个问题有明显的答案,但我找不到,可能是因为我是一个java新手。 您能告诉我为什么在Java中可以使用默认方法的接口签名来访问类方法吗。我认为只从类实例访问方法是可能的。 例如: 根据,默认接口方法体中不禁止调用其他方法: 默认方法具有块体。如果类实现接口,但不提供自己的方法实现,则此代码块提供方法的实现 实际上,默认方法与类方法没有太大区别,尤其是在Java 9中,当一个人可以拥有私有接口方法时: public interface Test { String voo(); d

也许这个问题有明显的答案,但我找不到,可能是因为我是一个java新手。 您能告诉我为什么在Java中可以使用默认方法的接口签名来访问类方法吗。我认为只从类实例访问方法是可能的。 例如:

根据,默认接口方法体中不禁止调用其他方法:

默认方法具有块体。如果类实现接口,但不提供自己的方法实现,则此代码块提供方法的实现

实际上,默认方法与类方法没有太大区别,尤其是在Java 9中,当一个人可以拥有私有接口方法时:

public interface Test {

  String voo();

  default void foo() {
   bar();
  }

  private void bar() {
    voo().toString();
  }
}

默认方法是实例方法。()

实例方法在对象的特定实例上调用。但对实例方法的调用是通过对声明该方法的类型的对象的引用进行的。该类型可能是运行时实际对象类型的超类或接口

这使我们能够编写代码,通过一个公共接口(一种多态性)对多种类型的对象进行操作

在实例方法中,可以通过包含调用实例方法的类型调用其他可访问的实例方法

或者,您可以通过关键字
this
(定义为对调用实例方法的对象的引用)执行此操作,该关键字的类型为关键字出现的类型。
this
关键字可以在默认方法中使用。()

因此,在您的情况下,您的默认方法可以调用
this.voo()
,或者只调用
voo()


voo()
返回
字符串的实例。这就是接口的力量。在某种意义上,它就像C/C++中的一个转发声明。对
voo()
的调用在运行时解决,即在runtimeyi调用具体实现,String::toString是一个冗余方法调用,怎么了?在默认方法中,它可以访问其他接口方法和其他默认方法。我相信您描述的是多态行为。我认为这并不能回答问题。您似乎只是在断言“默认方法存在”,他知道这一点。
public interface Test {

  String voo();

  default void foo() {
   bar();
  }

  private void bar() {
    voo().toString();
  }
}
public interface test {
   String voo();

   default void foo() {
      this.voo().toString(); // Can call an instance method accessible through this type.
      voo().toString();      // Equivalent call
   }
}