多态的理解与运用
1.多态是继封装,继承之后,面对对象的第三大特性。
2.对多态的一些理解:
例如:现实事物通常会出现多种形态,猫是动物的一种,则一个具体的事物”渐层猫“既是猫,也是动物,即出现两种形态。java作为面向对象而言,同样可以描述一种事物的多种形态。如StepiseCat类继承了Cat类,一个Stepwise的对象既是Stepwise,也是Cat.
3.java中如何体现多态
父类型的变量可以引用子类型的对象,但是前提条件是必须要有子父类关系,在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。子类是父类的特殊化,每个子类都是其父亲的实例,但是反过来却不成立。例如:每个同学都是人对象,但是每一个人不一定都是同学对象。因此,总可以将子类的实例传给需要父类型的参数。
4.多态的定义与使用格式: 父类类型 变量名 = new 子类类型();
5.多态是一个行为具有多个不同的表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同的操作。
二、多态中成员的特点
1.多态成员变量:编译运行看左边
例如:
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
2.多态成员方法:编译看左边,运行看右边
Fu f1=new Zi();
System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
三、多态的转型
向上转型:多态本身就是向上转型的过程
使用格式: 父类类型 变量名 = new 子类类型();
使用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
四:案例
1.an相当于一个引用(例子),但是他可以表示多种状态
2.一个完整的实例:
场景假设:一个主人养了猫和狗,猫和狗都有自己爱吃的东西,主人在喂它们的时候,如果既要判断是猫还是狗,再判断他们分别爱吃什么,就显得很麻烦。如果主人养了很多种动物,这样的重复判断,就会浪费很多时间。有什么办法,能让主人拿到一种食物就知道这是哪种动物的,就好了。
1、一些类的定义:
public class Animal {
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//动物类里面有叫和吃两个方法
public void cry() {
System.out.println("我不知道叫什么");
}
public void eat() {
System.out.println("我不知道吃什么");
}
}
class Dog extends Animal{
//覆盖(重写)方法
public void cry() {
System.out.println("旺旺");
}
public void eat() {
System.out.println("我爱吃骨头");
}
}
class Cat extends Animal{
//覆盖(重写)方法
public void cry() {
System.out.println("miaomiao");
}
public void eat() {
System.out.println("我爱吃鱼");
}
}
class Food{
String name;
public class Animal {
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//动物类里面有叫和吃两个方法
public void cry() {
System.out.println("我不知道叫什么");
}
public void eat() {
System.out.println("我不知道吃什么");
}
}
class Dog extends Animal{
//覆盖(重写)方法
public void cry() {
System.out.println("旺旺");
}
public void eat() {
System.out.println("我爱吃骨头");
}
}
class Cat extends Animal{
//覆盖(重写)方法
public void cry() {
System.out.println("miaomiao");
}
public void eat() {
System.out.println("我爱吃鱼");
}
}
class Food{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 食物类里面让它有一个方法
public void showName() {
}
}
//鱼(食物的一种)继承于食物
class Fish extends Food{
public void showName() {
System.out.println("食物: 鱼");
}
}
//骨头(食物的一种)继承于食物
class Bone extends Food{
public void showName() {
System.out.println("食物: 骨头");
}
}
//主人类 存在一种喂食方法
class Master{
// 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
// 有了多态,以后即使再来好多动物,用这一个函数就可以了
public void feed(Animal an,Food f) {
an.eat();
f.showName();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 食物类里面让它有一个方法
public void showName() {
}
}
//鱼(食物的一种)继承于食物
class Fish extends Food{
public void showName() {
System.out.println("食物: 鱼");
}
}
//骨头(食物的一种)继承于食物
class Bone extends Food{
public void showName() {
System.out.println("食物: 骨头");
}
}
//主人类 存在一种喂食方法
class Master{
// 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
// 有了多态,以后即使再来好多动物,用这一个函数就可以了
public void feed(Animal an,Food f) {
an.eat();
f.showName();
}
}
2.调试:
public class DuoTaiDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Master master = new Master();
master.feed(new Dog(),new Bone());
master.feed(new Cat(), new Fish());
}
}
3.结果: