Java:多态(上转和下转)
假设一共存在五个类:
抽象宠物类Pet
宠物猫类Cat继承自Pet类
宠物狗类Dog继承自Pet类
主人类
测试类
宠物类有姓名和健康值两种属性:name、health
主人有照顾宠物的方法,主要判断健康值是否大与50:cure(X x)
-----------------------------------------------向上转型-----------------------------------------------
1.如果不使用多态,那么在主人类中,有几种不同的宠物类型,就要写几种以不同宠物类型为参数的照顾方法。例如:curedog(Dog d) ,cureCat(Cat c) 。
2.但是如果使用多态只需要定义一个方法就可以:cure(Pet p) 。
3.在测试类中,以向上转型的方式,使父类引用指向子类实现:Pet p = new Dog() 或者 Pet p = new Cat() 。
-----------------------------------------------向下转型-----------------------------------------------
向下转型就是把子类实现赋值给父类引用,然后把父类引用向下强转给子类引用。可能有人觉得这样两次赋值很鸡肋,但是如果单纯的向上转型,这种父类引用不可以访问子类特有的方法。所以当需要访问子类特有的方法时,还是需要向下转型。
具体代码如下:
/*
* 宠物类:
* 属性:宠物名、宠物健康值
* 方法:无参构造方法、带参传值构造方法
*/
abstract class Pet {
private String name;// 宠物名
private int health;// 宠物健康值
// 无参构造方法
public Pet() {
super();
}
// 带参传值构造方法
public Pet(String name, int health) {
super();
this.setName(name);
this.setHealth(health);
}
// 重写toString方法
@Override
public String toString() {
return name + "的健康值是" + 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;
}
}
/*
* 猫类:
* 属性:(宠物名、宠物健康值)
* 方法:无参构造方法、带参传值构造方法
*/
class Cat extends Pet {
// 无参构造方法
public Cat() {
super();
}
public Cat(String name, int health) {
super(name, health);
}
}
/*
* 狗类:
* 属性:(宠物名、宠物健康值)
* 方法:无参构造方法、带参传值构造方法、特有的方法
*/
class Dog extends Pet {
// 无参构造方法
public Dog() {
super();
}
// 带参传值构造方法
public Dog(String name, int health) {
super(name, health);
}
// 特有的方法
public void special() {
System.out.println("我是特殊的方法");
}
}
/*
* 主人类:
* 属性:
* 方法:照顾方法
*/
class Master {
// 照顾方法
public void cure(Pet p) {
if (p.getHealth() < 50) {
System.out.println(p.toString() + ",需要看病");
} else {
System.out.println(p.toString() + ",不需要看病");
}
}
}
public class Test {
public static void main(String[] args) {
Master m = new Master();
// 向上转型
Pet p1 = new Cat("小白猫", 59);
m.cure(p1);
// 向下转型
Pet p2 = new Dog("大黄狗", 19);
Dog d = (Dog) p2;
m.cure(d);
d.special();
}
}
希望可以帮助到大家