如何仅更改Java派生类中的静态字段

时间:2018-10-26 08:19:34

标签: java

我有以下情况:

class A {
    static int a, aa;
    A(int x, int y) {
        a = x;
        aa = y;
    }
}

class B extends A {
    B() {
        super(2, 3);
    }
}

class C extends A {
    C() {
        super(3, 4);
    }
}

class Test {
    public static void main(String[] args) {
        B b = new B();
        C c = new C();
    }
}

当然,现在B.a是3,B.aa是4。

如何更改BC,使aaa保持静态,仍然继承自A,但可以有一组B的值和C的另一个值?

3 个答案:

答案 0 :(得分:1)

简短的答案是你不能。通过声明它们static,您基本上是在说“我只希望每个JVM一个此变量的实例”(或更准确地说:每个类加载器一个),从而删除指向该对象实例的任何链接。

此答案中有一个很好的解释:https://stackoverflow.com/a/797989/881976

答案 1 :(得分:0)

您在帖子“继承”中提到的词仅在创建实例变量而不是静态变量时适用。

因此,您需要做的第一件事是将静态变量更改为实例变量。只有这样,您才能创建B和C类的不同实例并拥有自己的值副本。

就像你写的一样,

  
    

“保持静态,仍然继承自A”

  

这纯粹是矛盾的。只要它们保持静态,就永远不会被继承。

看看这个答案。 Static vs Instance Variables: Difference?

答案 2 :(得分:0)

无法调用super(3,4)或super(2,3),因为这些类中没有该构造函数。

如果您调用super,则可以为该类的变量设置值。 像super(2,3)会为A设置值,现在对于类B,您可以在字段上进行任何操作。 总体上,我不确定该问题是否有效。 这是可以做的很好的事情,似乎没有用:

public class A {

 static int a, aa;
 A(){
     System.out.println("aa");
 }
    A(int i,int j) {

        this.a = i;
        this.aa = j;

    }
}

class B extends A {

    B(int i,int j) {
        super(i, j);
        this.a=i+1;
        this.aa=j+1;
        System.out.println("in b="+a+" "+aa);
    }
}

公共课程测试{     公共静态void main(String [] args){

        A a = new A(1,2);
         B b = new B(2,3);

    }

}