【问题标题】:Java interface implementation?Java接口实现?
【发布时间】:2018-08-08 04:02:21
【问题描述】:

我是 Java 新手。请问下面的接口例子有什么不同?

public interface MyInterface {
  public void doSomething();
}

喜欢这个

public class MyClass implements MyInterface {
   public void doSomething {....}
}

还有这个

public class MyClass implements MyInterface {
    protected MyInterface myInterface;

public MyClass (MyInterface myInterface) {
    this.myInterface = myInterface;
  }

public void doSomething () {
    myInterface.doSomething();
  }
}

【问题讨论】:

  • 为什么要采用第二种方式?您将如何创建 MyInterface 以传递给您的构造函数?有什么好处?
  • 接口可以有多种实现。因此可以在运行时获得不同的实现调用

标签: java interface implements


【解决方案1】:

在第一种情况下,您使用一个类实现一个接口,并在该类中实现函数doSomething。你可以通过创建类MyClass的实例来调用doSomething函数

MyInterface obj = new MyClass();
obj.doSomething();

在第二种情况下,您甚至无法实例化 MyClass 的实例,因为它需要另一个 it-self 实例或另一个实现该接口的类。

【讨论】:

    【解决方案2】:
    public class MyClass implements MyInterface {
       public void doSomething {....}
    }
    

    MyClass 实现了 MyInterface 接口。这意味着您的类拥有您的接口承诺的具体行为。通过实现接口,您的类保证 MyClass 具有您的接口在其声明中抽象的具体功能。

    但我怀疑您可能没有实现接口以及在类中创建接口实例的真实场景。您问题的第二部分是inheritance vs composition 最著名的设计主题之一。同时使用接口的继承和组合的机会很少见。

    【讨论】:

    • 我不是英语母语,我需要更多时间来理解这些答案。非常感谢!
    【解决方案3】:

    前两个代码是一个接口和另一个实现该接口的类。 第三个代码是 MyClass,它实现了 MyInterface 并创建了一个名为 myInterface 的对 MyInterface 的对象引用。下一部分

     public MyClass (MyInterface myInterface) {
      this.myInterface = myInterface;
     }
    

    是一个简单的构造函数和下一部分

    public void doSomething () {
    myInterface.doSomething();
    }
    

    正在调用一个方法。

    【讨论】:

      【解决方案4】:

      第一个是继承,第二个是组合。继承是一种“is-a”关系,而组合是一种“has-a”关系。

      例如,如果有一个Pressable 接口代表所有可以按下的东西,ButtonCheckbox 应该实现它。如果有Color类,则ButtonColor之间应该有组合关系,因为Button应该有颜色,但Button不是Color的类型。

      一个众所周知的错误是java.util.Stack。由于Stack 不是java.util.VectorStack 不应继承Vector

      【讨论】:

        【解决方案5】:

        接口是 Java 中的一种抽象类型,它指定了类必须实现的一组抽象方法。一个类通常实现接口,如您的第一个示例所示。

        在您的第二个示例中,即使 MyClass 正在实现接口,doSomething 方法的行为将取决于实例化 MyClass 对象时将获得的 MyInterface 实现的实例。

        无法实例化接口。您将不得不执行以下操作。这里 MySecondClass 实现了 MyInterface。

         MyClass m = new MyClass(new MyInterface()
          {
        
            @Override
            public void doSomething()
            {
              // TODO Auto-generated method stub
        
            }
          });
        
           MyClass m2 = new MyClass(new MySecondClass());
          }
        

        【讨论】:

          猜你喜欢
          • 2015-11-08
          • 2017-10-21
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 2011-03-19
          • 2012-03-20
          • 2012-11-27
          • 2021-09-01
          相关资源
          最近更新 更多