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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

        class A {
            void fun1() {
                      System.out.println(fun2());
                }
                int fun2() {
                        return 123;
                }
        }
         public class B extends A {
                int fun2() {
                         return 234;
                 }
              public static void main(String args[]) {
                        B b = new B();
                        b.fun1();
                        A a = b;
                        a.fun1();
                }
        }
打印出的结果都是234具体原理是什么?

5 个回复

倒序浏览
本帖最后由 fxwb2005 于 2014-8-4 23:25 编辑

A a=b父类引用指向子类对象
只不过是将父类引用指向子类内存空间。
而且重写了父类方法,
你用a去调用fun1(),fun1()里面的fun2()前面其实隐藏一个this.
调用fun1()的对象是a,
那么this也就是a,
那么肯定是先执行子类里面的,
子类里面没有,
才会执行父类里面的。
回复 使用道具 举报
楼上正解。。。
回复 使用道具 举报
fxwb2005 发表于 2014-8-4 23:20
A a=b父类引用指向子类对象
只不过是将父类引用指向子类内存空间。
而且重写了父类方法,

你讲的挺好的,那么B  b = new B()  b.fun1()  该怎么解释呢?
回复 使用道具 举报
chulangren2 发表于 2014-8-5 00:02
你讲的挺好的,那么B  b = new B()  b.fun1()  该怎么解释呢?

A a=b 向上转型是为了实现多态。
其实你直接用b也是一样的,没什么区别。
回复 使用道具 举报
父类引用指向子类,对于成员函数——编译看 = 左边,运行看 = 右边。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马