提问
多态:写一段通用代码,不用区分是狗还是猫,直接调用 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,自动执行各自版本
再打比方
继承:狗继承动物,学会了吃饭;猫继承动物,学会了吃饭。 只靠继承的写法:单独喊狗吃饭,单独喊猫吃饭。
多态:写一句指令「让这个动物吃饭」,交给谁,谁就按自己的吃法吃。 这个指令不用修改,来狗就狗啃骨头,来猫就猫吃鱼。 👉 这个一段代码适配多种子类的特性,才叫多态。