黑马程序员技术交流社区

标题: 关于入学测试里的一道题目 [打印本页]

作者: luoyu1530    时间: 2015-8-13 23:49
标题: 关于入学测试里的一道题目
        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
作者: q985274961    时间: 2015-8-14 00:05
都用上多态了,然而我刚学到封装
作者: 放学后来我家    时间: 2015-8-14 08:42
迷糊         
作者: 忘存    时间: 2015-8-14 09:52
A类是B类的父类,像A a=new B();这时称对象a是对象b的上转型对象。而子类如果重写了父类的莫个方法,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。  
作者: 徐鹏辰    时间: 2015-8-14 10:20
  A a = b;       就是多态,相当于A a=new B();       父类引用指向子类对象。
  a.fun1();       相当于new B().fun1();

非静态成员函数在多态中的应用
        在编译时期,参阅引用型变量所属的类中是否有调用的方法,若有,编译通过;否则失败。
        在运行时期,参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。

作者: lingxia125    时间: 2015-8-14 14:56
对啊,后面的那个就是多态,在调用方法时,编译看左边,运行看右边
作者: keviner    时间: 2015-8-14 15:04
子类复写父类方法,调用子类方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2