1.多态的概述
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。
多态的必要条件:
-
继承是多态的前提
-
子类重写父类方法
-
父类引用指向子类对象
多态的使用场合:
-
使用父类做方法的形参,实参可以是任意子类类型
-
使用父类做方法的返回值类型,返回值可以是任意子类的对象
2.多态的实现
多态的实现主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。
【示例】基于继承实现的多态—管理员给动物喂食
class Animal {
public void eat() {
System.out.println("动物 eat");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("dog 吃骨头");
}
}
class Pig extends Animal {
@Override
public void eat() {
System.out.println("Pig 吃饲料");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("cat 吃鱼儿");
}
}
// 管理员
class Admin {
/*
* 多态满足条件
* 1.Cat、Dag和Pig继承Animal
* 2.Cat、Dag和Pig重写了Animal的eat()方法
* 3.父类引用指向子类对象(实参赋值给形参)
* 此处如果没有使用多态,管理员需要分别给每一个动物添加一个喂食的方法!!!
*/
public void feedAnimal(Animal a) {
a.eat(); // 动态绑定
}
}
public class PolymorphismDemo {
public static void main(String[] args) {
// 初始化一个管理员对象
Admin admin = new Admin();
// 管理员给动物喂食
admin.feedAnimal(new Dog());
admin.feedAnimal(new Pig());
admin.feedAnimal(new Cat());
}
}
3.引用数据类型转换
回顾基本数据类型转换:
【示例】基本数据类型转换案例
// 整数(int)转换成小数(double)
int x = 10;
double y = x;
// 小数(double)转换成整数(int)
double n = 2.2;
int m = (int)n;
而引用数据类型转换主要包括向上转型和向下转型。
向上转型:父类引用指向子类对象,属于自动类型转换。
格式:父类类型 变量名 = 子类对象;
向下转型:子类引用指向父类对象,属于强制类型转换。
格式:子类类型 变量名 = (子类类型) 父类对象;
【示例】引用类型转换案例
// 父类
class Person {
public void eat() {
System.out.println("person eat ...");
}
}
// 子类
public class Student extends Person {
public void study() {
System.out.println("Student study ...");
}
}
// 测试类
public class PolymorphismDemo {
public static void main(String[] args) {
// 向上转型:父类引用指向子类对象
Person p = new Student();
p.eat(); // 调用Person的eat()方法
// p.study(); // 编译失败,不能调用Student的study()方法
// 向下转型:子类引用指向父类对象
Student stu = (Student)p;
stu.eat(); // 调用Person的eat()方法
stu.study(); // 调用Student的study()方法
}
}
-
向上转型:
优点:隐藏了子类类型,提高了代码的扩展性,多态本身就是向上转型的过程。
缺点:只能使用父类共性的内容,不能调用子类特有方法!
-
向下转型:
优点:向下转型之后,可以调用子类特有方法
缺点:但是向上转型有风险,容易发生ClassCastException异常!
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。