本帖最后由 朱玺 于 2013-3-10 14:06 编辑
对象的初始化顺序:
首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:
子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
public class Test2
{
static String a = "string - a"; //2,静态变量a=string-a加载
static String b; //3,静态变量b=null加载
String c = "string -c";
String d;
static
{
printStatic("before static"); //4,静态代码块:优先执行,调用printStatic();
b = "string -b"; //8,执行b
printStatic ("after static"); //9,调用printStatic();
}
public static void printStatic(String title)
{
System.out.println("-------"+title+"-------"); //5,输出---before static----- //10,输出-----after static-----
System.out.println("a ="+a); //6,输出a =string - a //11,输出a =string - a
System.out.println("b ="+b); //7,输出b =null //12,b =string -b
}
public Test2() //执行构造函数··下面与上面类似调用
{
print("before constructor");
d = "string -d";
print ("after constructor");
}
public void print(String title)
{
System.out.println("------------"+title+"------------");
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
}
public static void main(String args[])
{
new Test2(); // 1, 先执行
}
}
|