为什么称为暗执行顺序, 因为当我们在 new 对象时, 其不是简简单单的 new 一个完事, 它要首先检查父类的, 静态的, 非静态的等代码, 就好像我们结婚生孩子一样, 要先到祖宗那里, 公安局那里, 左邻右舍那里, 告诉他们, 我们要结婚了. 下面来看其本质:
这里有一个父类一个子类:
- class Father{
- {
- System.out.println("父类非静态代码块");
- }
- static{
- System.out.println("父类静态代码块");
- }
- public Father(){
- System.out.println("父类构造器");
- }
- public static void method(){
- System.out.println("父类静态方法");
- }
- public void method2(){
- System.out.println("父类非静态方法");
- }
- }
- class Son extends Father{
- {
- System.out.println("子类非静态代码块");
- }
- static{
- System.out.println("子类静态代码块");
- }
- public Son(){
- System.out.println("子类构造器");
- }
- public static void method(){
- System.out.println("子类静态方法");
- }
- public void method2(){
- System.out.println("子类非静态方法");
- }
- }
当 new Son() 时, 会打印:
父类静态代码块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器
可能你会总结出这样的规律: 先父后子, 先静态后非静态最后才是构造器, 但这是不准确的, 因为按这个原则还有一种执行顺序:
父类静态代码块
父类非静态代码块
父类构造器
子类静态代码块
子类非静态代码块
子类构造器
所以观察了细微问题后, 对规律再做总结, 就像我们写论文一样, 用目录层级完美诠释它们的执行顺序:
1. 静态代码块:
1.1 父的
1.2 子的
2. 父其他
2.1 父非静态代码块
2.2 父构造器
3. 子其他
3.1 子非静态代码块
3.2 子构造器
即: 总体原则是静态代码块 ---> 父其他 ---> 子其他.
你记住了吗?
来源: http://www.bubuko.com/infodetail-2966085.html