原文地址:Java的块,静态块,构造函数,继承的执行先后顺序
作者:0503dtjj
public class Test
{
public static void main(String []agrs)
{
Son son = new Son();
}
}
class Super
{
public Super()
{
System.out.print("At");
}
{
System.out.print("Bt");
}
static
{
System.out.print("Ct");
}
}
class Son extends Super
{
public Son()
{
System.out.print("Dt");
}
{
System.out.print("Et");
}
static
{
System.out.print("Ft");
}
}
静态的东西是属于类的,非静态的东西是属于实例的。
静态的先执行,然后才是非静态的。
在上例中,还要考虑继承的问题。
首先是父类静态 --> C
然后是子类静态 --> F
非静态区块可以看作是构造函数中执行完父类构造函数后的第一部分。(构造函数第一行有一个默认的super()调用,就是调用父类构造函数)。
这个时候执行父类构造函数:
父类非静态区块 --> B
父类构造函数块 --> A
然后是子类构造函数:
子类非静态区块 --> E
子类构造函数块 --> D
总结一下就是:
C F B A E D
值得注意的是,静态的东西只会执行一次,就是在类加载的时候。
如果我们在上例中修改main函数为:
Java code
public static void main(String[] agrs) { Son son = new Son(); Son son2 = new Son();}
这个时候的执行结果为:
C F B A E D B A E D
可以看到第二次创建Son实例的时候,静态的东西不会再次执行。
{
public static void main(String []agrs)
{
Son son = new Son();
}
}
class Super
{
public Super()
{
System.out.print("At");
}
{
System.out.print("Bt");
}
static
{
System.out.print("Ct");
}
}
class Son extends Super
{
public Son()
{
System.out.print("Dt");
}
{
System.out.print("Et");
}
static
{
System.out.print("Ft");
}
}
静态的东西是属于类的,非静态的东西是属于实例的。
静态的先执行,然后才是非静态的。
在上例中,还要考虑继承的问题。
首先是父类静态 --> C
然后是子类静态 --> F
非静态区块可以看作是构造函数中执行完父类构造函数后的第一部分。(构造函数第一行有一个默认的super()调用,就是调用父类构造函数)。
这个时候执行父类构造函数:
父类非静态区块 --> B
父类构造函数块 --> A
然后是子类构造函数:
子类非静态区块 --> E
子类构造函数块 --> D
总结一下就是:
C F B A E D
值得注意的是,静态的东西只会执行一次,就是在类加载的时候。
如果我们在上例中修改main函数为:
Java code
public static void main(String[] agrs) { Son son = new Son(); Son son2 = new Son();}
这个时候的执行结果为:
C F B A E D B A E D
可以看到第二次创建Son实例的时候,静态的东西不会再次执行。
本文章来自
http://d-y-zh.javaeye.com/blog/607027谢谢源作者