当前位置: 技术问答>java相关
执行结果是什么?
来源: 互联网 发布时间:2015-02-08
本文导语: 看到一段代码,不知为什么是这个结果,大家有兴趣帮俺看看 class A{ public int Avar; public A(){ System.out.println("AAA"); dosomething(); } public void dosomething(){ Avar=1111; System.out.println("a.dosomething()"); } } public class orde...
看到一段代码,不知为什么是这个结果,大家有兴趣帮俺看看
class A{
public int Avar;
public A(){
System.out.println("AAA");
dosomething();
}
public void dosomething(){
Avar=1111;
System.out.println("a.dosomething()");
}
}
public class order2 extends A
{
public int Bvar=2222;
public order2(){
System.out.println("BBB");
dosomething();
System.out.println("Avar="+Avar);
}
public void dosomething(){
System.out.println("Bvar="+Bvar);
}
public static void main(String[] args){
new order2();
}
}
执行结果是
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
class A{
public int Avar;
public A(){
System.out.println("AAA");
dosomething();
}
public void dosomething(){
Avar=1111;
System.out.println("a.dosomething()");
}
}
public class order2 extends A
{
public int Bvar=2222;
public order2(){
System.out.println("BBB");
dosomething();
System.out.println("Avar="+Avar);
}
public void dosomething(){
System.out.println("Bvar="+Bvar);
}
public static void main(String[] args){
new order2();
}
}
执行结果是
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
|
记住继承类的初值化的次序:
1。进入基类CONSTRUCTOR,初值化基类变量:
进入A的CONSTRUCTOR,Avar = 0;
2。执行基类CONSTRUCTOR的BODY:
System.out.println("AAA"); ==> 输出 AAA
dosomething(); ==> 调用 B::dosomething(),继承类变量还没有初值化,确省值是0
==>输出 Bvar=0
3。初值化继承类变量
Bvar = 2222
4。执行继承类CONSTRUCTOR的BODY
System.out.println("BBB"); ==> 输出BBB
dosomething(); 调用 B::dosomething(),继承类变量已经初值化,Bvar = 2222
==>输出 Bvar=2222
System.out.println("Avar="+Avar);
==>输出 Avar=0
1。进入基类CONSTRUCTOR,初值化基类变量:
进入A的CONSTRUCTOR,Avar = 0;
2。执行基类CONSTRUCTOR的BODY:
System.out.println("AAA"); ==> 输出 AAA
dosomething(); ==> 调用 B::dosomething(),继承类变量还没有初值化,确省值是0
==>输出 Bvar=0
3。初值化继承类变量
Bvar = 2222
4。执行继承类CONSTRUCTOR的BODY
System.out.println("BBB"); ==> 输出BBB
dosomething(); 调用 B::dosomething(),继承类变量已经初值化,Bvar = 2222
==>输出 Bvar=2222
System.out.println("Avar="+Avar);
==>输出 Avar=0
|
你在main方法中实例化了order2,而order2继承了A类,A类的构造函数中先输出AAA然后调用了dosomething方法,但dosomething方法在order2类中被覆盖了,所以实际调用的是order2的dosomething方法,这时bvar是0,然后order2开始调用构造函数进行初始化,给bvar=2222,输出BBB调用dosomething()输出bvar=2222然后再输出avar,由于A类的dosomething()被order2覆盖,所以avar=0.
不知道各位是否认同?不对之处还请其他大侠指教
不知道各位是否认同?不对之处还请其他大侠指教