• java 中类的加载顺序


    参考: http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html

     1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
     2、只有在调用new方法时才会创建类的实例
     3、类实例销毁时候,首先销毁子类部分,再销毁父类部分

    package com.xiaofan.class_initialization;
    
    public class Parent
    {
        public static int i = initializationParentStaticField(); // 静态成员变量
        int j = initializationParentField(); // 类成员变量
        
        public static int initializationParentStaticField(){
            System.out.println("父类静态成员变量");
            return -1;
        }
        
        public int initializationParentField() {
            System.out.println("父类类成员变量");
            return -1;
        }
    
        {
            System.out.println("父类非静态代码块");
        }
        
        static
        {
            System.out.println("父类静态代码块");
        }
        
        public Parent()
        {
            System.out.println("父类的构造方法");
        }
        
        public static int parentStaticMethod()
        {
            System.out.println("父类的静态方法");
            return -1;
        }
        public int parentMethod(){
            System.out.println("父类的非静态方法");
            return -1;
        }
        
        @Override
        protected void finalize() throws Throwable
        {
            super.finalize();
            System.out.println("销毁父类");
        }
        
    }
    package com.xiaofan.class_initialization;
    
    public class Child extends Parent
    {
        public static int i = initializationChildStaticField(); // 静态成员变量
        int j = initializationChiledField(); // 类成员变量
        
        public static int initializationChildStaticField(){
            System.out.println("子类静态成员变量");
            return 0;
        }
        
        public int initializationChiledField() {
            System.out.println("子类类成员变量");
            return 0;
        }
        {
            System.out.println("子类非静态代码块");
        }
        static
        {
            System.out.println("子类静态代码块");
        }
        public Child()
        {
            System.out.println("子类的构造方法");
        }
       
        public static int childStaticMethod()
        {
            System.out.println("子类的静态方法");
            return 0;
        }
        public int childMethod(){
            System.out.println("子类的非静态方法");
            return 0;
        }
        @Override
        protected void finalize() throws Throwable
        {
            super.finalize();
            System.out.println("销毁子类");
        }
    }
    package com.xiaofan.class_initialization;
    
    public class TestMain
    {
       
        public static void main(String[] args)
        {
            Parent.parentStaticMethod();
    //        Child child = new Child();
    //        Child.childStaticMethod();
        }
    
    }

    输出:

    Parent.parentStaticMethod();

    类中static 方法在第一次调用时加载,类中static成员按在类中出现的顺序加载。

    父类静态成员变量
    父类静态代码块
    父类的静态方法

    注释掉Parent.parentStaticMethod();

    去掉注释Child child = new Child();

    父类静态成员变量
    父类静态代码块
    子类静态成员变量
    子类静态代码块
    父类类成员变量
    父类非静态代码块
    父类的构造方法
    子类类成员变量
    子类非静态代码块
    子类的构造方法

    注释掉Child child = new Child();

    去掉注释Child.childStaticMethod();

    父类静态成员变量
    父类静态代码块
    子类静态成员变量
    子类静态代码块
    子类的静态方法

    总结:

    一个类,只调用其static方法,加载顺序:
        1.静态成员变量
        2.静态代码块: static {}
        3.被调用的静态方法
     
    子类继承父类,new子类,加载顺序:
        1.父类的静态成员变量
        2.父类的静态代码块: static {}
        3.子类的静态成员变量
        4.子类静态代码块: static {}
        5.父类类成员变量
        6.父类非静态初始化块 {}
        7.父类的构造方法
        8.子类类成员变量
        9.子类非静态代码块 {}
        10.子类的构造方法
     
    调用子类的静态方法,加载顺序:
        父类静态成员变量
        父类静态代码块
        子类静态成员变量
        子类静态代码块
        子类的静态方法
  • 相关阅读:
    服务器安装软件
    SQL server
    改变下blog思维
    react 父子组件互相通信
    linux下,文件的权限和数字对应关系详解
    Linux 下非root用户使用docker
    Two 观察者 observer pattern
    one 策略模式 strategy
    ssm maven spring AOP读写分离
    Unknown column in 'where clause'
  • 原文地址:https://www.cnblogs.com/vaer/p/4306145.html
Copyright © 2020-2023  润新知