如果我有一个抽象类,其中包含
形式的变量protected static final int blah;
protected static final int blah2;
我有两个扩展这个抽象类的类,并将这些变量设置为构造函数中的常量文件中的“static final int”值,它们会破坏彼此的值吗?如果我想做这样的事情,你会建议我做什么?
所以,例如,如果我有
impl1 class:
public impl1 extends absClass{
public impl1(){
this.blah = CONSTANTS.impl1_blah;
this.blah2 = CONSTANTS.impl1_blah2;
}
}
impl2 class:
public impl2 extends absClass{
public impl2(){
this.blah = CONSTANTS.impl2_blah;
this.blah2 = CONSTANTS.impl2_blah2;
}
}
这是允许的吗?如果没有,我该怎么办?
答案 0 :(得分:3)
this.blah = CONSTANTS.impl2_blah;
this.blah2 = CONSTANTS.impl2_blah;
这允许吗?
此不允许,因为您的blah
变量被声明为final
。您必须在类初始化期间初始化它们,无论是在它们的声明中还是在静态初始化程序块中。
此外,这些变量为static
,因此使用this
访问它们将不起作用:变量属于类而不是实例< / em>的
如果没有,我该怎么办?
在超类中使用非final变量,或在子类中使用特定常量。
答案 1 :(得分:1)
如果扩展该抽象类的类应该为这些变量赋予自己的值,那么你应该考虑使用一些受保护的抽象方法。
答案 2 :(得分:0)
static
个变量。这些将与您定义它们的类相关联。
答案 3 :(得分:0)
static final
个变量。这是在创建类(或任何子类)的任何实例之前。如果没有blah
和blah2
的某种初始化,您的代码将无法编译 - 初始化表达式:
protected static final int blah = 42;
protected static final int blah2 = 1;
或在静态初始化程序块中:
protected static final int blah;
protected static final int blah2;
static {
blah = 42;
blah2 = 1;
}
在任何一种情况下,子类都没有说明blah
和blah2
的分配。
从您的示例代码中可以看出,您希望常量可以基于每个实例而变化。它们是静态的没有意义。你可以这样做:
public AbsClass {
protected final int blah;
protected final int blah2;
protected AbsClass(int blah, int blah2) {
this.blah = blah;
this.blah2 = blah2;
}
. . .
}
public class Impl1 extends AbsClass {
public Impl1() {
super(CONSTANTS.impl1_blah, CONSTANTS.impl1_blah2);
}
}
public class Impl2 extends AbsClass {
public Impl1() {
super(CONSTANTS.impl2_blah, CONSTANTS.impl2_blah2);
}
}
答案 4 :(得分:0)
Java中的多态性不适用于属性。使用一些受保护的抽象getMethods()代替。
答案 5 :(得分:0)
首先这是final + static,这意味着与OOP无关,如果你让它们不是静态的,那么在它上面谈论OOP是有意义的。如果你不将它们作为私有使用并使用getter / setter访问它们,那么你就破坏了封装。
你正在使它成为最终,意味着它只能被初始化一次。当您尝试更改final attr的值时,您将获得异常。