请JAVA高手解释下这道题目的输出结果

class Base{

int i;

Base(){

add(1);

System.out.println(i);

}

void add(int v){

i+=v;

System.out.println(i);

}

void print(){

System.out.println(i);

}

}

class MyBase extends Base{

MyBase(){

add(2);

}

void add(int v){

i+=v*2;

System.out.println(i);

}

}

public class TestClu {

public static void main(String[] args) {

go(new MyBase());

//System.out.println();

}

static void go(Base b){

b.add(8);

//b.print();

}

}

输出结果是 2 、2、6、22
请高手解释下四个结果怎么得来的.解释详细再加15分.
没人来帮忙吗,郁闷可能我的程序粘贴的空间太大了,麻烦高手粘贴到记事本啊.帮忙看下.

废话不说了,从main进入,然后从static void go(Base b) 方法看起,
调go这个方法的时候,参数是一个MyBase对象,
那么先要创建MyBase对象,而new一个对象的时候当然要调用构造函数,但是如果他有父类,则会先调他的父类的构造函数。(因为子类对象始终可以算是父类的一个对象,先要构造一个父类对象然后再加适当修饰就编程子类对象了。
举个不恰当的例子,比如new一个学生,则先要new一个人,然后再加一些适当的修饰,那么这个人就编程学生了。)

因此执行Base的构造函数里的语句
add(1);
add(1)执行的结果是让i=2,然后输出i
add(1)后再执行一个System.out.println(i);结果又输出一次i
结果是输出两个2

接下来执行MyBase的构造函数,
只有一条add(2);
i += v * 2;====> i=i+v*2 ===>i=i+4====>i=6(i从父类继承而来,上面说过已经是2了)
于是输入了6

构造完MyBase对象后,在TestClu的go方法中,做为参数,因为这个参数实质上是MyBase对象(虽然他被赋给一个Base对象),这个就是多态,或者说java里叫动态联编,那么调用该对象add方法的时候,仍然是调用了MyBase里的add,
又是一个i += v * 2;此时v是8,6+8*2===>22
输出了22

我觉得说的够详细了吧,要是还不明白就留个言好了
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-08-23
i是一个全局变量,他的作用域是整个类,在子类中的也是有作用
相似回答
大家正在搜