代码及执行结果
父类
public class Parent {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类非静态代码块");
}
public Parent() {
System.out.println("父类构造函数");
}
public static void method01(){
System.out.println("父类静态方法");
}
public void method02(){
System.out.println("父类非静态方法");
}
}
子类
public class Child extends Parent {
public Child() {
System.out.println("子类构造方法");
}
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public static void method01(){
System.out.println("子类静态方法");
}
public void method02(){
super.method02();
System.out.println("子类非静态方法");
}
}
测试类
public static void main(String[] args) {
Child child = new Child();
child.method01();
child.method02();
}
执行结果
父类静态代码块
子类静态代码块
父类非静态代码块
父类构造函数
子类非静态代码块
子类构造方法
子类静态方法
父类非静态方法
子类非静态方法
总结
- 静态代码块于类开始加载到JVM虚拟机时调用,所以最先
- 类初始化时会先调用非静态代码块,再调用构造方法
- 子类初始化时必定调用父类初始化流程,如果子类中没有写
super()
,也会自动默认添加super()
,如果super()
不可用将报错提示使用可用的父类构造方法
- 父类静态方法不可被子类继承,引申凡是被
static
标记的都是与类绑定的,无法被继承
- 子类可以通过
super
指针显式调用父类被覆盖的方法