十五、Java基础之多态
/*
一、关于java语言中向上类型转型和向下类型转型:
1.向上类型转型(upcasting):子--->父
2.向下类型转型(downcasting):父--->子
注意:无论是向上类型转型还是向下类型转型,两个类之间必须要有继承关系
*/
Animal类
public class Animal { public void m1(){ System.out.println("动物喜欢睡觉!"); } }
Dog类
public class Dog extends Animal{ public void m1(){ System.out.println("狗喜欢叫!"); } }
Cat类
public class Cat extends Animal{ public void m1(){ System.out.println("猫喜欢喵!"); } public void move(){ System.out.println("猫喜欢吃老鼠!"); } }
测试:
public class Test02 { public static void main(String[] args){ //向上类型转型又被称作:自动类型转换 //父类型的引用指向子类型的对象 //程序分为两个阶段:编译阶段,运行阶段 //程序编译阶段只知道是一个Aninmal类型引用 //程序在运行时期,堆中的实际对象时Cat类型 Animal a=new Cat(); //程序在编译阶段a被编译器看做是Animal类型 //所以程序在编译器a引用绑定的是Animal类型中的m1方法(静态绑定) //程序运行时,堆中的对象实际上是cat类型,而cat类型已经重写了方法m1方法 //所以程序在运阶段对象绑定的是cat方法中的m1方法(动态绑定) a.m1();//猫喜欢喵! //向下类型转换,强制转换类型 Animal a1=new Cat();//向上类型转换 //强制类型转换,需要加强制类型转换符 Cat c=(Cat) a1; c.move(); } }
二、关于多态的好处
1.多态:父类型的引用指向子类型的对象
多态:
1.使用多态可以使代码的耦合度降低
2.项目的扩展功能增强
例子1:主人,宠物,测试程序
/* 模拟主人 */ public class Person { public void feed(Dog d){ d.eat(); } public void feed(Cat c){ c.eat(); } }
/* 狗 */ public class Dog { public void eat(){ System.out.println("狗吃东西!"); } }
//测试程序 public class Test01 { public static void main(String[] args){ //创建主人 Person p=new Person(); //创建宠物 Dog d=new Dog(); Cat c=new Cat(); p.feed(d); p.feed(c); } }
再加一只宠物
public class Cat { public void eat(){ System.out.println("猫吃东西!"); } }
程序改进
//person类型的扩展能力太差
//尽量不要面向具体和编程,面向父类型编程,面向抽象编程
因此加一种类型:Animal,这样Person就不需要变动
/* 模拟主人 多态:父类型的引用指向子类型的对象 多态: 1.使用多态可以使代码的耦合度降低 2.项目的扩展功能增强 */ public class Person { // public void feed(Dog d){ // d.eat(); // } // // public void feed(Cat c){ // c.eat(); // } //person类型的扩展能力太差 //尽量不要面向具体和编程,面向父类型编程,面向抽象编程 public void feed(Animal a){ a.eat(); } }
/* Animal */ public class Animal { public void eat(){} }
/* 狗,继承Animal */ public class Dog extends Animal { public void eat(){ System.out.println("狗吃东西!"); } }
//猫继承Aninal public class Cat extends Animal{ public void eat(){ System.out.println("猫吃东西!"); } }
//测试程序 public class Test01 { public static void main(String[] args){ //创建主人 Person p=new Person(); //创建宠物 Dog d=new Dog(); Cat c=new Cat(); //升级 //喂 p.feed(d); p.feed(c); } }
当有些人一出生就有的东西,我们要为之奋斗几十年才拥有。但有一样东西,你一辈子都不会有,那就是我们曾经一无所有。