类加载机制(二)

加载机制系列
类加载机制(一)
类加载机制(二)
类加载机制(三)
类的加载全过程中的主动引用与被动引用

类的主动引用(会初始化)
  • new 一个类的对象
  • 调用类的静态成员(除了final修饰的常量)和静态方法
  • 使用java.lang.reflect包的反射调用
  • 虚拟机启动main方法所在的类
  • 当调用一个类时候,如果其父类没有被初始化则先初始化其父类
类的被动引用(不会初始化)
  • 当访问一个静态域时,只有真正生命这个域的类才会被初始化,如:通过子类引用父类的静态变量时候,不会导致子类初始化
  • 通过数组定义类引用 不会被初始化
  • 引用常量不会触发此类的初始化 (常量在编译阶段已存入调用该类的常量池中了)

Demo


public class Demo01 {

    static {
        System.out.println("静态初始化类Demo01");
    }

    public static void main(String[] args) {
        System.out.println("Demo01的main() 方法");
        A a = new A();
        System.out.println(A.width);

    }

}

class A_Father {

    public static int father_width=10;
    
    public final static int father_final_test=333;
    
    
    
    
    static {
        System.out.println("静态初始化类A_father");

    }
}

class A extends A_Father {

    public static int width = 100;

    static {

        System.out.println("静态初始化类A");
        width = 300;
    }

    public A() {
        System.out.println("创建A对象");
    }

}

结果:
先初始化A的父类 A_Father

静态初始化类Demo01
Demo01的main() 方法
静态初始化类A_father
静态初始化类A
创建A对象
300

修改main方法

public static void main(String[] args) {
//      System.out.println("Demo01的main() 方法");
//      A a = new A();
        //调用A的静态域
        System.out.println(A.width);

    }

结果:A类被加载初始化

静态初始化类Demo01
静态初始化类A_father
静态初始化类A
300

再次修改直接用反射调用

public static void main(String[] args) throws Exception{
//      System.out.println("Demo01的main() 方法");
//      A a = new A();
        
        //调用A的静态域
        //System.out.println(A.width);
        
        //反射调用
        Class.forName("com.org.test.init.A");
    }

结果:A类被加载初始化

静态初始化类Demo01
静态初始化类A_father
静态初始化类A

调用常量:

public static void main(String[] args) throws Exception{
//      System.out.println("Demo01的main() 方法");
//      A a = new A();
        
        //调用A的静态域
        //System.out.println(A.width);
        
        //反射调用
        //Class.forName("com.org.test.init.A");
        //调用常量
        System.out.println(A_Father.father_final_test);
        
    }

结果:类没有加载初始化

静态初始化类Demo01
333

调用父类静态域


    public static void main(String[] args) throws Exception{
//      System.out.println("Demo01的main() 方法");
//      A a = new A();
        
        //调用A的静态域
        //System.out.println(A.width);
        
        //反射调用
        //Class.forName("com.org.test.init.A");
        //调用常量
        //System.out.println(A_Father.father_final_test);
        
        //调用父类静态变量
        System.out.println(A_Father.father_width);
                
        
    }

结果:只有父类被加载初始化

静态初始化类Demo01
静态初始化类A_father
10

数组引用:

public static void main(String[] args) throws Exception{
//      System.out.println("Demo01的main() 方法");
//      A a = new A();
        
        //调用A的静态域
        //System.out.println(A.width);
        
        //反射调用
        //Class.forName("com.org.test.init.A");
        //调用常量
        //System.out.println(A_Father.father_final_test);
        
        //调用父类静态变量
        //System.out.println(A_Father.father_width);
        
        //数组变量引用
        A[] as= new A[10];
                
        
    }

结果:类不会被加载

静态初始化类Demo01

你可能感兴趣的:(类加载机制(二))