类的实例化顺序:
比如父类静态数据、构造函数、字段、子类静态数据、构造函数、字段,它们的执行顺序。
遵循先静态先父后子原则:
- 父类中static代码块,子类中的static
- 顺序执行父类的普通代码块
- 父类构造器
- 子类普通代码块
- 子类构造器,按顺序执行
- 子类方法的执行
public class Test {
public static void main(String[] args) {
Son s = null;
System.out.println("---------------------");
Son p1 = new Son();
System.out.println("-------------");
Parent p2 = new Son(1);
}
}
class Parent{
public Parent(){
System.out.println("父类无参构造器");
}
public Parent(int pa){
System.out.println("父类有参构造器");
}
public static int pa = 1;
static{
System.out.println("父类静态块1");
System.out.println("父类静态块1---pa--"+pa);
// System.out.println("父类静态块1---pb--"+pb);
}
public static int pb = 2;
{
System.out.println("父类非静态块1");
pa = 11;
pb = 22;
System.out.println("父类非静态块1---pa--"+pa);
System.out.println("父类非静态块1---pb--"+pb);
}
static{
System.out.println("父类静态块2");
System.out.println("父类静态块2---pa--"+pa);
System.out.println("父类静态块2---pb--"+pb);
}
}
class Son extends Parent{
public static int sa = 1;
static{
System.out.println("子类静态块1");
System.out.println("子类静态块1---sa--"+sa);
// System.out.println("子类静态块1---sb--"+sb);
}
public static final int sb = 2;
{
System.out.println("子类非静态块1");
sa = 11;
// sb = 22; //编译报错不能修改final
System.out.println("子类非静态块1---sa--"+sa);
System.out.println("子类非静态块1---sb--"+sb);
}
static{
System.out.println("子类静态块2");
System.out.println("子类静态块2---sa--"+sa);
System.out.println("子类静态块2---sb--"+sb);
}
public Son(){
System.out.println("子类无参构造器");
}
public Son(int sa){
System.out.println("子类有参构造器");
}
}
---------------------------------------------------------------
执行结果
---------------------
父类静态块1
父类静态块1---pa--1
父类静态块2
父类静态块2---pa--1
父类静态块2---pb--2
子类静态块1
子类静态块1---sa--1
子类静态块2
子类静态块2---sa--1
子类静态块2---sb--2
父类非静态块1
父类非静态块1---pa--11
父类非静态块1---pb--22
父类无参构造器
子类非静态块1
子类非静态块1---sa--11
子类非静态块1---sb--2
子类无参构造器
-------------
父类非静态块1
父类非静态块1---pa--11
父类非静态块1---pb--22
父类无参构造器
子类非静态块1
子类非静态块1---sa--11
子类非静态块1---sb--2
子类有参构造器