关于静态代码块,非静态代码块,构造函数的多态表现问题

    xiaoxiao2026-10-05  2

    先看一段代码

    public class Test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Parent p = new Child(); System.out.println(p.age); p.print(); } } public class Parent { int age = 25; static{ System.out.println("这里是父类的静态初始化块"); } { System.out.println("这里是父类的非静态初始化块"); } public Parent(){ System.out.println("这里是父类的构造函数"); } public void print() { System.out.println("这里是父类"); } } public class Child extends Parent { int age = 10; static{ System.out.println("这里是子类的静态初始化块"); } { System.out.println("这里是子类的非静态初始化块"); } public Child(){ System.out.println("这里是子类的构造函数"); } public void print() { System.out.println("这里是子类"); } }

    关于静态代码块大家都知道,当类的对象创建的时候首次加载并且只加载一次,其次是非静态代码块,最后是构造函数。输出是这样的:

    这里是父类的静态初始化块 这里是父类的非静态初始化块 这里是父类的构造函数 25 这里是父类

    那么继承此类后也就是这里的Child();当父类的引用指向子类的实例对象的时候,这时的输出是这样的:

    这里是父类的静态初始化块 这里是子类的静态初始化块 这里是父类的非静态初始化块 这里是父类的构造函数 这里是子类的非静态初始化块 这里是子类的构造函数 25 这里是子类

    可以发现子类的静态初始化块先于父类的非静态初始化块,为什么,参考: http://blog.csdn.net/xuxurui007/article/details/7749671

    可知:要看类中是否有静态的变量和语句,如果有,先给这些静态的变量分配存储空间和执行静态语句(不是静态方法),且由于类的父类中也有静态的变量,根据继承的特性,则先执行父类Parent的静态数据的初始化,然会执行子类的静态数据的初始化。

    总结: 有静态就先静态(先父后子),(非静态+构造函数)(先父后子);

    父->子。静态>非静态>构造。

    转载请注明原文地址: https://ju.6miu.com/read-1312659.html
    最新回复(0)