• 多类继承顺序


     1 class Root
     2 {
     3     static{
     4         System.out.println("Root的静态初始化块");
     5     }
     6     {
     7         System.out.println("Root的普通初始化块");
     8     }
     9     public Root()
    10     {
    11         System.out.println("Root的无参数的构造器");
    12     }
    13 }
    14 class Mid extends Root
    15 {
    16     static
    17     {
    18         System.out.println("Mid的静态初始化块");
    19     }
    20     {
    21         System.out.println("Mid的普通初始化块");
    22     }
    23     public Mid()
    24     {
    25         System.out.println("Mid的无参数的构造器");
    26     }
    27     public Mid(String msg)
    28     {
    29         //通过this调用同一类中重载的构造器
    30         this();
    31         System.out.println("Mid的带参数构造器,其参数值:" + msg);
    32     }
    33 }
    34 class Leaf extends Mid
    35 {
    36     static{
    37         System.out.println("Leaf的静态初始化块");
    38     }
    39     {
    40         System.out.println("Leaf的普通初始化块");
    41     }    
    42     public Leaf()
    43     {
    44         //通过super调用父类中有一个字符串参数的构造器
    45         super("Java初始化顺序演示");
    46         System.out.println("执行Leaf的构造器");
    47     }
    48 
    49 }
    50 
    51     public class TestStaticInitializeBlock
    52     {
    53         public static void main(String[] args) 
    54         {
    55             new Leaf();
    56         }
    57     }                            

    程序源代码以及运行结果截图:

          程序源代码:

    程序运行结果截图:

    原因分析:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

    具体的执行顺序是:先初始化父类(最高层次的)的静态初始化块,父类的无参构造器,在进行子类的静态初始化块,子类的无参构造器;

    然后是父类的普通初始化块,子类的普通初始化块;父类的带参构造器,子类的带参构造器。

    super的用法

    在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

    请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”:

    静态初始化块的执行顺序:

    具体的执行顺序是:先初始化父类(最高层次的)的静态初始化块,父类的无参构造器,在进行子类的静态初始化块,子类的无参构造器;

    然后是父类的普通初始化块,子类的普通初始化块;父类的带参构造器,子类的带参构造器。

    静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。

  • 相关阅读:
    登录验证servlet实现
    IOS开发(68)之捕获点击划屏手势
    jquery实现漂浮在网页右侧的qq在线客服插件
    深切缅怀“5.12”特大地震遇难同胞
    PHP实现微信申请退款流程实例源码
    empty和isset的区别
    ThinkPHP中实现微信支付(jsapi支付)流程
    php中正则表达式详解
    PHP与RBAC设计思路讲解与源码
    一起谈.NET技术,VS2010实践RUP4+1架构模型 狼人:
  • 原文地址:https://www.cnblogs.com/aishangtaxuefeihong/p/4886308.html
Copyright © 2020-2023  润新知