抽象类java中的静态变量
如果我有一个抽象类,它有如下形式的变量
protected static final int blah;
protected static final int blah2;
我有两个类扩展了这个抽象类,在它们的构造函数中将这些变量设置为常量文件中的“static final int”值,它们会互相碰撞吗?如果我想做这样的事,你会推荐我做什么
例如,如果我有
IMP1类:
public impl1 extends absClass{
public impl1(){
this.blah = CONSTANTS.impl1_blah;
this.blah2 = CONSTANTS.impl1_blah2;
}
}
impl2类:
public impl2 extends absClass{
public impl2(){
this.blah = CONSTANTS.impl2_blah;
this.blah2 = CONSTANTS.impl2_blah2;
}
}
允许这样做吗?如果没有,我该怎么办
# 1 楼答案
这是不允许的,因为
blah
变量被声明为final
。在类初始化期间,必须在它们的声明或静态初始值设定项块中初始化它们此外,这些变量是
static
,因此使用this
访问它们将不起作用:这些变量属于类,而不是实例在超类中使用非最终变量,或在子类中使用特定常量
# 2 楼答案
static final
变量必须在声明它们的类初始化时初始化。这是在创建类(或任何子类)的任何实例之前。如果没有对blah
和blah2
进行某种初始化,您的代码将无法编译-初始化表达式:或者在静态初始值设定项块中:
在这两种情况下,子类对
blah
和blah2
分配的内容没有发言权从您的示例代码中可以看出,您希望常量可以根据每个实例而变化。它们是静态的是没有意义的。你可以这样做:
# 3 楼答案
如果扩展抽象类的类应该为这些变量提供自己的值,那么应该考虑两种受保护的抽象方法。p>
# 4 楼答案
首先,这是final+static,这与OOP无关,如果你让它们不是静态的,那么在上面讨论OOP是有意义的。如果您不将它们作为私有的,并使用getter/setter访问它们,那么您就是在破坏封装
你把它变成最终的,这意味着它只能初始化一次。当您试图更改final attr的值时,将出现异常
# 5 楼答案
Java中的多态性不适用于属性。改为使用一些受保护的抽象getMethods()
# 6 楼答案
static
无法重写变量。这些将与您定义它们的类相关联