Java 使用子类名称访问父类静态字段不需要';你不给孩子上课吗?
产出是:Java 使用子类名称访问父类静态字段不需要';你不给孩子上课吗?,java,inheritance,static,Java,Inheritance,Static,产出是: class A { static int super_var = 1; static { System.out.println("super"); } } class B extends A { static int sub_var = 2; static { System.out.println("sub"); } } public class Demo{ public static v
class A {
static int super_var = 1;
static {
System.out.println("super");
}
}
class B extends A {
static int sub_var = 2;
static {
System.out.println("sub");
}
}
public class Demo{
public static void main(String []args){
System.out.println(B.super_var);
}
}
这意味着子类不会加载或其他任何东西?它是如何工作的?当您在子类引用上访问一个超类的
静态
字段时,只有声明该字段的类才会被加载和初始化,在这种情况下,它是a
。具体规定如下:
引用静态字段(§8.3.1.1)只会导致初始化
实际声明它的类或接口,,即使它可能
通过子类、子接口或
实现接口的类
我的
因此,在您的代码中,类B
甚至不会被初始化,因此它的静态
块将不会被执行。检查此问题的答案:
只有在访问类时(创建实例或访问成员字段或静态方法),才会调用静态块。但是,您只访问类a的成员,因此还没有理由初始化类B。只要您从该类(字段或静态方法,或从类B创建实例)访问成员,就会调用B的静态初始值设定项
原因是类B不需要初始化,直到您访问它的一个成员。因为A不知道B(并且不能访问它),所以B没有理由在那个阶段初始化
您将发现,当您访问B.sub_var时,将执行B的静态初始值设定项。我不理解您的问题。你期望得到什么输出?@RohitJain我想B
的静态初始化器应该被调用。@boris是的,这就是我期望的
super
1