【问题标题】:How can I implement my own method when instantiating an interface?实例化接口时如何实现自己的方法?
【发布时间】:2014-01-31 23:50:52
【问题描述】:

我有一个界面:

public interface ExampleInterface {

  public void exampleMethod();

  public void anotherExampleMethod();

}

还有一个示例类:

public class ExampleClass implements ExampleInterface{


  public ExampleClass() {
    ........
  }

  public void exampleMethod() {
    ..............
  }

  public void anotherExampleMethod() {
    ..............
  }


  public void myOwnMethod() {
    ........
  }

}

我使用这样的接口实例化类:

ExampleInterface exampleClass = new ExampleClass();

这样做没问题:

exampleClass.exampleMethod();

但这不是:

exampleClass.myOwnMethod();

但是,这是可行的:

ExampleClass exampleClass = new ExampleClass();
exampleClass.myOwnMethod();

为什么当我使用接口实例化并尝试调用不属于该接口的方法时它不起作用?无论如何调用myOWnMethod(),同时仍然使用接口进行实例化?

【问题讨论】:

  • 阅读声明/静态类型与运行时/动态类型。以及如何解决方法调用。
  • 答案就在问题中:该方法不是接口的一部分,所以不能调用它,因为编译器无法知道该方法在对象上是否可用。

标签: java methods interface instantiation


【解决方案1】:

当你有一个ExampleInterface 类型的引用变量时,不知道它真的是一个ExampleClass,所以不能保证有一个myOwnMethod 可以调用。您可以创建另一个实现ExampleInterface 的类SillyExampleClass,但您没有在那里定义myOwnMethod 方法。这就是为什么你不能调用myOwnMethod,它在实际实现中可能不存在。

如果您想在ExampleInterface 接口的引用变量上调用myOwnMethod(),那么您在接口定义中包含myOwnMethod,因为接口定义指定了接口的任何实现中必须包含的内容。

【讨论】:

    【解决方案2】:

    假设您有一个接口Person,然后您在两个类中实现它:BoyGirl。如果你在Girl 类中有方法bePregnant(),当你这样做时:

    Person person = new Boy();
    

    在该对象中调用 bePregnant() 方法没有意义。但是,在调用不属于Person 接口的某些方法之前,有一种方法可以检查此人是否为Girl

    if (person instanceof Girl)
        ((Girl) person).bePregnant();
    

    首先,instanceof 用于检查一个对象是否是另一个类的实例(这个类也可以是该对象的超类)。那么 (SomeClass) 对象所做的就是casting。在您的情况下,您可以这样做:

    ExampleInterface exampleClass = new ExampleClass();
    ((ExampleClass) exampleClass).myOwnMethod();
    

    【讨论】:

      【解决方案3】:

      在这两个示例中,您都创建了一个 ExampleClass 的实例。但是在第一个示例中,您使用 ExampleInterface 类型的变量(没有方法 myOwnMethod)来引用它,而在第二个示例中,您使用 ExampleClass 类型的变量(确实有方法 myOwnMethod)来引用它! 如果您想在您的 ExampleInterface 上调用 myOwnMethod,您可以将其转换为 ExampleClass。

      ((ExampleClass) exampleInterface).myOwnMethod()
      

      如果您不确定 exampleInterface 所引用的对象实际上是 ExampleClass 类型,则不保存。否则你会得到一个 ClassCastException。

      【讨论】:

        猜你喜欢
        • 2015-11-11
        • 2016-10-04
        • 2014-03-12
        • 2017-08-21
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        相关资源
        最近更新 更多