黑马程序员技术交流社区
标题:
执行顺序
[打印本页]
作者:
孙地豪
时间:
2012-3-22 00:46
标题:
执行顺序
public class F {
static {
System.out.println("父类的静态代码块");
}
{
System.out.println("父类非静态代码块");
}
public F() {
System.out.println("父类的构造器");
}
}
public class C extends F {
static F f = new F();
static {
System.out.println("子类的静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public C() {
System.out.println("子类的构造器");
}
public static void main(String[] args) {
C c = new C();
}
}
有点晕,,,,,,,
作者:
林翔
时间:
2012-3-22 01:00
父类的静态代码块
父类非静态代码块
子类的静态代码块
子类非静态代码块
子类的构造器
作者:
朱亚安
时间:
2012-3-22 01:23
首先static{}是静态初始化块,这个只是在第一次进行初始化;{}是初始化块,每次都会初始化;
执行的顺序是:
一。在第一次使用类的时候,先加载类,然后初始化静态数据成员,接着执行类的静态初始化块;
二,在new对象的时候:
①调用父类的构造方法;
②初始化实例数据域,执行对象初始化块;
③执行构造方法;
在看程序:
①首先按照上面的原则,应该先加载类,然后初始化静态数据成员,在子类中有 static F f = new F();
就是执行new一个父类的对象,new的时候同样看上面的原则,应该先执行静态初始化块,然后执行初始化块在执行构造方法;
所以首先输出是:父类的静态代码块
父类非静态代码块
父类的构造器
②接着就是加载静态初始化块了,由于父类的静态块已经初始化过了,所以现在初始化子类的静态初始化块
所以在输出:子类的静态代码块
③接着就是调用构造方法来生成对象了,调用子类的构造首先要调用父类的构造,在调用父类构造的时候,会先执行初始化快,然后再执行构造方法
接着输出:父类非静态代码块
父类的构造器
执行完父类的构造就得执行子类的构造了,同样的规则,先执行初始化块,在执行构造方法
最后输出:子类非静态代码块
子类的构造器
作者:
贠(yun)靖
时间:
2012-3-22 02:01
执行先后顺序
1静态代码块给类初始化 2(默认初始化然后再显示初始化)构造代码块给对象初始化 3构造函数给对应对象初始化
按照先后顺序判断,先把 static F f = new F();这句注释掉,比较好判断
注释掉后,按照原理静态最先执行,c是子类,f是父类,优先执行父类的静态代码。然后是子类的代码。
接下来是是构造代码块了,又因为子类构造函数super了父类的构造函数,所以父类构造函数优先于子类
的构造代码块,所以接下来是父类构造代码块 父类构造函数 子类构造代码块 子类构造
这是不加static F f = new F();这句的最终结果
父类的静态代码块
子类的静态代码块
父类非静态代码块
父类的构造器
子类非静态代码块
子类的构造器
而加这句static F f = new F() 显然难度大了很多,但还是按照静态最先执行的原则。
static F f = new F()这句肯定要执行,所以父类的三个函数都要执行,顺序是
父类的静态代码块
父类非静态代码块
父类的构造器
而静态代码块只能执行一次的原则 现在的父类静态代码块就不执行了所以下来就是
子类静态代码块
下面的顺序和上面那个判断是一样的。结果是
父类非静态代码块
父类的构造器
子类非静态代码块
子类的构造器
所以最终结果是
父类的静态代码块
父类非静态代码块
父类的构造器
子类的静态代码块
父类非静态代码块
父类的构造器
子类非静态代码块
子类的构造器
作者:
朱俊
时间:
2012-3-22 02:13
本帖最后由 朱俊 于 2012-5-16 14:59 编辑
~~~~~~~~~~~~~~~~~~~~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2