Java初始化与继承
不含继承的初始化顺序
public class Test01 {
private static int i=print("静态i");
private int j=print("非静态j");
{
System.out.println("非静态代码块");
}
static {
System.out.println("静态代码块");
}
Test01(){
System.out.println("构造器");
}
public static int print(String s) {
System.out.println(s+"被初始化");
return 1;
}
public static void main(String[] args) {
Test01 t=new Test01();
}
}
运行结果
静态i被初始化
静态代码块
非静态j被初始化
非静态代码块
构造器
换个顺序
public class Test01 {
Test01(){
System.out.println("构造器");
}
{
System.out.println("非静态代码块");
}
static {
System.out.println("静态代码块");
}
private static int i=print("静态i");
private int j=print("非静态j");
public static int print(String s) {
System.out.println(s+"被初始化");
return 1;
}
public static void main(String[] args) {
Test01 t=new Test01();
}
}
运行结果
静态代码块
静态i被初始化
非静态代码块
非静态j被初始化
构造器
原因
先进行类的初始化(即静态属性初始化),然后进行实例初始化。成员和块是按顺序的
含有继承的初始化顺序
class Test02 extends Test01{
private static int k=print("子类静态k");
private int l=print("子类非静态l");
{
System.out.println("子类非静态代码块");
}
static{
System.out.println("子类静态代码块");
}
Test02(){
System.out.println("子类构造器");
}
}
public class Test01 {
private static int i=print("父类静态i");
private int j=print("父类非静态j");
{
System.out.println("父类非静态代码块");
}
static {
System.out.println("父类静态代码块");
}
Test01(){
System.out.println("父类构造器");
}
public static int print(String s) {
System.out.println(s+"被初始化");
return 1;
}
public static void main(String[] args) {
Test02 t=new Test02();
}
}
运行结果
父类静态i被初始化
父类静态代码块
子类静态k被初始化
子类静态代码块
父类非静态j被初始化
父类非静态代码块
父类构造器
子类非静态l被初始化
子类非静态代码块
子类构造器