黑马程序员技术交流社区

标题: 一道关于多态的面试题 [打印本页]

作者: 木子子木    时间: 2015-11-5 15:13
标题: 一道关于多态的面试题
class A {
      public void show() {
               show2();
       }
     public void show2() {
             System.out.println("我");
       }
}
class B extends  A {
         pu;blic void show2() {
              System.out.pritnln("爱");
          }
}
class C extends B {
          public void show() {
               super.show();
           }
           public void show2() {
                 System.out.println("你");
           }
}
public  class  ABC {
            public static void main(String[] args) {
                  A  a = new B();
                  a.show();

                  B  b = new C();
                  b.show();
            }
}


答案是:爱    你
但是这个语句的执行过程不是很清楚,感觉有些绕

作者: 切比雪夫    时间: 2015-11-5 19:49
支持一下!!!
作者: 孤单背影    时间: 2015-11-5 20:11
多太掉方法是掉子类的。这个记住就行。
作者: redsifei    时间: 2015-11-5 20:19

你   

作者: feng0606    时间: 2015-11-5 20:46
编译看左边,运行看右边,很简单的.
作者: hhl    时间: 2015-11-5 21:09
哈哈,这个太伤脑子了
作者: 奔跑的小红帽    时间: 2015-11-5 23:22
A  a = new B();    //多态成员方法的特点:编译看父类,运行看子类,编译时去父类A中去找show()方法,编译通过,                     a.show();       // 运行时去子类B中去找show()方法,B继承A中,所以B中也有show方法,执行show方法调用自己show2方法,输出爱
作者: championjx    时间: 2015-11-6 09:42
这个15年java视频中的课堂案例,有详细讲解的
作者: WosLovesLife    时间: 2015-11-6 10:08
本帖最后由 WosLovesLife 于 2015-11-6 10:11 编辑

这个很简单,给你推荐个视频,你到网易云课堂 然后搜(高淇java)里面讲多态那部分,有很好的内存分析。很容易理解的。这里这个题:我们可以认为,如果一个类,是直接继承,或者间接继承了另一个类,我们就可以说,这个类是XXX“类型”的。
比如,所有的类,都可以称为是 Object类型的,因为都继承自Object。
这个题里面,C继承B, B和C都继承自A。那C就是B类型的,B和C都是A类型的。
所以在声明变量的时候 A a = new B(); 就是 声明一个A类型的类对象B。
由于继承的特性,B重写了A的方法,但是注意:A里的show2方法并没有就此消失,而是在变量a调用的时候,优先从赋值的对象(也就是B)那里调方法。你如果用super.show2(),依然还能调父类的方法。
B b = new C(); 同理。

作者: 石三伢子1    时间: 2015-11-6 10:40
多态中非静态方法的调用过程,编译时,查看父类是否有此方法,有则通过,没有编译失败;但是运行时,调用子类的方法,因为子类已经覆盖父类,所以运行子类自己的内容;高最关键的一条要记住: 多态中,变化的只有子类; 这句话是多态的精华;
作者: 会盟天下英豪    时间: 2015-11-6 20:04
顶一个!!!

作者: 刘旭波    时间: 2015-11-6 20:49
学习啦!
作者: ll5353231    时间: 2015-11-7 09:11
第一个运行结果是A父类   第二个直接运行报错 因为你的B  是这样的pu;blic 所以找不到.
作者: ll5353231    时间: 2015-11-7 09:12
如果 没有打错标点,符号才是  编译先去看父类有没有 show 方法 没有再去看爷爷类有了 才可以通过 再看 然后再看子类的.
作者: jlq    时间: 2015-11-7 09:49
xxue学习啦  啦
作者: 木子子木    时间: 2015-11-7 22:03
WosLovesLife 发表于 2015-11-6 10:08
这个很简单,给你推荐个视频,你到网易云课堂 然后搜(高淇java)里面讲多态那部分,有很好的内存分析。很 ...

那这样的话,是不是也可以不写那个super()方法的

作者: 木子子木    时间: 2015-11-7 22:06
石三伢子1 发表于 2015-11-6 10:40
多态中非静态方法的调用过程,编译时,查看父类是否有此方法,有则通过,没有编译失败;但是运行时,调用子 ...

恩呢!get到了!!!谢谢喽,
作者: wodesteaammajia    时间: 2015-11-7 22:15
父类引用指向子类对象..
作者: 大自然的搬运工    时间: 2015-11-7 22:22
我来跑堂。。。
作者: 木子子木    时间: 2015-11-7 22:31
石三伢子1 发表于 2015-11-6 10:40
多态中非静态方法的调用过程,编译时,查看父类是否有此方法,有则通过,没有编译失败;但是运行时,调用子 ...

恩呢!get到了!!!谢谢咯!
作者: 木子子木    时间: 2015-11-7 22:36
ll5353231 发表于 2015-11-7 09:11
第一个运行结果是A父类   第二个直接运行报错 因为你的B  是这样的pu;blic 所以找不到. ...

额.....................这个不小心打错了!
作者: 木子子木    时间: 2015-11-7 22:38
奔跑的小红帽 发表于 2015-11-5 23:22
A  a = new B();    //多态成员方法的特点:编译看父类,运行看子类,编译时去父类A中去找show()方法,编 ...

哦!懂了!!!谢谢侬...............
作者: sshh11    时间: 2015-11-7 22:55
多态中,变化的只有子类; 这句话是多态的精华;   学习了
作者: 申请补助没成功    时间: 2015-11-7 23:02
耐心点都能理出来,加油
作者: didixyy    时间: 2015-11-7 23:07
a.show() 输出的是爱  应为是new B(); 就是a里面引用指向的是B类的对象.B类对象复写了show2,b.show()也是一样的
作者: zyh1578814923    时间: 2015-11-7 23:12
多态中,变化的只有子类




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