A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何伟 中级黑马   /  2012-12-25 18:59  /  2333 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class A {
  void fun1() {
    System.out.println(fun2());
  }
  int fun2() {
    return 123;
  }
}
class B extends A {
  int fun2() {
    return 456;
  }
  public static void main(String[] args) {
    A a;
    B b = new B();
        b.fun1();
    a = b;
        a.fun1();
  }
}


为什么打印的结果是两个456呢?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

8 个回复

倒序浏览
首先,b.fun1();调用的是子类B里面的fun1(),这个fun1是继承自父类A类,
然后,a=b;相当于A a = new B();这里用到了多态,父类引用指向子类对象,所以,当调用a.fun1();调用的是子类对象里面的fun1()。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
李敬卫 来自手机 中级黑马 2012-12-25 19:21:40
藤椅
子类复写父类的fun2(),之后子类的对象b调用fun1()方法输出复写后的方法,结果返回456,然后对象b赋值给父类的对象a,所以现在可以把a看作是b,当然也就返回456

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报


已经明确标注了

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
这里有个重点就是:B的fun2()方法复写了A的fun2()方法
当B继承A时相当于B有了A的两个方法,但B对fun2()进行了复写,在用B的对象调用fun2()时,执行复写后的方法,即B的方法。若用A的对象调用则执行A的方法。
  public static void main(String[] args) {
    A a;
    B b = new B();
        b.fun1();
    a = b;//此处是多态,相当于A a = new B();  调用时执行B的fun2()方法
        a.fun1();
    a = new A();
         a.fun1();//此处打印结果是:123

  }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
哈哈  楼上的几位 都把我想说的已经说完了   就是楼上几位哥们说的那个意思、
不过 我还是想说说 楼主  我个人觉得  在类的继承 和 面向对象的三个特性 尤其是多态那一章的视频 你应该再多看看几遍
我觉得对于多态的理解 你不是很透彻 所以导致叫你的题目 不清楚   你说对吗? 呵呵~
回复 使用道具 举报
何伟 中级黑马 2012-12-25 21:04:42
7#
我一直以为a.fun1打印的是123,原来a和b都 是指向同一实体
回复 使用道具 举报
class A {
        void fun1() {
                System.out.println(fun2());
        }

        int fun2() {
                return 123;
        }
}

class B extends A {
        int fun2() {
                return 456;
        }

        public static void main(String[] args) {
                A a;
                B b = new B();
                b.fun1();//打印456
                a = b;//相当于A a = new B();运行时看子类,编译时看父类
                a.fun1();//456,在fun1中调用了fun2,父类中的fun2被子类重写了
        }
}
回复 使用道具 举报
class A {
  void fun1() {
    System.out.println(fun2());
  }
  int fun2() {
    return 123;
  }
}
class B extends A
{
  int fun2()
{
    return 456;
  }
  public static void main(String[] args)
{
    A a;
    B b = new B();
    b.fun1();//B是A的子类,调用fun1()方法,方法中涉及到fun2(),子类覆写父类,所以答案是456
    a = b;//涉及到多态  A a=new B();父类的引用指向子类对象,运行时看右边,编译时看左边
    a.fun1();
  }
}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马