多态
多态
什么是多态?多种形态
生活中的多态
指同一个动作,因为环境的不同产生不同的效果
java程序中的多态
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
同一段代码,因为实参的不同,实现本质上不同的效果
多态的实现方式
1.父类作为形参
2.父类作为返回值
父类:
public class Pet {
protected String name;
private int health;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public Pet() {
}
public Pet(String name,int health) {
this.name = name;
this.health = health;
}
public void cure() {
System.out.println("宠物看病……");
}
}
子类:
public class Cat extends Pet {
public Cat() {
// TODO Auto-generated constructor stub
}
public Cat(String name, int health) {
super(name, health);
// TODO Auto-generated constructor stub
}
@Override
public void cure() {
//重写父类的cure方法
System.out.println("猫咪吃药,吃猫粮,健康值恢复了");
this.setHealth(100);
}
}
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog(String name, int health, String strain) {
super(name, health);
this.strain = strain;
}
public Dog(String name) {
super.name = name;
}
public Dog() {}
@Override
public void cure() {
//重写父类的cure方法
System.out.println("狗狗看病,吃药,吃骨头,健康值恢复了");
this.setHealth(100);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
主人类
可以给宠物看病
/**
* 主人类
* 可以给宠物看病
*
*/
public class Master {
public void toHospitalWithDog(Dog dog) {
if(dog.getHealth() < 100) {
dog.cure();
}else {
System.out.println("狗狗很健康,多陪陪它");
}
}
public void toHospitalWithCat(Cat cat) {
if(cat.getHealth() < 80) {
cat.cure();
}
else {
System.out.println("猫咪很健康");
}
}
// 以上代码可以实现给宠物看病
// 但是不符合开闭原则 我们的程序要对扩展开放 对修改源代码关闭
public void toHospital(Pet pet) {
pet.cure();
}
/*
* 方法重写规则之一 返回值相同或者是其子类
*/
public Pet status(String status) {
/*实际返回值是定义的返回值的子类,子类转为父类,自动实现,自动类型提升 向上转型*/
if(status.equals("老大")) {
return new Cat("小黑",68);
}
else {
return new Dog("大福",87);
}
}
}
public class Test {
public static void main(String[] args) {
Master xiaobai = new Master();
Cat Cat = new Cat("小黑",48); // 此时实参我们传入子类类型
// 实现自动类型提升 向上转型 父类引用指向子类对象
// 此时能够调用的方法 是子类重写父类的方法
// 不能调用子类独有的方法
Dog dog = new Dog("阿福",78,"哈士奇");
xiaobai.toHospital(Cat);
System.out.println(Cat.getHealth());
xiaobai.toHospital(dog);
System.out.println(dog.getHealth());
System.out.println("====================");
Pet pet = xiaobai.status("老大");
System.out.println("老大 is "+pet.getName());
}
}
再有新的Pet子类时,可以扩展,但不必修改已有的Master类
结果: