一.什么是多态?
1.生活中的多态:不同类型的打印机,打印的效果不同
2.程序中的多态:同一引用类型,使用不同的实例且执行不同的操作
二.使用多态实现思路
1.编写父类
2.编写子类,子类重写父类的方法
3.运行时,使用父类的类型,子类的对象
实现多态的两个要素:子类重写父类的方法和使用父类的类型
向上转型:
Pet pet=new Dog();----->自动类型转换又称为向上转型
三.实现多态的两种形式
1.使用父类作为方法形参实现多态
2.使用父类作为方法返回值实现多态
四.父类到子类的转换
1.向下转型(强制类型转换)
Pet pet=new Dog("欧欧","雪纳瑞");
Dog dog=(Dog)pet;
Penguin peng=(Penguin) pet---->报错,必须转为父类指向的真实子类类型
五.instance of运算符
语法:对象 instance of 类或接口
instance of 通常和强制类型转换相结合
六.多态的思想:
父类型的引用可以指向内存中的子类对象的内存空间,就可以方便设计方法的参数和返回值类型的时候,可以设计成父类对象,这样的方法在实现时比较简洁,
在后期进行扩展时,方法比较容易。在代码中,多态使用更多的是父类引用指向子类对象,会自动类型转换(向上转型),有时候也需要调用子类自己的东西,这时候需要还原子类,强制类型转换(向下转型),
向下转型的时候先使用instanceof运算符做类型判断
七.代码示范:
父类Pet类:
public abstract class Pet {
private String name;
private int age;
private int love=100;
private int health=100;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
/** * 吃东西 */
public abstract void eat();
/** * 显示宠物的信息 */
public abstract void show();
}
子类Dog类:
public class Dog extends Pet {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type; }
/**
* 狗狗和主人玩耍接飞盘 */
public void catchingFlyDisc(){
this.setHealth(this.getHealth()-10);
this.setLove(this.getLove()+5);
}
@Override
public void eat() {
if(this.getHealth()>=100){
System.out.println("已经吃饱了,不需要喂食!");
}else{
this.setHealth(this.getHealth()+5);
System.out.println("喂食成功!健康值增加5");
}
}
@Override public void show() {
System.out.println("我是一只"+type+",我的名字叫"+ this.getName()+",今年"+this.getAge()+"岁"+ ",健康值是"+this.getHealth()+",亲密度是"+this.getLove());
}
}
子类penguin类:
public class Penguin extends Pet {
private char sex;
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
/** * 企鹅和主人玩耍游泳 */
public void swimming() {
this.setHealth(this.getHealth() - 10);
this.setLove(this.getLove() + 5);
}
@Override
public void eat() {
if (this.getHealth() >= 100) {
System.out.println("已经吃饱了,不需要喂食!");
} else { this.setHealth(this.getHealth() + 3);
System.out.println("喂食成功,健康值增加3"); } }
@Override
public void show() {
System.out.println("我的名字叫"+this.getName() +"我的性别"+this.getSex()+ ",今年" + this.getAge() + "岁" + ",健康值是" + this.getHealth() + ",亲密度是" + this.getLove());
} }
主人类Master类:
public class Master {
/**
* 主人给宠物喂食 *
* @param pet
*/
public void feed(Pet pet) {
pet.eat();
}
/**
* 主人和宠物玩耍 *
* @param pet */
public void play(Pet pet) {
if (pet instanceof Dog) {/
/对象属于类类型返回true,否则返回false
// 强制类型转换,向下转型,将内存中的子类对象进行还原
Dog dog = (Dog) pet;
dog.catchingFlyDisc();
}else if(pet instanceof Penguin){
Penguin penguin=(Penguin)pet;
penguin.swimming(); }
}
}
测试类 TsetMaster类:
public class TsetMaster {
public static void main(String[] args) {
Master master=new Master();
Penguin pen=new Penguin();
Dog dog=new Dog();
dog.setName("旺财");
dog.setAge(4);
dog.setHealth(80);
dog.setLove(80);
dog.setType("中华田园犬");
master.play(dog);
dog.show();
}
}