多态(十分重要)
多态就是同一个对象拥有多种形态
解释助理解
下面是我听的应该是最好理解的版本了,讲给你们
情况:现在一个人养了三个动物,分别是猫、狗、猪,人要喂养它们建立多个类来完成操作
按照之前学过的应该是这样一种情况:
cat.java
package animal;
public class cat {
public void eat(){
System.out.println("猫吃");
}
}
dog.java
package animal;
public class dog {
public void eat(){
System.out.println("狗吃");
}
}
pig.java
package animal;
public class pig {
public void eat(){
System.out.println("猪吃");
}
}
person.java
package animal;
public class person {
public void feed_cat(cat cat){
System.out.println("喂猫");
cat.eat();
}
public void feed_dog(dog dog){
System.out.println("喂狗");
dog.eat();
}
public void feed_pig(pig pig){
System.out.println("喂猪");
pig.eat();
}
}
main.java
package animal;
public class main {
public static void main(String[] args) {
person p = new person();
cat cat = new cat();
dog dog = new dog();
pig pig = new pig();
p.feed_cat(cat);
p.feed_dog(dog);
p.feed_pig(pig);
}
}
为什么使用多态
那么当我要再养一个fox,那么我需要再创建一个fox类,然后在person.java中创建一个feed_fox方法,然后再在主方法中实例化fox,然后调用person.java中的feed_fox方法
当我要再次增加时,就需要不停地重复这样的操作
这些操作中,创建fox类是必须的,那么有什么可以简化呢?
多态的理解
这些猫狗猪狐狸是不是都可以看成动物,那么人参与喂养的时候,只需要喂养动物不就可以了吗,我把猫、狗、猪、狐狸都看成动物;在之前我是要
cat cat = new cat(); 这里是把猫当做猫建立的对象
那么我把猫看成动物建立一个对象(前提是猫是动物,cat extends animal)
animal cat = new cat();
那么人喂养的时候,我丢进去一个动物,不管它是啥,我喂他就可以了
多态好处
当我建立一个动物的时候,我不需要再在人里建立一个针对该动物的喂养方法,我只需要把这个动物仅仅当做动物来喂养;
对于代码而言:
把不同的数据类型进行统一
这样写极大地增强了代码的可扩展性,相当于通过动物创建了一个人喂养具体动物的接口,当我再次添加动物时,不需要改动person代码,只需要将此动物继承animal即可
代码助理解
dog、cat、pig的行为都不变都是吃
构建一个animal类行为是eat
person的行为改变,不是喂养具体的动物,而是抽象的动物
cat.java
package animal;
public class cat extends animal{
public void eat(){
System.out.println("猫吃");
}
}
cat.java
package animal;
public class dog extends animal{
public void eat(){
System.out.println("狗吃");
}
}
pig.java
package animal;
public class pig extends animal{
public void eat(){
System.out.println("猪吃");
}
}
animal.java
package animal;
public class animal {
//动物吃
public void eat(){
}
}
person.java
package animal;
public class person {
//人喂养动物
public void feed(animal animal){
System.out.println("喂养动物");
//动物吃
//在animal以及cat、dog、pig中都有eat()这个方法
//因为我cat、dog、pig都继承了animal,
//所以这里的eat()应该是具体到具体的动物的eat()
animal.eat();
}
}
main.java
package animal;
public class main {
public static void main(String[] args) {
person p = new person();
//向上转型,猫、狗、猪一定是动物,所以就当作动物处理
//向上转型无风险
//只是具体的方法不能使用,比如猫可以玩毛线,但是动物不一定都玩,所以不存在
animal cat = new cat();
animal dog = new dog();
animal pig = new pig();
//当不是具体的动物要进行子类具体的方法时,要进行类型的转换
((cat)cat).play();
p.feed(cat);//人喂养动物,这个具体的动物是猫
p.feed(dog);//人喂养动物,这个具体的动物是狗
p.feed(pig);//人喂养动物,这个具体的动物是猪
//向下转型成一个猫,实例化一个animal对象,
// 他一定是cat吗?不一定,所以要强制转化
//向下转型有风险
animal sth = new dog();
cat cc = (cat)cat;
p.feed(cc);
}
}