zoukankan      html  css  js  c++  java
  • java 类属性的加载顺序(带有继承关系的)

    工作有三年之久了,突然感觉带有继承关系、父子俩既有静态变量又有成员变量的情况,变量的加载顺序很容易混淆,今晚写了个例子,总算是把关系搞清楚了

    例子中,父类既有普遍的成员变量,也有static变量,也有static代码块,在父类的构造器前后都有static变量及普通变量,让我们看看初始化子类的时候会发生什么吧

    先提供完整代码:

    LoadSequence.java

    public class LoadSequence {
        public static void main(String[] args) {
            new LsSon();
            
        }
    }
    
    class PrintObj {
        public PrintObj(String str) {
            System.out.println(str);
        }
    }
    
    class LsFather {
        static PrintObj po1 = new PrintObj("LsFather static new 1 ");
    
        PrintObj po2 = new PrintObj("LsFather new 2 ");
        
        static {
            System.out.println("LsFather static");
        }
    
        public LsFather() {
            System.out.println("LsFather()");
        }
    }
    
    class LsSon extends LsFather {
        static PrintObj po3 = new PrintObj("LsSon static new 3 ");
    
        PrintObj po4 = new PrintObj("LsSon new 4 ");
    
        static {
            System.out.println("LsSon static");
        }
    
        public LsSon() {
            System.out.println("LsSon()");
        }
        
        static PrintObj po5 = new PrintObj("LsSon static new 6 ");
        
        PrintObj po6 = new PrintObj("LsSon new 6 ");
    
    }
    View Code

    执行结果如下:

    LsFather static new 1
    LsFather static
    LsSon static new 3
    LsSon static
    LsSon static new 6
    LsFather new 2
    LsFather()
    LsSon new 4
    LsSon new 6
    LsSon()

    由于可知:

    带有继承关系的,实例化子类时,加载顺序如下:

    父类static标识的代码,按顺序自上而下全部执行  ->  子类static标识的代码,按顺序自上而下全部执行

    ->父类成员变量加载 -> 父类构造函数 -> 子类成员变量加载 -> 子类构造函数

  • 相关阅读:
    Spark参数优化
    Spark性能优化指南
    Durid的特点
    优秀博客地址
    Kylin的特点
    2017/11/20
    堆、栈、静态存储
    arraylist 和 linkedlist 的区别
    青岛项目遇到的问题
    access specifier
  • 原文地址:https://www.cnblogs.com/goldeneast/p/6049414.html
Copyright © 2011-2022 走看看