对于构造方法,如果当前类不是Object类,而构造方法体内的第一条语句不是对本类或直接超类的另一个构造方法的显式调用,那么系统会隐含地假设该构造方法体由语句super();开始(也就是说在调用该构造方法时,系统首先会自动调用直接超类中不带形参的构造方法),若直接超类中没有不带形参的构造方法,或不带形参的构造方法是不可访问的,将导致编译错误。
例子:
class Example0506{
int i=10;
Example0506(int a){
j=a;
}
int j=20;
}
class Example0506_1 extends Example0506{
int k=j+10,l;
Example0506_1(){
super(5);
l=k+5;
}
}
class Test{
public static void main(String[] args){
Example0506_1 o=new Example0506_1();
System.out.println("i="+o.i+" j="+o.j);
System.out.println("k="+o.k+" l="+o.l);
}
}
执行是从主类中的main()方法中开始的,
第一步,执行其中的实例对象创建Example0506_1 o=new Example0506_1(); ,调用执行Example0506_1类中的构造方法,
第二步,当进入构造方法中遇到super(5);时,调用其超类Example0506()类中的构造方法,
第三步,进入构造方法后,由于第一条语句不是对本类或直接超类的另一个构造方法的显式调用,且其不是Object类,所以会隐含地假设该构造方法体由语句super();开始,进而调用根类Object中的构造方法,
第四步,在根类中执行完后,返回到类Example0506中,先对类中的所有实例变量初始化表达式,然后,执行此类中构造方法中的语句, 同理,在类Example0506中执行完后,返回到类Example0506_1中,先执行类中的所有实例变量初始化表达式,然后,执行此类中构造方法中的语句,
最后,返回到主类中执行其后的语句。
运行结果:
i=10 j=5
k=15 l=20
阅读(1444) | 评论(0) | 转发(0) |