无父类时的顺序:
静态代码块=静态成员变量>普通代码块=普通成员变量>构造函数;
有父类时的顺序:
父类静态代码块=父类静态成员变量>子类静态代码块=子类静态成员变量>
父类普通代码块=父类普通成员变量>父类构造函数>
子类普通代码块=子类普通成员变量>子类构造函数;
总结:静态优先级最高,父类优先级高于子类,同类构造函数优先级最低
代码展示:
public class Run {
public static void main(String[] args) {
new Son();
}
}
class Parent{
public Parent() {
System.out.println("父类构造方法");
}
Test t = new Test("父类成员变量");
{
System.out.println("父类构造代码块");
}
static Test t1 = new Test("父类静态成员变量");
static {
System.out.println("父类静态代码块");
}
}
class Son extends Parent{
public Son() {
System.out.println("子类构造方法");
}
{
System.out.println("子类构造代码块");
}
static {
System.out.println("子类静态代码块");
}
Test t3 = new Test("子类成员变量");
static Test t4 = new Test("子类静态成员变量");
}
class Test{
public Test(String str){
System.out.println(str);
}
}
测试结果:
父类静态成员变量
父类静态代码块
子类静态代码块
子类静态成员变量
父类成员变量
父类构造代码块
父类构造方法
子类构造代码块
子类成员变量
子类构造方法
拓展:
类默认有一个无参构造函数,当定义有参构造函数,默认的无效,需要自定义无参构造。
子类中的构造函数必须要有父类的构造引用(即super()),且放在子类构造函数的第一行,如果没有写默认调用父类的无参构造。所以要注意父类的构造是否有效