在《Head First JAVA》这本书中看到一句话 :只有在引用变量的类型就是带有某方法的类型时才能调用该方法。
那么在使用多态时 比如public void Dog(Animal a){
a.bark(); }//其中Animal是Dog的父类 bark这个方法在Animal和Dog中都有 并且在b中进行了重写
public void Dog(object a){
a.bark();}
那么I和II 实际引用的方法是哪个呢 还是说第二个根本无法通过编译呢??
同是java新手,分享一些我对多态的认识.
首先对于多态存在的条件:
1.父类引用子类对象,如: Animal a=new Dog();
2.子类中存在对父类方法的重写.如:Dog类中重写了Animal类的bark方法.
那么 当调用 a.bark(); 实际上调用的是Dog类中重写了的bark方法.
回过头来看你的问题: 对于第一种情况:
如果 a没有引用子类对象Dog 那么它调用的是自身的bark.
如果a引用了子类对象Dog, 那么它调用的是Dog的bark;
对于第二种情况,,有点云里雾里的感觉!!!!
首先 ,虽然object是所有类的父类,但是它并没有bark方法,更别谈多态(多态存在的条件),所以编译无法通过.
最后关于多态的意义所在,目前的理解的,增加程序的可扩展性(重点),可维护性.
如果回答的不好请轻喷>_<.
1.对于非私有的变量,编译和运行都看等号的左边,即父类型
2.对于非私有的方法,编译看等号的左边,运行看等号的右边(编译的时候JVM会判断一下父类中是否存在相应的方法,若没有,编译失败)
父类不可以直接调用子类的方法,在I中,因为传入的是父类的对象,所以还对象调用的是父类方法;在II中,传入的是本类(object)成员,且本类重写了bark()方法,因而直接调用本类方法。所以I和II没有语法错误,只是调用的方法所属的类不同。