public class Son1 extends Father {
static
{
System.out.println("a");
}
public Son1() {
System.out.println("1");
}
public static void main(String[] args) {
Son1 son=new Son1();
son=new Son1();
}}class Father {
static
{
System.out.println("b");
}
public Father() {
System.out.println("2");
} }
请问其执行流程是怎么样的,为什么会这样啊
static
{
System.out.println("a");
}
public Son1() {
System.out.println("1");
}
public static void main(String[] args) {
Son1 son=new Son1();
son=new Son1();
}}class Father {
static
{
System.out.println("b");
}
public Father() {
System.out.println("2");
} }
请问其执行流程是怎么样的,为什么会这样啊
楼主在当前的程序中只要明白二点即可:
1.子类构造时必先执行其父类构造函数
2.静态块先于构造函数执行
但这个程序对类的加载及初始化的说明还是具有很大的局限性,你现在这个程序中只有静态块,如果再有非静态块的,又会让你傻了眼所以楼主可以百度一下:java类加载顺序
以便详细了解其执行过程
这个是sun规定的没有什么为什么
b
a
2
1
2
1Son1 son=new Son1();
首先调用父类Father的静态代码块,再调用自己的静态代码块,接着调用父类Father的构造函数,再调用自己的构造函数(总是优先调用父类的,而且静态代码块优先于构造函数)
son=new Son1();
静态代码块只会被调用一次,即初始化一次后就不再调用,所以此处直接调用父类Father的构造函数,再调用自己的构造函数
是无论新建多少对象,静态代码块只调用一次,而代码块可以多次调用。