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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李志广 中级黑马   /  2012-7-3 17:37  /  1413 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 007lzg 于 2012-7-3 21:47 编辑

class Root
{
        static
                {
                System.out.println("Root 的静态初始块化");
                }
                {
                System.out.println("Root 的普通初始块化");
                }
                public Root()
                        {
                        System.out.println("Root 的无参数的构造器");
                        }
}
class Mid extends Root
{
        static
                {
                System.out.println("Mid 的静态初始块化");
                }
                {
                System.out.println("Mid 的普通初始块化");
                }
                public Mid()
                        {
                        System.out.println("Mid 的无参数的构造器");
                        }
                        public Mid(String msg)
                                {
                                this();
                                System.out.println("Mid的带参数的构造器,其参数值是:"+msg);
                                }
}
class Leaf extends Mid
{
        static
                {
                System.out.println("Leaf 的静态初始块化");
                }
                {
                System.out.println("Leaf 的普通初始块化");
                }
                public Leaf()
                        {
                        super("Struts 权威指南");
                        System.out.println("执行Leaf的构造器");
                        }

}
public class Test
{
        public static void main(String[] args)
                {
                new Leaf();
                new Leaf();
                }
}
为什么两次打印的结果不同,打印流程到底是什么样的啊?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 这个是常被忽略的代码执行顺序问题,赞一个.

查看全部评分

3 个回复

正序浏览
耿鑫 发表于 2012-7-3 18:25
首先执行静态代码块,然后是普通代码块,接着执行构造方法。静态代码块在类被加载的时候执行,而构造方法和 ...

谢谢,写的很详细!
回复 使用道具 举报
首先执行静态代码块,然后是普通代码块,接着执行构造方法。静态代码块在类被加载的时候执行,而构造方法和普通代码块是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到java虚拟机上(JVM),然后由JVM加载这个类来生成对象。类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而普通代码块和构造方法则不然,每次生成一个对象的时候都会调用类的普通代码块和构造方法,所以new一次就会调用普通代码块和构造方法一次。如果继承体系中既有构造方法和普通代码块,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的普通代码块和构造方法,一直执行到最底层类的普通代码块和构造方法。特别强调静态代码块只会执行一次。

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
静态代码块只执行一次,所以第二个new Leaf()比第一个少了三段静态代码块的输出
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马