代码之家  ›  专栏  ›  技术社区  ›  Wagner D. F.

不创建新实例的Java调用接口方法

  •  -1
  • Wagner D. F.  · 技术社区  · 7 年前

    接口是任何类都可以扩展的唯一类类型。但不幸的是,java开发人员(?)删除了重写接口静态方法的功能。有人知道我如何调用接口方法而不创建扩展它的类的新实例吗?

    2 回复  |  直到 4 年前
        1
  •  1
  •   user3382203    7 年前

    Java接口静态方法通过以下方式帮助我们提供安全性 不允许 实现类来覆盖它们。我们 无法定义接口静态方法 对于对象类方法,我们将得到编译器错误,因为此静态方法无法对对象隐藏实例方法。

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

        2
  •  1
  •   martinomburajr    7 年前

    接口本身不是类,而是抽象类型。 在Java 8中,您提到的“头脑简单”的Oracle开发人员确实允许 default static 接口中的类型。看看这个例子。从…起 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