1

如果我有一个具有形式变量的抽象类

protected static final int blah;
protected static final int blah2;

我有两个扩展这个抽象类的类,并将这些变量设置为它们构造函数中常量文件中的“静态最终 int”值,它们会破坏彼此的值吗?如果我想做这样的事情,你会建议我做什么?

所以,例如,如果我有

impl1 类:

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

这是允许的吗?如果没有,我该怎么办?

4

6 回答 6

3
this.blah = CONSTANTS.impl2_blah;
this.blah2 = CONSTANTS.impl2_blah;

这允许吗?

不允许的,因为您的blah变量被声明为final. 您必须在类初始化期间对它们进行初始化,无论是在它们的声明中还是在静态初始化块中。

此外,这些变量是static,因此使用它们访问它们this将不起作用:变量属于而不是实例

如果没有,我该怎么办?

在超类中使用非最终变量,或在子类中使用特定常量。

于 2012-09-24T17:59:45.340 回答
1

如果扩展该抽象类的类应该为这些变量提供自己的值,那么您应该考虑使用几个受保护的抽象方法。

于 2012-09-24T18:09:48.473 回答
0

Java 中的多态性不适用于属性。请改用一些受保护的抽象 getMethods()。

于 2012-09-24T18:23:39.120 回答
0

static final变量必须在声明它们的类被初始化时被初始化。这是在创建类(或任何子类)的任何实例之前。blah如果没有对and进行某种初始化,您的代码将无法编译 - 无论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);
    }
}
于 2012-09-24T18:00:28.057 回答
0

首先这是final+static,这意味着与OOP无关,如果你让它们不是静态的,那么在上面谈论OOP是有意义的。如果您不将它们设为私有并使用 getter/setter 访问它们,那么您正在破坏封装。

而你正在使它成为最终的,这意味着它只能被初始化一次。当您尝试更改 final attr 的值时,您将得到异常。

于 2012-09-24T19:44:32.223 回答
0

static变量不能被覆盖。这些将与您定义它们的类相关联。

于 2012-09-24T17:57:01.380 回答