• 类的初始化顺序


    初始化一个类,必先初始化他的父类,如果有的话

    父类ParentTest1

    子类ChildTest1

     1 package com.yitian.test.override;
     2 
     3 /**
     4  * 测试父类,测试重写
     5  * @author tong
     6  *
     7  */
     8 public class ParentTest1 {
     9     
    10     static String s = "parentStatic";
    11     
    12     String parentName = "parentName";
    13     
    14     String testName = "parentTestName";
    15     {
    16         System.out.println();
    17         System.out.println("parent++++初始化变量++++");
    18         System.out.println("parent++++初始化块++++");
    19         System.out.println();
    20     }
    21     static {
    22         System.out.println();
    23         System.out.println("parent初始化静态变量++++");
    24         System.out.println("parent初始化静态块++++");
    25         System.out.println();
    26     }
    27     
    28     /**
    29      * 初始化顺序
    30      * 1初始化父类
    31      * 2初始化静态变量
    32      * 3初始化静态块
    33      * 
    34      * 4变量
    35      * 
    36      */
    37     public ParentTest1() {
    38         System.out.println();
    39         System.out.println("before++Parent()构造方法+++");
    40         test3();
    41         System.out.println("after++Parent()构造方法+++");
    42         System.out.println();
    43         System.out.println();
    44     }
    45     
    46     public void test3() {
    47         System.out.println();
    48         System.out.println("before++Parent+++test3()");
    49         System.out.println("Parent+++test3()++");
    50         System.out.println(parentName);
    51         System.out.println("after++Parent+++test3()");
    52         System.out.println();
    53     }
    54     
    55 }
    ParentTest1
     1 package com.yitian.test.override.overload;
     2 
     3 import com.yitian.test.override.ParentTest1;
     4 
     5 public class ChildTest1 extends ParentTest1 {
     6     
     7     static String s = "childStatic";
     8     
     9     String childName = "childName";
    10     
    11     String testName = "childTestName";
    12     {
    13         System.out.println();
    14         System.out.println("child++++初始化变量++++");
    15         System.out.println("child++++初始化块++++");
    16         System.out.println();
    17     }
    18     
    19     static {
    20         System.out.println();
    21         System.out.println("child初始化静态变量++++");
    22         System.out.println("child初始化静态块++++");
    23         System.out.println();
    24     }
    25     
    26     /**
    27      * 初始化顺序
    28      * 1初始化子类,必先初始化父类,
    29      * 2初始化父类
    30      * 3父类初始化静态变量
    31      * 4父类初始化静态块
    32      * 5子类初始化静态变量
    33      * 6子类初始化静态块
    34      * 7父类变量
    35      * 8父类块
    36      * 9父类构造方法
    37      * 10子类变量
    38      * 11子类块
    39      * 12子类构造方法
    40      * 
    41      */
    42     public ChildTest1() {
    43         System.out.println();
    44         System.out.println("before++Child()构造方法+++");
    45         test3();
    46         System.out.println("after++Child()构造方法+++");
    47         System.out.println();
    48         System.out.println();
    49     }
    50     
    51     @Override
    52     public void test3() {
    53         System.out.println();
    54         System.out.println("Child++test3()++++");
    55         System.out.println("childName++++" + childName);
    56         System.out.println("testName++++" + testName);
    57         System.out.println();
    58     }
    59     
    60 }
    ChildTest1
     1 package com.yitian.test.override;
     2 
     3 import org.junit.Test;
     4 
     5 import com.yitian.test.override.overload.ChildTest1;
     6 
     7 public class Test1 {
     8     
     9     @Test
    10     public void testride() {
    11         new ChildTest1();
    12         // new ParentTest1();
    13     }
    14     
    15 }
    Test1

    测试new ChildTest1();

    初始化子类,先判断有没有父类

    有父类先初始化父类

    父类执行构造方法前,先判断有没有静态变量,和静态块

    有静态变量,先初始化静态变量和静态快

    在判断子类有没有静态变量和静态块

    初始化子类静态变量,和静态块

    初始化父类变量

    初始化父类块

    初始化父类构造方法

    初始化子类变量

    初始化子类块

    初始化子类构造方法

    输出结果:


    parent初始化静态变量++++
    parent初始化静态块++++


    child初始化静态变量++++
    child初始化静态块++++


    parent++++初始化变量++++
    parent++++初始化块++++


    before++Parent()构造方法+++

    Child++test3()++++
    childName++++null
    testName++++null

    after++Parent()构造方法+++

    child++++初始化变量++++
    child++++初始化块++++


    before++Child()构造方法+++

    Child++test3()++++
    childName++++childName
    testName++++childTestName

    after++Child()构造方法+++

    因为子类重写了父类的方法,父类执行构造方法时,调用的方法是子类的,但是子类的变量还没有初始化,

    所以第一次初始化父类调用子类方法的时候输出为null

  • 相关阅读:
    React Native 触摸事件处理详解
    ReactNative iOS源码解析
    windows CMD命令大全及详细解释和语法
    Node.js的全局对象和全局变量
    移动端HTML5<video>视频播放优化实践
    HTML和CSS代码片段快速编写方式(Emmet Documentation)
    animate.css官网
    Gradle在大型Java项目上的应用
    Gradle学习系列
    Gradle -- buildScript块与allprojects块及根级别的repositories区别
  • 原文地址:https://www.cnblogs.com/tongs/p/7436171.html
Copyright © 2020-2023  润新知