[英]Strange behaviour extending abstract class (exercise)
我正在學習Java SE 7認證考試,並且正在做一些關於繼承和訪問修飾符的無聊練習。
但是現在我遇到了應用繼承的意外行為。 在我的基本包com.testpkg
我有一個抽象類:
package com.testpkg;
public abstract class Abstract {
public int test();
}
注意 ,我自願省略了test()
方法的abstract
修飾符。
然后我在com.testpkg.sub
包中有一個擴展Abstract
的具體類:
package com.testpkg.sub;
public class Concrete extends Abstract {
public int test() {
return 0;
}
}
我使用以下方法測試此類:
package com.testpkg;
import com.testpkg.sub.Concrete;
public class TestMain {
public static void main(String[] args) {
Abstract c = new Concrete();
System.out.println(c.test());
}
}
如果我嘗試對此進行編譯,顯然會得到兩個錯誤:
The method test() requires a body instead of a semicolon
但是,如果我運行測試類: 0
將打印在控制台上!
這對我來說似乎很奇怪。 您能解釋一下為什么即使在Abstract
類中錯誤聲明了test()
代碼仍能正常工作的原因嗎?
注意我正在使用Eclipse IDE編譯/運行我的代碼。
您需要在test()
方法上使用abstract
限定符。 您可能正在運行舊的類文件。 如果將return語句的值更改為0以外的值,您將看到它沒有運行此代碼。
Eclipse允許您運行“半熟”代碼。 它在這里運行良好的原因是,在運行時,您從不真正依賴Abstract
類的細節,因此,如果其中包含這種類型的編譯錯誤,則實際上並不重要。
您的類Abstract
具有編譯錯誤,因為應該定義非抽象方法,所以它應該具有主體。 僅在接口的情況下, abstract
限定符才是可選的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.