发布网友 发布时间:2022-04-24 04:46
共5个回答
热心网友 时间:2023-08-07 03:34
jvm lazy load class 机制, 下列情况会初始化类
1、T is a class and an instance of T is created.
2、T is a class and a static method declared by T is invoked.
3、A static field declared by T is assigned.
4、A static field declared by T is used and the field is not a constant variable
References to compile-time constants must be resolved at compile time to a copy of the compile-time constant value, so uses of such a field never cause initialization.
你关心的问题:因满足第四条,故初始化类,因此会执行静态块
注意:不要与第三条混了,自己理解吧
~~
现在流行研究这些东西?? 真奇怪,实际中用的很少,几乎不会遇到这种东西
=====================
你没仔细看上面的条件,只想知道结果..........
第四条说的很明白了.........
T中声明了一个静态字段,当使用它时,但它的值不是常量时,会初始化类!!!!
~如果初始化类,则会执行静态块,会输出Test2 was Initialized
~如果不初始化类,则不会执行静态块,则不会输出Test1 was Initialized
热心网友 时间:2023-08-07 03:34
我的理解:
1、静态块,是类构造的时候初始化,比如你,new Test1()就会调用static块;、
2、System.out.println(Test1.a);输出是3,没有问题;
3、System.out.println(Test2.a);之所以会输出Test2 was Initialized,本人的理解是(int)Math.random();导致的,但是具体的原因还不太清楚,估计可能是因为这个会导致类构造(临时构造导致的),你可以把它改成public static final int a=4;你会发现,不会输出Test2 was Initialized了!
上面就是俺的理解
热心网友 时间:2023-08-07 03:35
wyg_vip同志乱讲。
List是一个接口,如user_pyw所讲,不能直接new List,而应该使用ArrayList或者LinkedList(这些实现了List接口),如 List l = new LinkedList();。你的l直接就是等于null,在调用l.add()不就是一个空指针吗?
List作为模板调用,可以使用List<String> l = new LinkedList<String>();,如果你确定里边都会加入String的东西,这样会更快,取出来的时候不用再转换为String对象或者使用toString方法。List中的对象本身不是String类型的,而是Object类型的(wyg_vip不要误导人家),你可以加入各种类型,可以放一个List进去,一个Map进去,一个String、Integer、你自己定义的Class进去都行,如果指定了模板类型就只能插入对应的对象,否则什么对象都可以放进去。
wyg_vip有一句说的正确,就是“学Java多看官方的文档”。
热心网友 时间:2023-08-07 03:35
当一个类在运行时被类加载器加载时,类的静态块的内容将被执行。从结果看,Test2类被加载了,而Test1没有。
因为Test1里面a的赋值是在编译时就被付好的。而Test2里面的a则因为调用了Math.random(),编译时不能直接赋值,要等到运行时。
这涉及java虚拟机的一些加载规则.
热心网友 时间:2023-08-07 03:36
我是路过的,起奇怪的是为什么Test1 was Initialized 这一句没有输出来,谁能帮忙解答下