java吧 关注:1,301,848贴子:12,850,737
  • 15回复贴,共1

新人问一个关于多态的问题,求各位大佬帮忙解决一下

只看楼主收藏回复

多态有三个必要条件,继承,重写,和父类引向子类;
重写为什么是必要条件?
animal dog =new dog();
dog.shout()
但是animal有方法
public void shout() {
System.out.println("叫了一声");
}
子类dog继承了父类的shout方法,就算子类不重写父类的方法shout()。
dog.shout也照样可以输出(“叫了一声”)
那为什么重写必须是多态的必要条件,不重写不可以吗?


IP属地:中国香港1楼2019-11-26 21:05回复
    public class animal {
    public void shou() {
    System.out.println("叫了一声");
    }
    }
    public class cat extends animal{
    //什么都没有
    }
    public class dog extends animal {
    //什么都没有}
    public class test {
    public static void main(String[] args) {
    animal a=new animal();
    animalcry(a);
    cat b=new cat();
    animalcry(b);
    dog c=new dog();
    animalcry(c);
    }
    static void animalcry(animal a) {
    a.shou();
    }
    }
    子类没有重写,一样实现了多态。为什么还说重写是必要条件呢


    IP属地:中国香港2楼2019-11-26 21:10
    回复
      2026-04-23 22:19:43
      广告
      不感兴趣
      开通SVIP免广告
      这个问题嘛 不知道咋解释 俺学的也不是很深 不过你有没有发现 你写这些个继承有什么意义嘛?


      来自Android客户端3楼2019-11-26 21:25
      收起回复
        动物是叫,但是没说明怎么叫,如果你子类狗重写了叫方法,你不就可以重写成狗汪汪汪的叫?狗叫和动物叫是一样的吗?所有动物叫起来都一个样?重写不就是为了具体写出每种动物的叫法吗?


        来自Android客户端4楼2019-11-26 21:53
        收起回复
          其实多态的最常见的目的是为了扩展性。
          比如说一个list接口,jdk有各种自带实现,但是你自己也可以通过实现list接口去做各种扩展。别人也可以去依赖你的拓展,但一切都是基于list接口的标准。
          更贴近实际开发的例子就是lambda表达式了,每一个lambda表达式(本质是匿名内部类)都是多态用途的典型体现。其他诸如mybatis的sql拦截钩子之类的也是同样的道理。通过接口达成标准化最终实现高拓展性是多态的目的。


          IP属地:辽宁来自Android客户端5楼2019-11-26 23:10
          回复
            animal a=new dog() a.shou() 这是多态,a对象同时具有动物和狗两种状态,所有方法都不重写的话(仅考虑父子类都存在的方法),那么意味着至少在这个程序中,狗不能独立于动物成为一种新状态,我是这样想的可能有错,另一个想法是一个动物对象可以被创建为猫对象,也可以被创建为狗对象,一个对象可以有多种状态


            IP属地:内蒙古来自Android客户端6楼2019-11-26 23:19
            回复