美文网首页
类加载机制(二)

类加载机制(二)

作者: guozhk | 来源:发表于2018-09-07 11:21 被阅读0次

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

    类的主动引用(会初始化)
    • 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
    

    相关文章

      网友评论

          本文标题:类加载机制(二)

          本文链接:https://www.haomeiwen.com/subject/ikzqgftx.html