2 flyingzhlunasea FlyingZhLunasea 于 2017.08.29 20:37 提问

测试类通过子类调用父类的静态属性,为什么子类没有初始化?
public class SuperClass {
    static{
        System.out.println("superclass init");
    }

    public static int value = 123;

}

 public class SubClass extends SuperClass{

    static{
        System.out.println("subclass init");
    }

}

public class Client {

    public static void main(String[] args) {
        System.out.println(SubClass.value);
    }
}

上面这段代码运行之后只会输出 “superclass init”,并不会输出“subclass init”,
也就是只触发了父类的初始化,并没有触发子类的初始化,由于对类加载机制不太了解,,望大神解惑

5个回答

zy841958835
zy841958835   Ds   Rxr 2017.08.30 08:31

跟你前面的是一个问题:
根据think in java里面的讲法 For static fields, only the classes that define this field are initialized 说的是SubClass.value这个value值是
SubClass的父类的 所以只会去初始化SubClass的父类 不然 工程里面所有的静态关键字都要转载进jvm 有点低效率

chenbaige
chenbaige   Rxr 2017.08.29 22:44

你的value不是静态变量,怎么可以用SubClass直接.出来??还有用static的是静态代码块,在类加载的时候就会被调用。程序没错的话,都会被调用。

FlyingZhLunasea
FlyingZhLunasea value是一个静态的,忘记改了
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea http://ask.csdn.net/questions/653375
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea 这个错了,点快了,在另外一个问答,不好意思
3 个月之前 回复
xy1131975903
xy1131975903   2017.08.30 00:59

代码能跑通?value使用出错

FlyingZhLunasea
FlyingZhLunasea value是一个静态的,忘记改了
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea http://ask.csdn.net/questions/653375
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea 这个错了,点快了,在另外一个问答,不好意思
3 个月之前 回复
SeaTalks
SeaTalks   2017.08.30 01:43

静态代码块不是初始化函数,它不是创建对象时调用的,而是在类加载时调用的。另外,value不是静态的。如果它是静态的,而且最后只输出“superclass xxx”,说明JVM只加载父类,没有加载子类。我认为这跟JVM的实现有关。

FlyingZhLunasea
FlyingZhLunasea value是一个静态的,忘记改了
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea http://ask.csdn.net/questions/653375
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea 这个错了,点快了,在另外一个问答,不好意思
3 个月之前 回复
u010983763
u010983763   2017.08.30 08:40

静态代码块跟初始化完全两个概念!!!

FlyingZhLunasea
FlyingZhLunasea http://ask.csdn.net/questions/653375
3 个月之前 回复
FlyingZhLunasea
FlyingZhLunasea 这个错了,点快了,在另外一个问答
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片