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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宗士为 中级黑马   /  2012-5-18 11:25  /  1473 人查看  /  4 人回复  /   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 argv[]) {
    A a;
    B b = new B();
b.fun1();
    a = b;
a.fun1();
  }
}


打印结果是  456 456
就是不知道这结果在main方法中到底怎么实现的打出来这个结果  求明白人解析下  亲  先谢过

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

倒序浏览
简单分享一下我的看法哈,首先咱们从主入口main开始,程序运行时,会先找到这个入口函数,
A a;                        //在栈中创建一个类型为A的a变量。
B b = new B();                //在栈中创建一个类型为B的b变量,并在栈中开辟new B()的内存,将该内存的地址值赋给变量b。       
b.fun1();                //执行b的fun1()方法,因为b没有,所以会直接调用父类A中的fun1()方法,这时候A类中的fun1()方法进栈,
                        执行System.out.println(fun2());这句话,这时候正常情况下他会调用本类中的fun2()方法。
                        但是因为子类复写了这个方法,所以他执行的是子类的fun2()方法。所以这时候打印的是456

a = b;                        //这句是将b所指向的地址值赋给了a,换句话也就是A a = new B(); 这个在程序中是叫多态、
a.fun1();                //同理,它最后打印的还是子类中的456.

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
踩单车的幸福 发表于 2012-5-18 11:36
简单分享一下我的看法哈,首先咱们从主入口main开始,程序运行时,会先找到这个入口函数,
A a;                        //在栈中 ...

仁兄 非常感谢  都迷糊好久 了    膜拜下
回复 使用道具 举报
宗士为 发表于 2012-5-18 11:40
仁兄 非常感谢  都迷糊好久 了    膜拜下

呵呵 共勉 一起学习
回复 使用道具 举报
我做了一个执行路线图。。给大家分享。。


这个程序是一个典型的多态。。在程序执过程中,始终都是执行的B的fun2方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马