java类的加载顺序

来源:互联网 发布:腾讯微信域名检测 编辑:程序博客网 时间:2024/06/10 20:55


class HelloA {    public HelloA() {        System.out.println("HelloA");    }    { System.out.println("I'm A class"); }//构造代码块    static { System.out.println("static A"); }//静态代码块}

public class HelloB extends HelloA {    public HelloB() {        System.out.println("HelloB");    }      { System.out.println("I'm B class"); }    static { System.out.println("static B"); }        public static void main(String[] args) {new HelloB();}}

输出:

static A
static B
I'm A class
HelloA
I'm B class
HelloB
首先了解几个概念:

普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
静态代码块:在java中使用static关键字声明的代码块。

类的加载顺序:静态代码块——>构造代码块——>构造方法

类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载。

类加载的时机:
      1)第一次创建对象要加载类.
      2)调用静态方法时要加载类,访问静态属性时会加载类。
      3)加载子类时必定会先加载父类。
      4)创建对象引用不加载类.
      5) 子类调用父类的静态方法时
          (1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
          (2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
      6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。

分析:首先new HelloB(),需要加载类,虚拟机的生命周期中一个类只能被加载一次,静态代码块伴随着类的加载而执行,static{}都只执行一次

因为加载子类时必定会先加载父类,所以首先执行父类中的静态代码块

static { System.out.println("static A"); }
输出static A

然后执行子类的静态代码块

static { System.out.println("static B"); }
输出static B

然后继续执行 new HelloB(),首先我们要了解下面两个规则

通过反编译可以看到,构造代码块中的代码也是在构造方法中执行的。在编译时的编译器看来会默认将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面


子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。
而父类没有无参的构造函数,所以子类需要在自己的构造函数中显示的调用父类的构造函数。
使用super调用构造器的语句必须是子类构造器的第一条语句。

所以此时new HelloB(),首先要调用父类的构造方法,构造代码块是放在构造方法中并优先执行的,所以此时要调用父类的构造代码块
{ System.out.println("I'm A class"); }//构造代码块
输出 I'm A calss

然后执行父类的构造方法

public HelloA() {        System.out.println("HelloA");    }
输出HelloA

然后调用子类自生的构造方法,构造代码块是放在构造方法中并优先执行的,首先执行子类的构造代码块
{ System.out.println("I'm B class"); }
输出I'm B class

然后执行子类的构造方法

public HelloB() {        System.out.println("HelloB");    }  
输出HelloB


原创粉丝点击