抽象类java中的静态变量

时间:2012-09-24 17:55:50

标签: java class static

如果我有一个抽象类,其中包含

形式的变量
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;
    }
}

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

6 个答案:

答案 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个变量。这是在创建类(或任何子类)的任何实例之前。如果没有blahblah2的某种初始化,您的代码将无法编译 - 初始化表达式:

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

在任何一种情况下,子类都没有说明blahblah2的分配。

从您的示例代码中可以看出,您希望常量可以基于每个实例而变化。它们是静态的没有意义。你可以这样做:

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的值时,您将获得异常。