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

© 木子子木 中级黑马   /  2015-11-5 15:13  /  3791 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
            }
}


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

25 个回复

正序浏览
多态中,变化的只有子类
回复 使用道具 举报
a.show() 输出的是爱  应为是new B(); 就是a里面引用指向的是B类的对象.B类对象复写了show2,b.show()也是一样的
回复 使用道具 举报
耐心点都能理出来,加油
回复 使用道具 举报
多态中,变化的只有子类; 这句话是多态的精华;   学习了
回复 使用道具 举报
奔跑的小红帽 发表于 2015-11-5 23:22
A  a = new B();    //多态成员方法的特点:编译看父类,运行看子类,编译时去父类A中去找show()方法,编 ...

哦!懂了!!!谢谢侬...............
回复 使用道具 举报
ll5353231 发表于 2015-11-7 09:11
第一个运行结果是A父类   第二个直接运行报错 因为你的B  是这样的pu;blic 所以找不到. ...

额.....................这个不小心打错了!
回复 使用道具 举报
石三伢子1 发表于 2015-11-6 10:40
多态中非静态方法的调用过程,编译时,查看父类是否有此方法,有则通过,没有编译失败;但是运行时,调用子 ...

恩呢!get到了!!!谢谢咯!
回复 使用道具 举报
我来跑堂。。。
回复 使用道具 举报
父类引用指向子类对象..
回复 使用道具 举报
石三伢子1 发表于 2015-11-6 10:40
多态中非静态方法的调用过程,编译时,查看父类是否有此方法,有则通过,没有编译失败;但是运行时,调用子 ...

恩呢!get到了!!!谢谢喽,
回复 使用道具 举报
WosLovesLife 发表于 2015-11-6 10:08
这个很简单,给你推荐个视频,你到网易云课堂 然后搜(高淇java)里面讲多态那部分,有很好的内存分析。很 ...

那这样的话,是不是也可以不写那个super()方法的
回复 使用道具 举报
jlq 中级黑马 2015-11-7 09:49:32
15#
xxue学习啦  啦
回复 使用道具 举报
如果 没有打错标点,符号才是  编译先去看父类有没有 show 方法 没有再去看爷爷类有了 才可以通过 再看 然后再看子类的.
回复 使用道具 举报
第一个运行结果是A父类   第二个直接运行报错 因为你的B  是这样的pu;blic 所以找不到.
回复 使用道具 举报
学习啦!
回复 使用道具 举报
顶一个!!!
回复 使用道具 举报
多态中非静态方法的调用过程,编译时,查看父类是否有此方法,有则通过,没有编译失败;但是运行时,调用子类的方法,因为子类已经覆盖父类,所以运行子类自己的内容;高最关键的一条要记住: 多态中,变化的只有子类; 这句话是多态的精华;
回复 使用道具 举报
本帖最后由 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(); 同理。
回复 使用道具 举报
这个15年java视频中的课堂案例,有详细讲解的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马