java中的继承和多态的区别

提问

多态:写一段通用代码,不用区分是狗还是猫,直接调用 eat,自动匹配对应的实现。,那我子类继承了父类的方法直接调用父类的这个吃方法不就行吗,这个不是继承吗,为什么说是多态呢

核心问题来了,我帮你把两个场景分开,一眼看懂

疑问:子类继承了父类 eat,直接调用 eat 不就行了?这不就是继承?为啥叫多态?

先分两种完全不一样的写法

场景 1:子类自己调用方法(只有继承,没有多态)

java

运行

复制代码
Dog dog = new Dog();
dog.eat();

这里变量dog的类型就是 Dog。

  • 因为继承,Dog 拥有 eat 方法。
  • 如果 Dog 重写了 eat,就执行 Dog 的 eat;没重写,就执行父类 Animal 的 eat。

✅ 这里用到了继承但这不是多态 。 特点:写代码的时候就确定,这个东西一定是狗

场景 2:父类类型变量,接收不同子类对象(继承 + 重写 → 产生多态效果)

java

运行

复制代码
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.eat();
a2.eat();

变量a1的类型是 Animal(动物),写代码的时候,只知道它是动物,不知道它到底是狗还是猫。 运行的时候才知道里面装的是狗还是猫,自动执行对应子类重写的 eat。

👉 继承只是提供基础,多态是【同一个变量类型,可以装很多不同子类,一行代码自动适配不同实现】


最关键对比

只靠继承能干啥?

你想调用 eat,你必须明确写死是什么动物: 要喂狗 → 创建 Dog 对象 要喂猫 → 创建 Cat 对象 写两个单独调用:

java

运行

复制代码
Dog dog = new Dog();
dog.eat();

Cat cat = new Cat();
cat.eat();

如果以后新增兔子、鸭子,你就要继续新增调用代码。

用上多态能干啥?

一段通用的喂动物方法不用管传进来的到底是什么动物

java

运行

复制代码
public void feed(Animal animal){
    animal.eat();
}

你随便传:

java

运行

复制代码
feed(new Dog());
feed(new Cat());
feed(new Rabbit()); //新增兔子,这里代码完全不用改!

feed这个方法从头到尾只写一次,不用为每一种动物单独写一段调用代码

重点: 继承让狗、猫都拥有 eat 这个方法; 多态让 feed 这一段通用代码,可以适配所有 Animal 子类

一句话总结

  • 继承:狗本身就有 eat 方法(有这个能力)
  • 多态:我写一个通用函数,不管你传狗、猫、兔子,统一调用 eat,自动执行各自版本

再打比方

继承:狗继承动物,学会了吃饭;猫继承动物,学会了吃饭。 只靠继承的写法:单独喊狗吃饭,单独喊猫吃饭。

多态:写一句指令「让这个动物吃饭」,交给谁,谁就按自己的吃法吃。 这个指令不用修改,来狗就狗啃骨头,来猫就猫吃鱼。 👉 这个一段代码适配多种子类的特性,才叫多态。

相关推荐
小羊没烦恼!2 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 小时前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 小时前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 小时前
java函数式编程--入门基础
java·编程·函数式编程
一嘴一个橘子4 小时前
优惠券秒杀思路,redis 分布式锁 方式
java