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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© luoyu1530 中级黑马   /  2015-8-13 23:49  /  516 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

这题答案是456 456
分析: B b = new B()创建了一个B类的对象,调用了fun1()方法。
                       但是在B类中没有fun1()方法,B继承了A,所以去A中找fun1()方法
                       A中的fun1()方法又调用了fun2()方法,但是B继承了A的时候将fun2()方法重写了,所以使用的是B的fun2()方法,结果打印了456
                      
                       A a = b,这一步是其实是用了多态A a = new B();
                       所以在调用过程中,虽然创建的是A类的对象,但实际上使用的是B类的对象,所以结果同上。

我主要想问后面那个,是不是多态,这个类型很想,但我又不是很确定
看题得到答案是456 123的就不用说了,我用Eclipse运行得到的456 456

6 个回复

倒序浏览
q985274961 来自手机 中级黑马 2015-8-14 00:05:51
沙发
都用上多态了,然而我刚学到封装
回复 使用道具 举报
迷糊         
回复 使用道具 举报
A类是B类的父类,像A a=new B();这时称对象a是对象b的上转型对象。而子类如果重写了父类的莫个方法,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。  
回复 使用道具 举报
  A a = b;       就是多态,相当于A a=new B();       父类引用指向子类对象。
  a.fun1();       相当于new B().fun1();

非静态成员函数在多态中的应用
        在编译时期,参阅引用型变量所属的类中是否有调用的方法,若有,编译通过;否则失败。
        在运行时期,参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。
回复 使用道具 举报
对啊,后面的那个就是多态,在调用方法时,编译看左边,运行看右边
回复 使用道具 举报
子类复写父类方法,调用子类方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马