A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大笑哈哈 中级黑马   /  2016-6-18 22:56  /  350 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.heima.day23;

public class Test9 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                new Child();
        }

}
class bb {
        public bb(){
                System.out.println("bb");
        }
}
class Parent
{       
         
    public static int t = parentStaticMethod2();
    {
        System.out.println("父类非静态初始化块");
    }
    bb b = new bb();
    static
    {
        System.out.println("父类静态初始化块");
    }
    public Parent()
    {
        System.out.println("父类的构造方法");
    }
    public static int parentStaticMethod()
    {
        System.out.println("父类类的静态方法");
        return 10;
    }
    public static int parentStaticMethod2()
    {
        System.out.println("父类的静态方法2");
        return 9;
    }
}

  class Child extends Parent
{
     {
         System.out.println("子类非静态初始化块");
     }
     static
     {
         System.out.println("子类静态初始化块");
     }
     public Child()
     {
         System.out.println("子类的构造方法");
     }
     public static int childStaticMethod()
     {
         System.out.println("子类的静态方法");
         return 1000;
     }
}
以下为结果:
父类的静态方法2
父类静态初始化块
子类静态初始化块
父类非静态初始化块
bb
父类的构造方法
子类非静态初始化块
子类的构造方法
程序说明
1,父类优先子类加载 , 加载完毕后加载子类class文件
2,执行子类构造函数之前先对父类对象初始化.父类的初始化为时, 父类属性 构造代码块以在程序位置先后执行(不一定是构造方法之前执行构造代码块)
最后执行构造方法对父类属性进行显示初始化 .
附:   
一个网上的说法,感觉很实用,但是第三点与程序执行结果相驳.

我给你一个最全的顺序,按这个顺序去分析:

  • 类加载过程(静态属性、静态方法声明-----静态属性赋值、静态块)注意先父类后子类
  • 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块----构造方法中的代码)也是先父类后子类
  • 如果在类加载过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马