JAVA的类加载顺序

理解关于java类的加载顺序


首先来捋一捋java类的加载顺序吧

  • 父类静态代码块 》》静态代码初始化,静态属性(带有static),不包括静态方法
  • 子类的静态代码 》》静态代码初始化,静态属性(带有static),不包括静态方法
  • 父类非静态代码块 》非静态代码块,非静态属性(无static)
  • 父类构造函数
  • 子类非静态方法 》非静态代码块,非静态属性(无static)
  • 子类构造函数

上代码



public class test3 {

    private String baseName = "base";

    public test3(){

        System. out. println("执行父类的test3()");

        callName();

    }

    public void callName(){

        System. out. println("执行父类的callName()");

        System. out. println(baseName);

    }

    //内部类继承

    static class Sub extends test3

    {

        private String baseName = "sub";

        @Override

        public void callName(){

            System. out. println("执行子类的callName()");

            System. out. println(baseName);

        }

    }

    public static void main(String[] args)

    {

        test3 b = new Sub();

    }

}

运行结果


image

代码执行流程


1. main方法执行test3 b=new Sub(),会执行父类的构造函数test3();

2. test3()里有方法callName(),会优先到子类里查询又没有这个方法,如果没有则会执行父类的callName()方法。

3. 由于子类有这个方法,所以执行子类的callName()方法,由于当前只执行到父类的构造函数,子类的非静态属性baseName还未加载,所以会返回null;

加一点料


如果再main方法里加个调用方法


public static void main(String[] args)

    {

        test3 b = new Sub();

        b.callName();

    }

结果

blob.jpg

可以看到,此时会输出子类的baseName属性,因为此时子类的非静态属性已经通过调用反法加载了

以上纯属个人理解,如有错误,请大佬指出;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容