当一个字段是静态的还是不属于抽象类时,它有什么区别吗?

时间:2014-01-12 13:23:06

标签: java

public abstract class Test {

    private static int value = 100;

}

public abstract class Test {

    private int value = 100;

}

由于Testabstract,因此无法对其进行实例化,因此valuestatic是否static不会有任何区别,对吗?

当字段为{{1}}时,是否存在任何差异,当它属于抽象类时?

3 个答案:

答案 0 :(得分:2)

是的,有。即使你的类是抽象的,它也可以使用非抽象的非静态方法处理非静态私有字段。它有时很有用。

Dummy 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);
}

现在您可以在checkMyInt()中填写任何逻辑并移交声明为MyInt的实例

pastebin exaplme

PS:这可能不是最好的解决方案,我会在这里使用接口,但作为一个例子,我希望

答案 1 :(得分:1)

抽象类无法直接实例化。但是抽象类的重点是要实例化的子类:

public abstract class Test
    protected int value;
}

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

在上面的示例中,TestImpl的每个实例(以及Test的每个实例)都有自己的值。对于静态字段,该字段的范围限定为Test类,并由所有实例共享。

静态和非静态字段之间的差异因此与任何其他非抽象类完全相同。

答案 2 :(得分:0)

抽象类是一个普通(基础)类,只是被声明为缺少某些东西,比如抽象方法。

所以确实存在差异。