类的加载顺序

类的加载顺序

类的加载顺序,之前一直没有弄明白,今天动手敲了一下代码,验证了类的加载顺序,从而巩固了基础部分的知识

  1. 首先我们来看如下代码:
public class B {
    //静态变量  
    static int i=1;
    //静态语句块
    static {
        System.out.println("父类1:静态代码块"+i);
    }
    //非静态变量
    int j=1;
    //静态语句块
    static{
        i++;
        System.out.println("父类2:静态代码块"+i);
    }
    //构造函数
    public B(){
        i++;
        j++;
        System.out.println("父类构造函数: "+"i="+i+",j="+j);
    }
    //非静态语句块
    {
      i++;
      j++;
      System.out.println("父类:非   静态代码块 "+"i="+i+",j="+j);
    }
    //非静态方法
    public void bDisplay(){
        i++;
        System.out.println("父类:非静态方法 bDisplay():    "+"i="+i+",j="+j);
        return ;
    }
    //静态方法
    public static void bTest(){
        i++;
        System.out.println("父类:静态方法 bTest():    "+"i="+i);
        return ;
    }
}

2.子类继承父类B

public class A  extends B{
    //静态变量  
    static int i=1;
    //静态语句块
    static {
        System.out.println("子类:静态代码块"+i);
    }
    //非静态变量
    int j=1;
    //静态语句块
    static{
        i++;
        System.out.println("子类:静态代码块"+i);
    }
    //构造函数
    public A(){
        super();
        i++;
        j++;
        System.out.println("子类构造函数: "+"i="+i+",j="+j);
    }
    //非静态语句块
    {
      i++;
      j++;
      System.out.println("子类:非静态代码块+"+"i="+i+",j="+j);
    }
    //非静态方法
    public void aDisplay(){
        i++;
        System.out.println("子类:非静态方法 aDisplay(): "+"i="+i+",j="+j);
        return ;
    }
    //静态方法
    public static void aTest(){
        i++;
        System.out.println("子类:静态方法 aTest():    "+"i="+i);
        return ;
    }
}
public class LoadClass{
    public static void main (String args[]) {
        A a=new A();
        a.aDisplay();
    }
}

3.看看程序运行的结果:

父类1:静态代码块1
父类2:静态代码块2
子类:静态代码块1
子类:静态代码块2
父类:非   静态代码块 i=3,j=2
父类构造函数: i=4,j=3
子类:非静态代码块+i=3,j=2
子类构造函数: i=4,j=3
子类:非静态方法 aDisplay(): i=5,j=3

总结如下,类的加载顺序:
1.无论是父类还是子类,都是先加载静态变量或者静态代码块的。
2.如果是有继承关系,就先加载父类的静态变量或者静态代码块,然后加载子类的静态代码块或者静态变量
3.紧接着,如果实例化子类,第三步骤的加载顺序是,先加载父类的非静态变量或者非静态代码块,然后初始化父类的构造函数。
4.第4步骤是初始化子类的静态代码块或者静态变量之后,然后初始化子类的构造函数。
5.而对于静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时都不执行,主要区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。

总结加载顺序:

  1. 父类的静态代码块或者静态变量
  2. 子类的静态代码块或者静态变量
  3. 父类的非静态代码块或非静态变量
  4. 父类的构造函数
  5. 子类的非静态代码块 或非静态变量
  6. 子类的构造函数
  7. 如果有调用则静态方法和非静态方法则进行调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值