Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用子类名称访问父类静态字段不需要';你不给孩子上课吗?_Java_Inheritance_Static - Fatal编程技术网

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