以文本方式查看主题

-  课外天地 李树青  (http://www.njcie.com/bbs/index.asp)
--  清心茶舍  (http://www.njcie.com/bbs/list.asp?boardid=21)
----  [求助]类的继承问题  (http://www.njcie.com/bbs/dispbbs.asp?boardid=21&id=868)

--  作者:信管07151
--  发布时间:2010/4/9 12:45:10
--  [求助]类的继承问题

class  Foo{
    public int a;
    public Foo(){
        a=3;
    }
    public void addFive(){
        a+=5;
    }
}
class Bar extends Foo{
    public int a;
    public Bar(){
        a=8;
    }

    public void addFive(){
         this.a+=5;
    }
}
public class Test2 {
  public static void main(String[] args){
      Foo  f = new Bar();
     f.addFive();
      System.out.println(f.a);
  }
}

为什么输出地是3?怎样理解Foo  f=new  Bar()?

[此贴子已经被admin于2010-12-13 20:19:05编辑过]

--  作者:admin
--  发布时间:2010/4/10 14:11:50
--  回复

Bar继承Foo,Bar中有两个a,一个继承来的,一个自己定义的;Bar中有两个addFive,一个继承来的,一个自己定义的

Foo f = new Bar();语法是可以的,因为子类对象可以看成是父类对象,因此被父类引用变量指向,但是此时如果调用addFive,默认调用子类自己的addFive,此乃多态;而调用变量a,则默认还是继承来的a,所以是3。

你可以试一试下面的代码,看看输出就知道原因了:

class Foo {
        public int a;

        public Foo() {
                a = 3;
        }

        public void addFive() {
                System.out.println("Foo\'s a is " + a);
                a += 5;
        }
}

class Bar extends Foo {
        public int a;

        public Bar() {
                a = 8;
        }

        public void addFive() {
                System.out.println("Bar\'s a is " + a + ":Foo\'s a is " + super.a);
                this.a += 5;
        }
}

public class Exec {
        public static void main(String[] args) {
                Foo f = new Bar();
                f.addFive();
                System.out.println(f.a);
        }
}


 

[此贴子已经被作者于2010-12-13 20:19:22编辑过]