zoukankan      html  css  js  c++  java
  • Java子类初始化调用父类无参构造

    实在是服了自己,子类初始化调用父类无参构造这种初学者都应该知道的事,我给忘了。

    记得当初看书的时候各种概念抄在笔记本上,再上机实践,以为一辈子都不会忘,还是给忘了。

    这件事说明了两个问题:

    1.我没有保持专注。

    2.不管记性好坏都必须要复习。

     

    我们知道在Java中,子类初始化的时候(不管是通过有参构造还是无参构造),如果继承有父类,都会先去调用父类

    的无参构造。

    这个没有问题,但是如果在父类和子类中都有static代码块和普通代码块,他们的执行先后顺序又是怎样的呢?先来看一段代码:

    A类

     1 package com.test;
     2 
     3 /**
     4  * @author zhangxingrui
     5  * @create 2019-03-24 21:00
     6  **/
     7 public class A {
     8 
     9     static {
    10         System.out.println("我是A的static代码块");
    11     }
    12 
    13     {
    14         System.out.println("我是A的普通代码块");
    15     }
    16 
    17     public A(){
    18         System.out.println("我是A的构造方法");
    19     }
    20 
    21 }

      B类

     1 package com.test;
     2 
     3 /**
     4  * @author zhangxingrui
     5  * @create 2019-03-24 21:01
     6  **/
     7 public class B extends A {
     8 
     9     static {
    10         System.out.println("我是B的static代码块");
    11     }
    12 
    13     {
    14         System.out.println("我是B的普通代码块");
    15     }
    16 
    17     public B(){
    18         System.out.println("我是B的构造方法");
    19     }
    20 
    21 }

      Main类

     1 package com.test;
     2 
     3 /**
     4  * @author zhangxingrui
     5  * @create 2019-03-24 21:00
     6  **/
     7 public class Main {
     8 
     9     public static void main(String[] args) {
    10         B b = new B();
    11         System.out.println("---我是可爱的分割线---");
    12         B b2 = new B();
    13     }
    14 
    15 }

      

      好的,代码如上,现在来看程序执行结果:

      可以看到,执行顺序是:

      A的静态代码块 》B的静态代码块》A的普通代码块》A的构造方法》B的普通代码块》B的构造方法;

      同时B被new了两次,但是静态代码块只执行了一次。。。

      这说明了啥,说明了A不是在new的时候被执行的,而是在JVM将class文件装载进入内存的时候就办了(JVM将class加载到内存以后会做很多

      动作,比如验证、链接、解析等等)。

      而普通代码块和构造方法都是在实例化对象的时候才被执行的。

      同时也验证了上面说的,子类在初始化的时候会调用父类的无参构造。

  • 相关阅读:
    econtrol窗体设计器
    脚本引擎注册将要使用的类,属性,方法,函数
    FastReport开发手册
    控制钱箱,客显,打印
    Laravel渴求式加载(比较容易理解理解load与with关系)
    50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)
    日期选择器date、week、time、datetime、datetimelocal类型
    input type=date时,时间数据回填,报错The specified value "2019040418" does not conform to the required format...
    Laravel技巧:使用load、with预加载 区别
    arcengine,C#实现分页打印预览
  • 原文地址:https://www.cnblogs.com/alinainai/p/10590496.html
Copyright © 2011-2022 走看看