在实例化接口时如何实现自己的方法?

时间:2014-01-31 23:50:52

标签: java methods interface instantiation

我有一个界面:

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()

3 个答案:

答案 0 :(得分:2)

如果您有ExampleInterface类型的引用变量,则不知道它实际上是ExampleClass,因此无法保证有myOwnMethod来调用。您可以创建另一个实现SillyExampleClass的类ExampleInterface,但不要在那里定义myOwnMethod方法。这就是为什么你不能打电话给myOwnMethod,它可能不在实际实施中。

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

答案 1 :(得分:1)

假设您有一个界面Person,然后在两个类中实现它:BoyGirl。如果您在bePregnant()课程中使用方法Girl,则执行以下操作:

Person person = new Boy();

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

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

首先,instanceof用于检查对象是否是另一个类的实例(此类也可以是对象的超类)。那么(SomeClass)对象的作用是什么,称为强制转换。在你的情况下,你可以这样做:

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

答案 2 :(得分:0)

在这两个示例中,您将创建ExampleClass的实例。但是在第一个例子中,你用一个类型为ExampleInterface的变量引用它(它没有方法myOwnMethod),你在第二个例子中用一个类型为ExampleClass的变量引用它(它有一个方法myOwnMethod)! 如果要在ExampleInterface上调用myOwnMethod,可以将其强制转换为ExampleClass。

((ExampleClass) exampleInterface).myOwnMethod()

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