zoukankan      html  css  js  c++  java
  • 多类继承顺序

     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示例,观察输出结果,总结出“静态初始化块的执行顺序”:

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

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

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

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

  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/aishangtaxuefeihong/p/4886308.html
Copyright © 2011-2022 走看看