①初始化语句块{}先于constructor初始化。(只要构造了类的一个对象,初始化块{}就会被执行,而且初始化块{}先于构造函数执行)。
- public class A {
-
{
-
System.out.println("hello");
-
}
-
A()
-
{
-
System.out.println("constructor");
-
}
-
{
-
System.out.println("test");
-
}
-
public static void main(String[] args)
-
{
-
A a=new A();
-
}
-
}
output:
hello
test
constructor
②
- public class Insect {
-
private int i=9;
-
protected int j;
-
Insect()
-
{
-
System.out.println("i="+i+","+"j="+j);
-
j=39;
-
}
-
private static int x1=printInit("static Insect.x1 initialized");
-
static int printInit(String s)
-
{
-
System.out.println(s);
-
return 47;
-
}
-
int a=print(88);
-
int print(int b)
-
{
-
System.out.println(b);
-
return b;
-
}
-
}
-
-
public class Beetle extends Insect{
-
private int k=printInit("Beetle.k initialized");
-
Beetle()
-
{
-
System.out.println("k="+k);
-
System.out.println("j="+j);
-
-
}
-
private static int x2=printInit("Beetle.x2 initialized");
-
public static void main(String[] args)
-
{
-
System.out.println("Beetle constructor");
-
Beetle b=new Beetle();
-
}
-
-
}
output:
static Insect.x1 initialized
Beetle.x2 initialized
Beetle constructor
88
i=9,j=0
Beetle.k initialized
k=47
j=39
编译流程:
1.找main(),在执行main()里面的代码前,先对static初始化。从父类到子类,找到x1和x2,输出 “static Insect.x1 initialization”和” static Insect.x1 initialization”。(P.S 先初始化static,再初始化non-static)。
2.main()里面的代码,输出”Beetle consturctor”。
3.化Beetle(),找到父类Insect(),先初始化其父类。(P.S 先初始化变量,再初始化方法)。
4.初始化Insect,i等于9,j等于0,然后是Insect()。(P.S 由于static不属于任何对象,而是属于某一个类,所以不需要再次初始化)。
5.初始化Beetle,输出k,最后是Beetle()。
阅读(877) | 评论(0) | 转发(0) |