package test;
public class demo04 {
public static void main(String[] args) {
Son s = new Son(); //创建子类对象
}
}
class Father {
public String name = print("父类非静态成员变量");
public static String age = print("父类静态成员变量");
public Father() {
System.out.println("父类构造方法");
}
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类非静态代码块");
}
public static String print(String s) {
System.out.println(s);
return null;
}
}
class Son extends Father {
public String name = print("子类非静态成员变量");
public static String age = print("子类静态成员变量");
public Son() {
System.out.println("子类构造方法");
}
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public static String print(String s) {
System.out.println(s);
return null;
}
}
输出结果为:
父类静态成员变量
父类静态代码块
子类静态成员变量
子类静态代码块
父类非静态成员变量
父类非静态代码块
父类构造方法
子类非静态成员变量
子类非静态代码块
子类构造方法
总结
在实例化子类对象的时候,会先加载类,而静态成员变量和静态方法会随着类的加载而加载,所以先会初始化父类的静态数据,(成员变量的优先级 > 静态代码块的优先级),再初始化子类的静态数据,然后是非静态的成员变量和字段,当然还是会先执行父类的非静态数据,在执行子类的非静态数据,构造代码块优先于构造方法执行。