,我有以下的Java代码初始化实例变量都在父母和孩子
public class Base {
private static boolean goo = true;
protected static boolean foo() {
goo = !goo;
return goo;
}
public String bar = "Base:" + foo();
public static void main(String[] args) {
Base base = new Sub();
System.out.println(base.bar);
}
}
public class Sub extends Base {
public String bar = "Sub:" + foo();
}
而且我问是什么将打印。经过测试这个答案似乎是Base:false
,但我真的不明白为什么它不是Sub:true
。
其显示具有相同名称的两个变量的基础!一个打印的基地:假和其他预期(由我)子:真。的确foo()被调用两次,但每次实例化一个不同的变量?不应该在子类中创建具有相同名称的变量(并且在创建第一个后初始化)覆盖父类中的变量吗? Java如何选择打印哪一个?
'base'是Base'的'实例的引用,所以当你指的'基地。 goo',你实际上访问'Base.goo',而不是'Sub.goo'。请注意,如果您使用了'Base base = null;',它的工作原理是相同的。这就是为什么你不应该通过“通过实例”访问类的静态属性:你根本不使用实例。 –
@AndyTurner据我所知,我感兴趣的是'bar'变量,它是一个实例变量,同时在'Base'和'Sub'中。 – Nescio
好的。但是,基地。bar'指的是'Base'中的'bar',因为'base'是对'Base'的引用。 –