本帖最后由 chenqipc 于 2012-05-17 12:08:40 编辑

解决方案 »

  1.   

    你在Person中也加个study方法,就可以看到不同的结果了。
    如:void studey{
        system.out.println("person");
    }student 也有同名的方法
    void studey{
        system.out.println("student");
    }你再调用p.study()。得出的结果是student.
      

  2.   

    Person没有study方法,怎么能调用?study方法是Stu才有的,所以要把p强行转换为Stu对象来调用
    ((Stu)p).study();这样就可以了
    LZ要理解动态绑定的意思,就是一个父类的变量,指向一个子类的对象,运行期决定调用子类的方法,但父类本身就没有这样方法,父类变量本身是不知道子类有这样的方法的,所以编译期间就会报错了
    Person p; //也就是说,p只能调换用Person的方法,不能调用Stu的方法,要调用就必须强行转换
    p = new Stu();因为p指向的是Stu对象,所以当p调用Person的方法的时候,因为Stu重新覆盖了Person的方法,所以调用的就是Stu的方法,这就是所谓的动态绑定,运行期才知道p具体指向什么对象,才决定具体调用什么对象的方法
    比如
    人是一个类,机器人是一个子类
    人 a = new 机器人();
    a.说话(); 那么运行期将调用机器人的说法
    但是,如果人本身不提供说话这个方法,那么a.说话();就会编译失败,因为编译器在编译期不知道a在运行期会指向机器人,只知道a是个人类,如果a没有说话方法就不能用,而如果强行转换,((机器人)a).说法,因为a被强行转换为机器人类了,编译器知道机器人有说话这个方法,所以编译能通过
      

  3.   


    好好学基础啊 我的个神那
    个人技术博客 http://www.happyalaric.com
      

  4.   

    你继承关系都没有,哪有多态体现呀
     class Person {
      //没有方法
      }
      Class Stu extends Person {
      void study() {
      ........
      }
      }试试去!!!!!!!!!!!!!!!
      

  5.   

    对于Peron p = new Stu(); 父类对象指向子类的引用。
    p去调用方法,代码编译时能否通过看左边Person是否有该方法,运行时实际走哪个方法看右边,如果右边有就是右边的方法,如果没有就走父类的方法。