Java

JAVA的类加载顺序

2019-08-26  本文已影响0人  灰灰H_K

理解关于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属性,因为此时子类的非静态属性已经通过调用反法加载了

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

上一篇 下一篇

猜你喜欢

热点阅读