恳请各位高手讲解一下,这个程序为什么运行结果会是这个样子
class A{
public int Avar;
public A(){
System.out.println("AAA");
doSomething();
}
public void doSomething(){
Avar=1111;
System.out.println("A.doSomething()");
}
}public class B extends A{
public int Bvar=2222;
public B(){
System.out.println("BBB");
doSomething();
System.out.println("Avar="+Avar);
}
public doSomething(){
System.out.println("Bvar="+Bvar);
}
public static void main(String[] args){
new B();
}
}
运行结果为:
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 B extends A{
public int Bvar=2222;
public B(){
System.out.println("BBB");
doSomething();
System.out.println("Avar="+Avar);
}
public doSomething(){
System.out.println("Bvar="+Bvar);
}
public static void main(String[] args){
new B();
}
}
运行结果为:
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
2.默认初始值
3.初始化时间
2。dosomething 因为Bvar还没初始化 所以Bvar的默认值是0 ===》》Bvar=0
3。初始化int Bvar=2222;
4。B() ===》》BBB Bvar=2222 因为A的doSomething没被调用,所以Avar=0
Bvar=0 由于基类的构造函数调用了doSomething,而B又override了doSomething,实际调用的是B 的doSomething
BBB 然后再开始执行B()的代码,
Bvar=2222 这时候Bvar已经初始化为2222
Avar=0 默认初始化为0
public int Avar=1111; //进行初始化
public A(){ //执行构造函数
doSomething(); //执行动态绑定调用被复写的函数 第一个显示Bvar_B()=0
System.out.println("AAA_A()");//第二个显示
System.out.println("Avar_A()="+Avar);//第三个显示Avar_A()=1111 }
public void doSomething(){
Avar=9999;
System.out.println("A.doSomething()");
}
}public class B extends A{ //再开始加载类B
public int Bvar=2222; //初始化.......后面你就应该知道了吧,不废话了
public B(){
System.out.println("BBB_B()");
System.out.println("Avar_B()="+Avar);
doSomething();
}
public void doSomething(){
System.out.println("Bvar_B()="+Bvar);
}
public static void main(String[] args){
new B();
}
}
System.out.println("Bvar="+Bvar);
}
这个方法是不是有问题?没有返回类型,又不是构造器!
我还想请教一下,为什么class A中的doSomething()被override(越过)了,没有被执行
public int Avar=1111; //由于A类的加载引起它的字段的初始化
public A(){ //由于函数B()会根据继承关系会继承并执行构造函数A()
doSomething(); //虽然是A()的函数但是根据执行动态绑定执行的是被类B复写的
//函数所以第一个显示Bvar_B()=0(因为B类还没有初始化
// 所以Bvar_B()=0)
System.out.println("AAA_A()");//继续执行,第二个显示
System.out.println("Avar_A()="+Avar);//继续执行第三个显示Avar_A()=1111,
//A()构造函数执行完毕,执行B()构造函数 }
public void doSomething(){
Avar=9999;
System.out.println("A.doSomething()");
}
}public class B extends A{ //再开始加载类B
public int Bvar=2222; //初始化.......后面你就应该知道了吧,不废话了
public B(){
System.out.println("BBB_B()");
System.out.println("Avar_B()="+Avar);
doSomething();
}
public void doSomething(){
System.out.println("Bvar_B()="+Bvar);
}
public static void main(String[] args){
new B();
}
}产生的是 new B();调用的方法也跟B挂钩,就不会执行A的方法....动态绑定
楼主,可以结贴了吧