目录
本文将介绍三种情形下的类初始化顺序。
一、普通类
Java类:Animal.java
package ztt.继承接口多态.执行顺序测试;
public class Animal {
private static String name = "动物";
private String a = "hello";
public Animal() {
System.out.println("构造方法!");
}
static {
// 如果能打印出来值,说明静态属性已经初始化了
System.out.println("静态属性:" + name);
System.out.println("静态代码块!");
}
{
// 如果能打印出来值,说明普通属性已经初始化了
System.out.println("普通属性:" + a);
System.out.println("普通代码块");
}
public static void eat() {
System.out.println("静态方法!");
}
public void sing() {
System.out.println("普通方法!");
}
}
Java类:AnimalTest.java
package ztt.继承接口多态.执行顺序测试;
public class AnimalTest {
public static void main(String[] args) {
new Animal();
}
}
执行结果如下:
总结
普通类初始化的顺序为:
【1】静态属性:static 开头定义的属性
【2】静态代码块: static {} 圈起来的方法块
【3】普通属性: 未带static定义的属性
【4】普通代码块: {} 圈起来的方法块
【5】构造方法
二、包含继承关系
父类Fruit.java:
package ztt.继承接口多态.执行顺序测试;
public class Fruit {
private static String name = "水果";
private String a = "hello fruit";
public Fruit() {
System.out.println("父类Fruit构造方法!");
}
static {
System.out.println("父类静态属性:" + name);
System.out.println("父类静态代码块!");
}
{
System.out.println("父类普通属性:" + a);
System.out.println("父类普通代码块!");
}
}
子类Apple.java:
package ztt.继承接口多态.执行顺序测试;
public class Apple extends Fruit{
private static String name = "苹果";
private String a = "Hello Apple";
public Apple() {
System.out.println("----子类Apple构造方法!");
}
static {
System.out.println("----子类静态属性:" + name);
System.out.println("----子类静态代码块!");
}
{
System.out.println("----子类普通属性:" + a);
System.out.println("----子类普通代码块!");
}
}
测试类FruitTest.java:
package ztt.继承接口多态.执行顺序测试;
public class FruitTest {
public static void main(String[] args) {
new Apple();
}
}
执行结果如下:
总结
包含继承关系,类的初始化顺序如下:
【1】父类静态变量
【2】父类静态代码块
【3】子类静态变量
【4】子类静态代码块
【5】父类普通变量
【6】父类普通代码块
【7】父类构造函数
【8】子类普通变量
【9】子类普通代码块
【10】子类构造函数
三、包含接口、抽象类关系
接口Shape.java:
package ztt.继承接口多态.执行顺序测试;
public interface Shape {
static String a = "Shape接口";
}
抽象类BaseShape.java:
package ztt.继承接口多态.执行顺序测试;
public abstract class BaseShape {
private static String a = "BaseShape a";
private String b = "BaseShape b";
public BaseShape() {
System.out.println("抽象类BaseShape构造函数!");
}
static {
System.out.println("----抽象类静态属性:" + a);
System.out.println("----抽象类静态代码块!");
}
{
System.out.println("抽象类普通属性:" + b);
System.out.println("抽象类普通代码块!");
}
}
子类Circle.java:
package ztt.继承接口多态.执行顺序测试;
public class Circle extends BaseShape implements Shape {
private static String a = "Circle a";
private String b = "Circle b";
public Circle() {
System.out.println("普通类Circle构造方法!");
}
static {
System.out.println("====普通类类静态属性:" + a);
System.out.println("====普通类静态代码块!");
}
{
System.out.println("====普通类类普通属性:" + a);
System.out.println("====普通类普通代码块!");
}
}
测试类ShapeTest.java:
package ztt.继承接口多态.执行顺序测试;
public class ShapeTest {
public static void main(String[] args) {
new Circle();
}
}
执行结果:
总结
包含接口、抽象类关系初始化顺序如下:
【1】接口静态属性
【2】抽象类静态属性
【3】抽象类静态代码块
【4】实现类静态属性
【5】实习类静态代码块
【6】抽象类普通属性
【7】抽象类普通代码块
【8】抽象类构造函数
【9】实现类普通属性
【10】实现类普通代码块
【11】实现类构造函数