public abstract class Test {
private static int value = 100;
}
和
public abstract class Test {
private int value = 100;
}
由于Test
为abstract
,因此无法对其进行实例化,因此value
是static
是否static
不会有任何区别,对吗?
当字段为{{1}}时,是否存在任何差异,当它属于抽象类时?
答案 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
的实例
答案 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)
抽象类是一个普通(基础)类,只是被声明为缺少某些东西,比如抽象方法。
所以确实存在差异。