java多态上转下_Java 多态(上转和下转)

本文详细介绍了Java中的多态性,包括向上转型和向下转型的概念。向上转型允许通过父类引用调用子类对象,简化代码。而向下转型则在需要访问子类特有方法时使用,将父类引用转换为子类引用。通过实例展示了如何在代码中应用这两种转型方式,帮助理解Java的多态特性。
摘要由CSDN通过智能技术生成

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();

}

}

希望可以帮助到大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值