在代码中有类之间有继承关系,父类子类中均有成员变量、普通代码块、静态代码块以及构造方法,那么他们的执行顺序怎么样呢,写了两个类来判断下。
父类:Animal
package com.extends03;
public class Animal {
public String name = "animal1";
public int age;
public static String color = "white";
//构造方法
public Animal() {
name = "animal2";
System.out.println("create Animal..." + name); //先执行成员变量,再执行普通代码块,最后执行构造方法
//System.out.println(color);
}
//普通代码块
{
name = "animal3";
System.out.println("Animal Class codeBlock");
}
//静态代码块
static {
color = "red";
System.out.println("Animal Class static codeBlock " + "经过静态代码块修改静态值:" + color);
}
public void eat() {
System.out.println("Animal eat...");
}
}
子类:Lion
package com.extends03;
public class Lion extends Animal {
public static String name = "big Lion";
public Lion() {
System.out.println("create Lion...");
}
public String color = "yellow";
{
name = "little lion ";
color = "white";
System.out.println(name);
System.out.println(color);//先执行本类的成员变量,再执行本类普通代码块
System.out.println("Lion Class codeBlock");
}
static {
name = "super Lion";
System.out.println("Lion Calss static codeBlock "+ "经过静态代码块修改静态值:" + name);
}
}
测试类:
public class TestExtends {
public static void main(String[] args) {
Lion l = new Lion();
System.out.println("验证静态块是否是只被加载一次");
Animal a = new Animal();
}
}
输出结果:
Animal Class static codeBlock 经过静态代码块修改静态值:red //1、父类静态代码块,同时说明静态变量先初始化,然后再执行静态代码块
Lion Calss static codeBlock 经过静态代码块修改静态值:super Lion //2、子类静态代码块,同时说明静态变量先初始化,然后再执行静态代码块//
Animal Class codeBlock //3、父类普通代码块
create Animal...animal2 //4、父类构造方法
little lion
white
Lion Class codeBlock //5、子类代码块
create Lion... //6、子类构造方法
验证静态块是否是只被加载一次 //以下结果说明静态代码只在类第一次加载时执行
Animal Class codeBlock
create Animal...animal2