Sivanx

static易错点

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];
    }
}

posted on 2017-04-10 19:10  Sivanx  阅读(127)  评论(0编辑  收藏  举报

导航