类的初始化顺序
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类非静态变量
- 父类非静态代码块
- 父类构造器
- 子类非静态变量
- 子类非静态代码块
- 子类构造器
1、实例化一个类,调用它的方法
为了观察打印结果,把Boy的成员变量设为new新的对象。
public class Client { //场景类
public static void main(String[] args) {
Boy boy = new Boy("我是子类的构造器!");
}
}
public class Boy{
private static Toy basketball = new Toy("我是子类的静态变量。");
private Toy tank = new Toy("我是子类的非静态变量。");
static{
System.out.println("我是子类的静态代码块。");
}
{ //非静态代码块
System.out.println("我是子类的非静态代码块。");
}
public Boy(String s){
System.out.println(s);
}
}
public class Toy { //备胎类
public Toy(String s) {
System.out.println(s);
}
}
--------------------------运行结果------------------------------
我是子类的静态变量。
我是子类的静态代码块。
我是子类的非静态变量。
我是子类的非静态代码块。
我是子类的构造器!
显而易见,一个类实例化的顺序:静态变量 > 静态代码块 > 非静态变量 > 非静态代码块 > 构造器 。
2、加载继承体系中的子类
public class Client {
public static void main(String[] args) {
Boy boy = new Boy("我是子类的构造器!");
}
}
public class Dad {
private static Toy boy1 = new Toy("我是父类的静态变量。");
private Toy boy2 = new Toy("我是父类的非静态变量。");
static{
System.out.println("我是父类的静态代码块。");
}
{
System.out.println("我是父类的非静态代码块。");
}
public Dad(){
System.out.println("我是父类的构造器。");
}
}
public class Boy extends Dad{ //此时,Boy类有继承关系了
private static Toy toy = new Toy("我是子类的静态变量。");
private Toy tank = new Toy("我是子类的非静态变量。");
static{
System.out.println("我是子类的静态代码块。");
}
{
System.out.println("我是子类的非静态代码块。");
}
public Boy(String s){
System.out.println(s);
}
}
public class Toy { //还是备胎类
public Toy(String s) {
System.out.println(s);
}
}
----------------------------------------
我是父类的静态变量。
我是父类的静态代码块。
我是子类的静态变量。
我是子类的静态代码块。
我是父类的非静态变量。
我是父类的非静态代码块。
我是父类的构造器。
我是子类的非静态变量。
我是子类的非静态代码块。
我是子类的构造器!
说显而易见可能有点过分,咱们很容易看出来,此时子类实例化的顺序:
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类非静态变量
- 父类非静态代码块
- 父类构造器
- 子类非静态变量
- 子类非静态代码块
- 子类构造器
补充:
- 静态代码块后面如果还有静态变量,则不会加载
- 静态代码块可以写在类中 除方法体 以外的任何地方