黑马程序员技术交流社区

标题: 打印顺序? [打印本页]

作者: 李志广    时间: 2012-7-3 17:37
标题: 打印顺序?
本帖最后由 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();
                }
}
为什么两次打印的结果不同,打印流程到底是什么样的啊?

作者: 李伟    时间: 2012-7-3 18:15
静态代码块只执行一次,所以第二个new Leaf()比第一个少了三段静态代码块的输出
作者: 耿鑫    时间: 2012-7-3 18:25
首先执行静态代码块,然后是普通代码块,接着执行构造方法。静态代码块在类被加载的时候执行,而构造方法和普通代码块是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到java虚拟机上(JVM),然后由JVM加载这个类来生成对象。类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而普通代码块和构造方法则不然,每次生成一个对象的时候都会调用类的普通代码块和构造方法,所以new一次就会调用普通代码块和构造方法一次。如果继承体系中既有构造方法和普通代码块,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的普通代码块和构造方法,一直执行到最底层类的普通代码块和构造方法。特别强调静态代码块只会执行一次。
作者: 李志广    时间: 2012-7-3 18:50
耿鑫 发表于 2012-7-3 18:25
首先执行静态代码块,然后是普通代码块,接着执行构造方法。静态代码块在类被加载的时候执行,而构造方法和 ...

谢谢,写的很详细!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2