1.向上转型(upcasting)子类转父类
2.向上转型(downcasting)父类转子类
PS:无论是向上转型还是向下转型,两个类之间必须要有继承关系
3.多态的好处是什么?
1.0项目拓展能力强
1.1使用多态可以使代码之间耦合度降低
向上转型代码
- 父类型引用指向子类型对象
- 子类转父类也称为自动类型转型
- 程序分为两个阶段:编译、运行阶段
- 编译阶段只知道animalCat是一个Animal类型
- 运行阶段在堆中实际对象是Cat类型
- 列如:
Animal animalCat = new Cat();
animalCat.eat();
/*
*测试类
*/
public class Test {
public static void main(String[] args) {
Animal animal=new Dog();//
animal.eat();
}
}
/*
*动物类
*/
public class Animal {
public void eat() {
System.out.println("动物在吃");
}
}
/*
*猫类继承动物类
*/
public class Cat extends Animal{
//重写
public void eat() {
System.out.println("猫在吃");
}
}
/*
*狗类继承动物类
*/
public class Dog extends Animal {
//重写
public void eat() {
System.out.println("狗在吃");
}
public void move(){
System.out.println("狗在睡觉");
}
}
执行代码则会出现 狗在吃
向下转型(强制类型转换)
- 进行强制转换需要加上强制类型转换符
- 在做强制类型转换是有风险的
- 为了避免java.lang.ClassCastException的发生 Java引入了"instanceof"关键字
- instanceof运算符的运算结果是boolean类型
- 用法 instanceof用法(引用 instanceof 类型)–true/false 列如:(dogAnimalinstanceof Cat)如果结果是true表示:dogAnimal引用指向 堆中的对象是Cat类型
public class TestPolymorphism {
public static void main(String[] args) {
Animal animal = new Dog();//animal引用指向Dog对象
if (animal instanceof Dog) {//判断类型是否属于堆中类型对象“true”指向判断语句。“flase”不执行判断语句
Dog dog=(Dog)animal;//向下转型
dog.move();
}
}
}
/*
*动物类
*/
public class Animal {
public void eat() {
System.out.println("动物在吃");
}
}
/*
*猫类继承动物类
*/
public class Cat extends Animal{
//重写
public void eat() {
System.out.println("猫在吃");
}
}
/*
*狗类继承动物类
*/
public class Dog extends Animal {
//重写
public void eat() {
System.out.println("狗在吃");
}
public void move(){
System.out.println("狗在睡觉");
}
}