【问题标题】:Java call interface method without creating a new instanceJava调用接口方法而不创建新实例
【发布时间】:2017-12-14 06:52:34
【问题描述】:

接口是任何类都可以扩展的唯一类类型。但不幸的是,java 开发人员(?)删除了覆盖接口静态方法的能力。任何人都知道如何在不创建扩展类的新实例的情况下调用接口方法?

【问题讨论】:

    标签: java methods interface instance


    【解决方案1】:

    Java 接口静态方法通过不允许实现类覆盖它们来帮助我们提供安全性。我们不能为 Object 类方法定义接口静态方法,我们会得到编译器错误“This static method cannot hide the instance method from Object”。

    为了从Java程序调用接口方法,程序必须首先实例化接口实现程序。然后可以使用实现对象调用方法。

    【讨论】:

      【解决方案2】:

      接口本身不是类,它们是抽象类型。 在 Java 8 中,您提到的“小脑袋”Oracle 开发人员确实允许在接口中使用 defaultstatic 类型。看看这个例子。来自JournalDev

      1.默认类型

      public interface Interface1 {
      
          void method1(String str);
      
          default void log(String str){
              System.out.println("I1 logging::"+str);
          }
      }
      

      接口有一个默认类型,在被类调用时不需要重写/重新实现。

      1b。默认冲突 假设您有两个接口。第 1 部分中显示的内容,以及以下内容:

      public interface Interface2 {   
          default void log(String str){
              System.out.println("I2 logging::"+str);
          }
      }
      

      如果你在一个类中实现这两个接口,例如

          public class MyClass implements Interface1, Interface2 {
            ...//other implementations.
          @Override
          //Must override/provide implementation to avoid ambiguity
          public void log(String str){
              System.out.println("MyClass logging::"+str);
              Interface1.print("abc");
          }
      }
      

      您必须提供一个实现,以避免两个实现的接口发生冲突。

      2。静态类型 正如您所问的,您可以在接口中使用静态方法。从同一个article看这个样本

      public interface MyData {
      
          default void print(String str) {
              if (!isNull(str))
                  System.out.println("MyData Print::" + str);
          }
      
          static boolean isNull(String str) {
              System.out.println("Interface Null Check");
      
              return str == null ? true : "".equals(str) ? true : false;
          }
      }
      

      默认和静态方法之间的唯一区别是您不能覆盖静态方法。这是 Java 的核心原则。所以这个静态方法将在实现这个接口的类中保持原样。

      很多可以从JournalDev website找到

      【讨论】:

        猜你喜欢
        • 2018-11-06
        • 2011-05-10
        • 1970-01-01
        • 2018-02-19
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多