package com.juemuren.Error;
/** * static关键字的易错点 */class SuperClass{ static{ System.out.println("SuperClass init------"); } /** * 被static修饰的变量,变量的值经历了多次变化 * 类加载的准备阶段,为变量设置内存并设置初始值,value=0. * 初始化阶段:在静态代码块内赋值,直接赋值value=123。其顺序按照代码的顺序执行 */ public static int value=123;}class SubClass extends SuperClass{ static{ System.out.println("SubClass init======"); }//常量
public final static int age=110;}public class TestStaticDemo { public static void main(String[] args) { /** * 对于静态字段,只有直接定义的该字段的类才会被初始化。因此通过子类来访问父类的定义的静态字段,只会触发父类的初始化 * 输出的结果是:SuperClass init------ * 123 */ System.out.println(SubClass.value); /** * 不会对SubClass类进行初始化,在编译阶段通过常量传播优化,已经将值存储到TestStaticDemo常量池中了。 * 编译之后代码和System.out.println(110)是一样的。 */ System.out.println(SubClass.age); /** * 定义一个类的一维数组,并没有触发SubClass类以及父类的初始化 */ SubClass[] subClasses=new SubClass[10]; }}