标题: 执行顺序问题 [打印本页] 作者: hel 时间: 2013-11-3 00:03 标题: 执行顺序问题 public class Problem {
public static void main(String[] args) {
A ab=new B();
new B();
}
}
public class A{
static {
System.out.println("1");
}
public A(){
System.out.println("A");
}
}
public class B extends A{
static {
System.out.println("2");
}
public B(){
System.out.println("B");
}
}
再继续执行主函数中的new B();代码, 因为之前已经加载了AB类 因此不再执行静态代码块 打印 A B
最后结果:
1
2
A
B
A
B作者: 回天之力 时间: 2013-11-3 08:45
对象初始化过程:
1、 如果存在继承关系,就先父类后子类;
2 、如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数;
3 、继承关系中,必须要父类初始化完成后,才初始化子类。作者: Cheers_for_CRAZ 时间: 2013-11-3 09:28
当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:
父类静态代码块 > 子类静态代码块
父类构造函数 > 子类构造函数(先有父亲,后有孩子)
如果是多级继承关系的话,最高层的父类首先执行,然后依次递减
总结:静态优先执行,父类优先执行
注意:静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次
构造方法和静态代码块的区别
静态代码块 当且仅当第一次执行的时候才执行,一般用于初始化。
而构造方法 是每次new对象的时候都执行,也是初始化
二者的区别在于 一个是仅执行一次 另一个是每次new对象的时候执行作者: 黄炳期 时间: 2013-11-3 09:37
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接 http://bbs.itheima.com/thread-89313-1-1.html作者: 冯国强 时间: 2013-11-3 17:39
public class Problem
{
public static void main(String[] args)
{
A ab=new B();
new B();
}
}
public class A
{
static
{
System.out.println("1");
}
public A()
{
System.out.println("A");
}
}
public class B extends A
{
static
{
System.out.println("2");
}
public B()
{
System.out.println("B");
}
}
该程序从开始执行,先执行A ab=new B();其中执行顺序是加载了A,B两个对象。原因是B继承A
所以先从A类中执行,先执行static{System.out.println("1");};static{System.out.println("2");};原因是静态代码块随着类的加载而加载优先于对象存在
然后执行public A(){System.out.println("A");} 最后执行类B中的构造函数public A(){System.out.println("B");}原因是B继承A,应先执行父类构造函数,查看父类是如何对这些数据进行初始化。所以结果是
1
2
A
B
后执行new B();其中执行顺序为先执行public A(){System.out.println("A");}后执行public A(){System.out.println("B");}原因是静态代码块是随着类的加载而执行,只执行一次,因此这次不执行静态代码块,而执行构造函数,构造函数执行顺序和上面原因一样。结果是
A
B