有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

抽象类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;
    }
}

允许这样做吗?如果没有,我该怎么办


共 (6) 个答案

  1. # 1 楼答案

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

    this allowed?

    这是不允许的,因为blah变量被声明为final。在类初始化期间,必须在它们的声明或静态初始值设定项块中初始化它们

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

    If not, what should I do?

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

  2. # 2 楼答案

    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);
        }
    }
    
  3. # 3 楼答案

    如果扩展抽象类的类应该为这些变量提供自己的值,那么应该考虑两种受保护的抽象方法。p>

  4. # 4 楼答案

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

    你把它变成最终的,这意味着它只能初始化一次。当您试图更改final attr的值时,将出现异常

  5. # 5 楼答案

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

  6. # 6 楼答案

    static无法重写变量。这些将与您定义它们的类相关联