Java类初始化顺序

**

Java类初始化顺序

**

一:先给出结论,然后带着结论通过代码看一下是否符合结论(如有不对地方欢迎在评论区指正,共同进步哈)。

总结:
在一个类中,初始化顺序为:

  1. 静态变量,静态变量初始化;
  2. 静态代码块;
  3. 非静态变量初始化;
  4. 非静态代码块;
  5. 构造器。

父子类的初始化顺序:

  1. 父类静态变量,静态变量初始化;
  2. 父类静态代码块
  3. 子类静态变量,静态变量初始化;
  4. 子类静态代码块
  5. 父类非静态变量初始化;
  6. 父类非静态代码块
  7. 父类构造器
  8. 子类非静态变量初始化;
  9. 子类非静态代码块
  10. 子类构造器

二:直接上代码

1:父类代码如下:
public class Father {
    private String name;

    static {
        System.out.println("静态代码块 i am father DEMO = "+Childer.DEMO+"  DEMO:"+Father.DEMO);
    }

    public static final String DEMO = "Father";

    public Father(){
        name = "无参构造器";
        System.out.println("Father 的构造函数  name:" + name);
    }

    {
        System.out.println("Father刚运行到非静态代码块时的非静态变量值:name: "+name);
        name = "非静态代码块";
        System.out.println("Father 的普通方法块 name:" + name);
    }

    public void ceshi(){
        System.out.println("我是父类");
    }
}

写一个主函数运行:

public class InitDemo {

    public static void main(String[] args){
        Father father  = new Father();
    }
}

运行结果如下:
在这里插入图片描述:2:父子类

上子类代码
public class Childer extends Father{

    private String name;

    static {
        System.out.println("静态代码块  i am Childer  CDEMO= "+Childer.CDEMO);
    }

    public static final String CDEMO = "Childer";

    public Childer(){
        name = "子类无参构造器";
        System.out.println("Childer 的构造函数 name:"+name);
    }

    public void ceshi(){
        System.out.println("我是子类");
    }

    {
        System.out.println("Childer刚运行到非静态代码块时的非静态变量值:name: "+name);
        name = "非静态代码块";
        System.out.println("Childer 的普通代码块 name:"+name);
    }
}

写一个主函数运行:

public class InitDemo {

    public static void main(String[] args){
        Childer childer  = new Childer();
    }
}

运行结果:
在这里插入图片描述
验证了我们之前的结论

最后我们再看一种情况,子类会不会初始化父类(我们对上面的代码稍作修改):
我们将父类,以及子类的静态变量的final修饰符去掉,然后运行一下结果我们看一下。

public class Father {
    private String name;

    static {
        System.out.println("静态代码块 i am father DEMO = "+Childer.DEMO+"  DEMO:"+Father.DEMO);
    }

    public static String DEMO = "Father";

    public Father(){
        name = "无参构造器";
        System.out.println("Father 的构造函数  name:" + name);
    }

    {
        System.out.println("Father刚运行到非静态代码块时的非静态变量值:name: "+name);
        name = "非静态代码块";
        System.out.println("Father 的普通方法块 name:" + name);
    }

    public void ceshi(){
        System.out.println("我是父类");
    }
}

public class Childer extends Father{

    private String name;

    static {
        System.out.println("静态代码块  i am Childer  CDEMO= "+Childer.CDEMO);
    }

    public static String CDEMO = "Childer";

    public Childer(){
        name = "子类无参构造器";
        System.out.println("Childer 的构造函数 name:"+name);
    }

    public void ceshi(){
        System.out.println("我是子类");
    }

    {
        System.out.println("Childer刚运行到非静态代码块时的非静态变量值:name: "+name);
        name = "非静态代码块";
        System.out.println("Childer 的普通代码块 name:"+name);
    }

写一个主函数:

public class InitDemo {

    public static void main(String[] args){
        System.out.println(Childer.CDEMO);
    }
}

运行结果如下:
在这里插入图片描述
然后我们再看一下加上final是什么样的呢
在这里插入图片描述

这种情况下并没有初始化父类。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值