package day0611;
public class Test {
/**多态在实际开发中的使用,以下为主人喂养宠物的例子说明多态的作用
*1.主人喂养宠物这个场景需要进行类型的抽象:
*---主人【类】 宠物【类】
*--主人可以喂养宠物 所以主人有喂养这个动作
*-- 宠物【类】
*--宠物可以吃东西,所以宠物有吃东西这个动作
*
*--2.面向对象编程的核心:定义好类,将类实例化为对象,给一个环境驱使一下,让各个对象之间协作起来形成一个系统
*3.多态的作用是什么
*/
public static void main(String[] args) {//有多态后,测试类中没什么大的变化,还是要把具体的事物猫 狗类创建。
//创建主人对象
Master ZhangSan=new Master();
Cat cat=new Cat();//类是无法进行协作的,需要把类实例为对象,对象在java中才可以进行协作。
ZhangSan.feed(cat);//ZhangSan和cat都是创建的对象,通过对象吧事物联系了起来。
Dog dog=new Dog();
ZhangSan.feed(dog);//在这个传参的过程中,相当于发生了:Pet pet=new Dog();这就是向上转型,或者说是父类的引用指向了子类的对象,这就呼应的多态的定义:Pet pet=new Dog();
//那么,综合起来,有继承 有方法的重写,有向上转型。者就完成了多态。
}
}
package day0611;
/**
* 主人
*/
public class Master {
/**
* 这种方式没有使用多态,存在的缺点是:master的扩展能力差,因为要增加一个新的宠物,Master类就要增加一个新的方法
* 喂养宠物的方法:增加了喂狗的方法后,这个就要改了,不合理
*/
/*public void feed(Cat c){
c.eat();//这里并没有创建对象,也没有静态类,之所以可以直接调用是因为传参后,相当于传了对象,引用,可以直接调用,记住就可以了
}
public void feed(Dog d){
d.eat();
}*/
//Master和Cat Dog这两个类型的关联类型很强,耦合度很高,扩展能力差
//降低程序的耦合度【解耦合】,提高程序的扩展力,【软件开发的一个重要的目标】
public void feed(Pet pet){//参数是pet,两类建立了联系
pet.eat();
}
}
package day0611;
/**
* 宠物类
*
* @author Administrator
*
*/
public class Pet {
public void eat(){
/**
*所有的宠物都可以吃东西
*/
}
}
package day0611;
/**
* 宠物小猫
*/
public class Cat extends Pet{
//小猫爱吃鱼
public void eat(){
System.out.println("小猫正在吃鱼");
}
}
package day0611;
/**
* 宠物小狗
*/
public class Dog extends Pet{
//宠物小狗喜欢吃骨头
public void eat(){
System.out.println("小狗正在吃骨头");
}
}
总结:多态的核心是在哪个类里可以体现多态,这个类的方法如果不使用多态,就需要写多个方法。那个类里使用多态的语句,比如是饲养员Person这个类。比如饲养方法,饲养的是狗 猫 需要不同的方法。重要的就是测试类和主人类,测试类中创建对象,主人类中定义声明核心方法feed()。
另有概述参考本人另一篇java多态。