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方法 > 构造代码块 > 构造方法体
对于没有构造方法的类,系统默认赠送无参构造方法
隐式三步;
- super( );
- 给非静态成员变量赋值
- 执行构造代码块(一般都是2-3,因为直接先构造代码块后给成员变量赋值,调用之前还没有定义变量,会报错,除非用this.去调用)
PS:个人感觉,如果能够理解运行顺序有利于理解程序逻辑,如果初次看这感觉步骤太复杂的话推荐可以看上一篇,说的会细一点