我开始认为我不像我想的那样理解多态性。
我有以下情况:
public class Testing {
public static void main(String[] args){
interTest myTest = new classTest();
myTest.classMethod();
}
}
使用给定的界面:
public interface interTest {
public boolean checkBoolean();
public void method();
}
然后是具体的课程:
public class classTest implements interTest{
public classTest() {
// TODO Auto-generated constructor stub
}
public void classMethod(){
System.out.println("fail");
}
// Both method() and checkBoolean() are overridden here & do nothing.
}
}
Oracle文档演示了实现接口然后添加其他方法,甚至实现多个接口(因此包括不在其中一个接口中的方法),我认为这很常见,直到我遇到问题试图自己这样做。
在这种情况下,我无法访问classMethod
,因为它不在界面内。
The method classMethod() is undefined for the type interTest
我对多态性的理解是什么?我想在表单中声明一个变量:
Interface object = new ConcreteClass();
创建了一个可以访问ConcreteClass()方法的接口对象。这就是如何创建多个对象,这些对象都是相同的类型(接口),并且可以放在特定类型的列表中但是不同。
为什么我不能调用myTest.classMethod()
方法?
答案 0 :(得分:5)
在编译时,方法根据调用它们的表达式的类型来解析。
在
Interface object = new ConcreteClass();
object.classMethod();
对classMethod()
类型的变量调用方法Interface
,该变量未声明或具有名为classMethod()
的可见方法。
类型ConcreteClass
确实声明了这样的方法,所以你可以做
ConcreteClass object = new ConcreteClass();
object.classMethod();
甚至
((ConcreteClass) object).classMethod();
如果您确定object
引用了ConcreteClass
对象。否则,您将在运行时获得ClassCastException
。
基本上,您需要了解编译时类型与静态类型与运行时类型和动态类型之间的区别。
在
Interface object = new ConcreteClass();
object
的静态类型为Interface
。在运行时,该变量引用类型为ConcreteClass
的对象,因此其运行时类型为ConcreteClass
。