我们直接通过实例进行测试,然后看测试结果。
父类:Person
public class Person {
{
System.out.println("父类非静态代码块");
}
static {
System.out.println("父类静态代码块");
}
public Person() {
System.out.println("父类构造函数");
}
public void method1() {
System.out.println("父类非静态函数");
}
public static void method2() {
System.out.println("父类静态函数");
}
}
子类:Teacher
public class Teacher extends Person{
{
System.out.println("子类非静态代码块");
}
static {
System.out.println("子类静态代码块");
}
public Teacher(String name) {
System.out.println("子类构造函数");
}
public void method1() {
System.out.println("子类非静态函数");
}
public static void method2() {
System.out.println("子类静态函数");
}
}
测试类:TestMain
public class TestMain {
public static void main(String[] args) {
Teacher t2 = new Teacher("哈哈");
t2.method1();
}
}
执行测试结果:
结论:
代码执行顺序为:
1.总体:先执行静态内容,再执行非静态内容
2.继承方面:先执行父类内容,再执行子类内容
3.详细:父类静态代码块->子类静态代码块->父类非静态代码块->父类构造函数->子类非静态代码块->子类构造函数
4.补充:构造方法新建子类时,不管子类构造方法是什么样,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类其他带参数的构造方法,否则编译不能通过。