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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 明月几时有 中级黑马   /  2013-11-17 23:07  /  1055 人查看  /  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();//这里的结果是456
            A a = b;//这是多态?父类引用指向子类对象?
            a.fun1();//这里居然也是456
    }
}
//碰到这样一题,有点乱,求懂的朋友帮我分析一下结果和原理

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

6 个回复

倒序浏览
* 分析原理:
* 当子类对象b调用fun1()方法时现在子类中寻找发现没有这个方法,就去父类中找发现有fun1方法
* 就调用父类中的方法,父类中fun1()方法调用了fun2()方法,就为子类对象b在调用fun2();
子类中的fun2()将父类中的fun2()重写,输出456
当父类引用指向子类的对象时,父类引用只能访问父类中的方法和变量,无权访问子类中定义而父类中
没有的方法,当子类中有与父类相同的方法,子类的方法将父类的方法重写,父类的方法无效。(多态的动态连接)
故父类对象调用fun1()在父类中找到后运行,之后调用fun2()子类中fun2方法重写父类中fun2方法,父类中的fun2方法就没用了,运行子类的fun2()方法,输出456
回复 使用道具 举报
//创建B类对象实例,将引用值传给b,引用值就类似于一个指针
B b = new B();
//调用父类fun1()方法,因为B继承A,然后fun1()在调用子类fun2()
b.fun1();
//将b的引用值赋值给A类对象 的引用a
A a = b;
//调用A类方法 fun1(),fun1()在调用子类B fun2()
a.fun1();
多态体现在覆写和重载,
重载就是方法签名相同,参数类型不同;
覆写就是在子类中对父类继承来的方法进行 自己的实现, 当子类覆写父类方法后 调用的就是子类的方法。
多态就是子类有的用子类的,子类没有在用父类的。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报

类B继承了类A ,就拥有了A类中的方法,当B  b = new B()创建子类对象,子类对象b调用fun1()也就是父类的方法fun1(),父类中的方法又调用了子类的fun2()方法,所以打印456.  父类A  a=b  就如你说的这就是多态,父类引用指向了子类对象。a调用fun1()方法,调用的就是父类中的fun1(), 这里你疑惑说明对基本概念还不理解。父类引用指向子类对象时,如果父类的引用调用的方法没有被子类重写,就会调用父类中的方法。如果子类中重写了父类的方法,就会调用子类重写的方法。      

回复 使用道具 举报
不抛弃不放弃 发表于 2013-11-17 23:46
类B继承了类A ,就拥有了A类中的方法,当B  b = new B()创建子类对象,子类对象b调用fun1()也就是父类的方 ...

最后两句说的很到位,时间长了搞忘了额
回复 使用道具 举报

  1. class A {
  2.     void fun1() {
  3.           System.out.println(fun2());
  4.     }

  5.     int fun2() {
  6.             return 123;
  7.     }
  8. }

  9. class B extends A {
  10.     int fun2() {
  11.              return 456;
  12.      }

  13.     public static void main(String args[]) {
  14.             B b = new B();
  15.             b.fun1();//这里因为子类调用了继承父类的fun1()方法并覆写了父类的fun2方法,
  16.                                     //fun1()中调用了自己的fun2()
  17.             A a = b;//子类对象赋给了父类的引用
  18.             a.fun1();//通过父类的引用调用子类对象继承父类的fun1()方法
  19.                         //若子类含有父类没有的特殊函数,这不能通过父类引用直接调用
  20.     }
  21. }
复制代码
回复 使用道具 举报
你的基础知识还是不太好,其实一句话:当子类重写了父类的方法时,只要不是通过super.的方式显示的调用父类中的某个成员的话,那么调用的就是子类中的成员。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马