我有一个界面:
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()
?
答案 0 :(得分:2)
如果您有ExampleInterface
类型的引用变量,则不知道它实际上是ExampleClass
,因此无法保证有myOwnMethod
来调用。您可以创建另一个实现SillyExampleClass
的类ExampleInterface
,但不要在那里定义myOwnMethod
方法。这就是为什么你不能打电话给myOwnMethod
,它可能不在实际实施中。
如果要在myOwnMethod()
接口的引用变量上调用ExampleInterface
,则在接口定义中包含myOwnMethod
,因为接口定义指定了任何实现中必须包含的内容界面。
答案 1 :(得分:1)
假设您有一个界面Person
,然后在两个类中实现它:Boy
和Girl
。如果您在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。