一道题诠释代码块,构造器之间的优先顺序

一道题诠释代码块,构造器之间的优先顺序


不要先看答案,自己思考后再把答案写在纸上!!

class ClassCC{

    static ClassCC instance = new ClassCC();//属于静态成员

    static {//属于静态成员,静态代码块在类加载时可以初始化,假如有多个静态成员,则会按照编写的顺序执行
        System.out.println("父类静态代码块");
    }

    {//实例代码块(每次构建对象都会执行)
        //实例代码块,每次生成类实例都会执行,并且,实例代码块的执行优先于构造器
        System.out.println("父类代码块");
    }
    public ClassCC(){//构造器
        System.out.println("父类无参构造器");
    }
    public ClassCC(String g){
        System.out.println("父类有参构造器");
    }

}
class ClassC1 extends ClassCC{

    static ClassC1 instance = new ClassC1();//属于静态成员

    static {//属于静态成员,静态代码块在类加载时可以初始化,假如有多个静态成员,则会按照编写的顺序执行
        System.out.println("子类静态代码块");
    }

    {//实例代码块(每次构建对象都会执行)
        //实例代码块,每次生成类实例都会执行,并且,实例代码块的执行优先于构造器
        System.out.println("子类代码块");
    }
    public ClassC1(){
        System.out.println("子类无参构造器");
    }
    public ClassC1(String g){

        System.out.println("子类有参构造器");
    }


}
public class Test4 {
    public static void main(String[] args) {

        ClassC1 c2 = new ClassC1("g");//创建子类对象,调用子类有参构造器
        System.out.println(c2);
        ClassC1 c1=ClassC1.instance;
        System.out.println(c1);

    }
}









运行结果

在这里插入图片描述

规则:

  1. 当创建一个类或者加载类的具体成员时,它的父类静态成员最先调用,然后是子类的静态成员。(属性和方法不分优先级,只看编译顺序)
  2. 构造器里调用顺序super()绝对是第一行(未写明this,或者其他super(" ")等方法),非静态代码块第二行,然后是构造成员。


弄清楚规则后再看代码就能搞懂了,作者自己初学java,第一次做也错了。多做几遍,理解就会很深了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值