public abstract class Test {
private static int value = 100;
}
public abstract class Test {
private int value = 100;
}
由於Test
是abstract
,它不能被實例化,所以並沒有任何區別value
是否static
與否,對不對?
是否有任意當字段爲static
時有區別還是屬於抽象類?
public abstract class Test {
private static int value = 100;
}
public abstract class Test {
private int value = 100;
}
由於Test
是abstract
,它不能被實例化,所以並沒有任何區別value
是否static
與否,對不對?
是否有任意當字段爲static
時有區別還是屬於抽象類?
是的,有。即使你的類是抽象的,它也可以有非靜態的非靜態私有字段的非靜態方法。有時候它是有用的。
假的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
PS實例:這可能是心不是最好的解決辦法我會在這裏使用接口,但作爲一個例子,它是足夠的,我希望
抽象類是一個普通(基類)類,只是宣佈缺少一些東西,比如抽象方法。
所以有一定的差異。
抽象類不能直接實例化。但抽象類的整點是具有被實例化的子類:
public abstract class Test
protected int value;
}
public class TestImpl extends Test {
public TestImpl(int value) {
this.value = value;
}
}
在上述例子中,TestImpl的每個實例(並因此試驗)具有其自身的價值。使用靜態字段,該字段的作用域爲Test類,並由所有實例共享。
靜態和非靜態字段之間的差異因此完全相同於任何其他非抽象類。
是的,但是在這裏你使用'protected'字段,這些字段在處理抽象類時非常正常,我認爲這個問題是關於'private'字段的。 – kajacx
這是相同的,如果該字段是私人的。每個實例都會有自己的價值。它只會被基類中定義的方法讀取/修改,就這些了。 OP公佈的兩個例子都太簡單了:定義一個專用字段是沒有意義的,抽象與否是永不讀寫的。 –
我刪除了我的初步評論,因爲我發佈後發佈兩個字段聲明私人和[私人領域不會被繼承](http://stackoverflow.com/questions/6543328/private-members-in-java-inheritance) - 所以我最初的評論在這個問題上是錯誤的。無論如何,抽象類中定義的方法都有權訪問此字段。雖然靜態字段只能在靜態上下文中訪問 - 而靜態方法不會繼承到子類。在非靜態上下文中訪問靜態字段時,編譯器會給出適當的警告。 –