一、关键字static和初始化的关系
我们思考一个问题,为什么会先走static呢?
其实明白一个道理就很容易理解了,我们在继承一个父类的时候,实际上是先把父类先加载过来,你想想,你要继承它是不是这个类得先在内存当中有?不然的话你基础个啥,没得继承啊
**由上面的执行结果我们能得到几个结论:
1、一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类
2、非静态代码块和静态代码块同时存在一个类中,这个类被初始化的时候,先执行静态代码块(并且精通代码块只执行一次)
**
如果父类已经被初始化了,那么就不会再次初始化了,如下图所以:如果没有刚开始就初始化父类,只初始化子类的话,会先去加载父类,从而引发父类的两个代码块(先静态再非静态)
完整代码如下:
package com.atguigu.test03_static;
public class TestClassInit {
public static void main(String[] args) {
Father f=new Father();
System.out.println("----再实例化一次父类");
Father f2=new Father();
System.out.println("----下面实例化子类---------------------------");
Son s=new Son();
}
}
class Father{
{
System.out.println("父类的代码块(2)");
}
static{
System.out.println("父类的静态代码块代码块(3)");
}
}
class Son extends Father {
static{
System.out.println("子类的静态代码块(1)");
}
}
//由上面的执行结果我们能得到一个结论:
//一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类
二、静态方法是不能被重写的
为什么静态方法不能被重写呢?因为静态方法在编译期间就确定了,不需要在运行时动态绑定