簡體   English   中英

奇怪的行為擴展了抽象類(練習)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM