隐式三步,静态构造代码块,构造方法,main方法之间的运行顺序问题

package com.itheima;

 class M{
    private int a;
    {
        System.out.println("我是父类的构造代码块");//5
    }
    static {
        System.out.println("我是父类的 静态代码块");//3
    }
    public M(){
        System.out.println("我是父类狗奥方法中还没有赋值的a"+a);//6
        System.out.println("我是父类的构造方法");//7
    }
    void D(){
        System.out.println("我是不会被输出的");//因为没有调用方法 所以不会输出
    }
}
class N extends M{
    int m=19;
    static {
   //System.out.println("没有初始化的m的值:"+m);//0

        System.out.println( "我是子类的静态代码块" );//4
    }
    {        System.out.println("我是子类中初始化的m的值:");//8

        System.out.println("猜猜我是第几步");//10
    }
    public N(){
        //给非静态赋值
        //构造代码块(第2,3步没有固定顺序)
        //构造方法体
        //super();
        System.out.println("赋值后的m的值"+m);//11
    }

}

class Test{
    public static void main(String[] args) {
        System.out.println("那我是老二");//1
        N n = new N(); }
    static {//静态代码块  最先运行的
        System.out.println("我是最先输出的,谁都比不过我"); }}//1

/*
程序中代码运行顺序:
静态构造代码块 > main方法 >构造代码块 > 构造方法体
对于没有构造方法的类,系统默认赠送无参构造方法,

隐式三步:
1,super();
2,给非静态成员变量赋值
3,执行构造代码块
(第2步和第3步没有先后顺序,看自己书写书顺序。。一般都是先第2步,后面第三步。因为代码执行先后顺序,直接用构造代码块调用非静态成员变量的时候会报错,除非在里面加上this.)
*/

 

 

程序中代码的顺序:

静态构造代码块  >  main方法 > 构造代码块  > 构造方法体

对于没有构造方法的类,系统默认赠送无参构造方法

 

隐式三步;

  1. super(  );
  2. 给非静态成员变量赋值
  3. 执行构造代码块(一般都是2-3,因为直接先构造代码块后给成员变量赋值,调用之前还没有定义变量,会报错,除非用this.去调用)

  

 

PS:个人感觉,如果能够理解运行顺序有利于理解程序逻辑,如果初次看这感觉步骤太复杂的话推荐可以看上一篇,说的会细一点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值