2014-01-12 19 views

回答

2

是的,有。即使你的類是抽象的,它也可以有非靜態的非靜態私有字段的非靜態方法。有時候它是有用的。

假的exaple:

考慮以下幾點:要保持一個整數,讓每個人都有能力改變它,但你不希望他們設置負值或數值更大然後15,但條件每個人都不知道(一般),所以你想確保當有人設置incorect值,它會自動修復。

這裏是一個可能的解決方案:

abstract class MyInt { 

    private int myInt; 

    public int getMyInt() { 
     return myInt; 
    } 

    public void setMyInt(int i) { 
     myInt = checkMyInt(i); 
    } 

    protected abstract int checkMyInt(int i); 
} 

現在你可以inplement任何邏輯checkMyInt(),交出聲明MyInt

pastebin exaplme

PS實例:這可能是心不是最好的解決辦法我會在這裏使用接口,但作爲一個例子,它是足夠的,我希望

0

抽象類是一個普通(基類)類,只是宣佈缺少一些東西,比如抽象方法。

所以有一定的差異。

1

抽象類不能直接實例化。但抽象類的整點是具有被實例化的子類:

public abstract class Test 
    protected int value; 
} 

public class TestImpl extends Test { 
    public TestImpl(int value) { 
     this.value = value; 
    } 
} 

在上述例子中,TestImpl的每個實例(並因此試驗)具有其自身的價值。使用靜態字段,該字段的作用域爲Test類,並由所有實例共享。

靜態和非靜態字段之間的差異因此完全相同於任何其他非抽象類。

+0

是的,但是在這裏你使用'protected'字段,這些字段在處理抽象類時非常正常,我認爲這個問題是關於'private'字段的。 – kajacx

+0

這是相同的,如果該字段是私人的。每個實例都會有自己的價值。它只會被基類中定義的方法讀取/修改,就這些了。 OP公佈的兩個例子都太簡單了:定義一個專用字段是沒有意義的,抽象與否是永不讀寫的。 –

+0

我刪除了我的初步評論,因爲我發佈後發佈兩個字段聲明私人和[私人領域不會被繼承](http://stackoverflow.com/questions/6543328/private-members-in-java-inheritance) - 所以我最初的評論在這個問題上是錯誤的。無論如何,抽象類中定義的方法都有權訪問此字段。雖然靜態字段只能在靜態上下文中訪問 - 而靜態方法不會繼承到子類。在非靜態上下文中訪問靜態字段時,編譯器會給出適當的警告。 –

相關問題