黑马程序员技术交流社区
标题:
打印顺序?
[打印本页]
作者:
李志广
时间:
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