我有以下情况:
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。
如何更改B
和C
,使a
和aa
保持静态,仍然继承自A
,但可以有一组B
的值和C
的另一个值?
答案 0 :(得分:1)
简短的答案是你不能。通过声明它们static
,您基本上是在说“我只希望每个JVM一个此变量的实例”(或更准确地说:每个类加载器一个),从而删除指向该对象实例的任何链接。
此答案中有一个很好的解释:https://stackoverflow.com/a/797989/881976
答案 1 :(得分:0)
您在帖子“继承”中提到的词仅在创建实例变量而不是静态变量时适用。
因此,您需要做的第一件事是将静态变量更改为实例变量。只有这样,您才能创建B和C类的不同实例并拥有自己的值副本。
就像你写的一样,
“保持静态,仍然继承自A”
这纯粹是矛盾的。只要它们保持静态,就永远不会被继承。
答案 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);
}
}