【问题标题】:Why its possible to access class methods using signature of the interface from default method?为什么可以使用默认方法的接口签名来访问类方法?
【发布时间】:2019-07-16 20:58:39
【问题描述】:

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

public interface test {

   String voo();

   default void foo() {
       voo().toString();
   }
}

【问题讨论】:

  • voo() 返回一个 String 的实例
  • 不。这就是接口的力量。从某种意义上说,它就像 C/C++ 中的前向声明。对voo() 的调用在运行时解析,即在运行时调用具体实现
  • 仅供参考,String::toString 是一个多余的方法调用
  • 怎么了?在默认方法中它可以访问其他接口方法和其他默认方法。
  • 我相信你在描述多态行为。

标签: java methods interface default


【解决方案1】:

根据JLS 9.4.3. Interface Method Body,不禁止在默认接口方法体内调用另一个方法:

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

在实践中,默认方法与类方法并没有太大区别,尤其是从 Java 9 开始,可以拥有私有接口方法:

public interface Test {

  String voo();

  default void foo() {
   bar();
  }

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

【讨论】:

  • 我认为这不能回答问题。您似乎只是在断言“存在默认方法”,他知道这一点。
【解决方案2】:

默认方法是实例方法。 (JLS 9.4: Method declarations)

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

这允许我们编写代码,通过一个通用接口——一种多态性,对多种类型的对象进行操作。

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

(可选)您可以通过关键字this 执行此操作,该关键字定义为对调用实例方法的对象的引用,该对象属于关键字出现的类型。 this 关键字可用于默认方法。 (JLS 15.8.3: this)

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

public interface test {
   String voo();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2011-03-23
    • 2014-12-03
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多