[英]Unable to implement methods from a class that implements an interface?
我開始認為我不像我以前那樣理解多態。
我有以下情況:
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()
方法?
在編譯時,基於調用方法的表達式的類型來解析方法。
在
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.