JVM虚拟机不允这种情况出现
一.当程序如下时,执行结果是: fu-空构造函数 run
zi-空构造函数 run
zi...3
60
当主函数执行 Zi z = new Zi(3);这句代码时,调用顺序是:
1.子类建立new Zi(3);对象时,先调用子类中与之对应的构造函数,也就是Zi(int x)
2.此构造函数第一行代码时 this(),接下来会调用空参数的构造函数Zi();
因为第一行存在了this()语句,所以不可能再存在隐式的super()语句
3.空参数构造函数Zi()的第一行有一个隐式的super()语句,所以程序会执行父类中的空参数构造函数Fu();
4.在Fu()中,首先会把60赋给变量num,然后执行SOP语句,结果是:fu-空构造函数 run
5.然后执行Zi()中的SOP语句,结果是:zi-空构造函数 run
6.接下来程序会回到Zi(3)构造函数中执行SOP语句,结果是: zi...3
7.最后执行主函数中的SOP语句:num=60,因为在执行Fu()时,已经给num赋值了
class Fu
{
int num ;
Fu()
{
num= 60;
System.out.println("fu-空构造函数 run");
}
Fu(int x)
{
System.out.println("fu ...."+x);
}
}
class Zi extends Fu
{
Zi()
{
System.out.println("zi-空构造函数 run");
}
Zi(int x)
{
this();
System.out.println("zi..."+x);
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
Zi z = new Zi(3);
System.out.println("num="+z.num);
}
}
二,当程序如下时,执行结果是:
fu...3
zi...3
num=0
下面的代码跟上面代码的区别就是程序没有执行父类中的空参数构造函数,所以就没有对num进行赋值,
num的打印值是默认的值0
class Fu
{
int num ;
Fu()
{
num= 60;
System.out.println("fu-空构造函数 run");
}
Fu(int x)
{
System.out.println("fu..."+x);
}
}
class Zi extends Fu
{
Zi()
{
System.out.println("zi-空构造函数 run");
}
Zi(int x)
{
super(x);
System.out.println("zi..."+x);
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
Zi z = new Zi(3);
System.out.println("num="+z.num);
}
}
三,如果在子父类中定义有各自的静态代码块和构造代码块
程序的执行顺序
父类的静态代码块--子类的静态代码块---父类的构造代码块--父类的构造函数--子类的构造代码块--子类的构造函数
class Fu
{
int num ;
static
{
System.out.println("fu-静态代码块 run");
}
{
System.out.println("fu-构造代码块 run");
}
Fu()
{
num= 60;
System.out.println("fu-空构造函数 run");
}
Fu(int x)
{
System.out.println("fu..."+x);
}
}
class Zi extends Fu
{
static
{
System.out.println("zi-静态代码块 run");
}
{
System.out.println("zi-构造代码块 run");
}
Zi()
{
System.out.println("zi-空构造函数 run");
}
Zi(int x)
{
super(x);
System.out.println("zi..."+x);
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
Zi z = new Zi(3);
System.out.println("num="+z.num);
}
}