public class Code {
public static void main(String[] args) {
//创建一个子类对象,首先会发生类的加载(先加载父类的静态代码块和静态属性 ,再加载子类的静态),其次再创建对象
//创建对象时会进入子类B02的构造方法中
new B02();
}
}
class A02 //父类
{
//静态代码块和静态属性优先级一样,所以按定义顺序执行
private static int n1=getVal01(); //(1)
static
{
System.out.println("A02的一个静态代码块"); //(3)
}
{
System.out.println("A02的第一个普通代码块"); //(7)
}
public int n3=getVal02(); //(8)
public static int getVal01()
{
System.out.println("getVal01"); //(2)
return 10;
}
public int getVal02()
{
System.out.println("getVal02"); //(9)
return 10;
}
public A02()
{
//(1)super .这里代码的super会追溯到Object,调用无参的构造方法
//(2)普通代码块和普通属性初始化的调用,调用完之后才会执行构造方法中下面的语句
System.out.println("A02的构造器"); //(10)
}
}
class B02 extends A02
{
//再执行子类的静态代码块和静态属性初始化(初始化可以像这种也可以是创建对象初始化)
private static int n3=getVal03(); //(4)
static
{
System.out.println("B02的一个静态代码块"); //(6)
}
{
System.out.println("B02的一个普通代码块"); //(11)
}
public int n5=getVal04(); //(12)
public static int getVal03()
{
System.out.println("getVal03"); //(5)
return 10;
}
public int getVal04()
{
System.out.println("getVal04"); //(12)
return 10;
}
public B02()
{
//隐含着两个
//(1)super,所以进入父类的构造方法中,父类中的构造方法执行完后再执行下一条语句
//(2)普通代码块和普通属性初始化的调用,调用完之后在执行构造方法中的后面语句
System.out.println("B02的构造器"); //(13)
}
}
有代码块时的执行顺序
于 2024-04-27 15:00:45 首次发布