java面向对象基础——多态
多态的概念
多态指的是同一个方法的调用,由于对象的不同可能会有不同的行为,而在现实生活中,同一种方法,具体实现可能会有所不同,比如人的休息方法,有躺着睡觉,也有躺着玩手机,等不同的行为方法
多态的好处
- 可替换性。多态对已存在代码具有可替换性。
- 可扩展性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
- 灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
多态的条件
- 多态是方法的多态,不是属性的多态(多态和属性无关)
- 要实现多态要满足三个必要条件:必须要有继承,方法的重写,父类引用指向子类对象
- 父类引用子类对象的时候,用该父类引用子类的重写方法,此时多态就出现了(向上转型)
代码示例一:
package com.boker.oo;
public class TestPolymorphic {
public static void main(String[] args) {
Person person = new Person(); //创建人类对象
Teacher teacher = new Teacher(); //创建老师对象
Student student = new Student(); //创建学生对象
rest(person); //调用静态rest方法,把对象作为参数传递进去
rest(teacher);
rest(student);
}
//创建静态对象 以父类person为参数类型
public static void rest(Person a) {
a.rest();
}
}
//人类
class Person{
public void rest() {
System.out.println("人类需要休息");
}
}
//老师类
class Teacher extends Person{
@Override
public void rest() {
System.out.println("老师上了一天课,要休息了");
}
}
//学生类
class Student extends Person{
@Override
public void rest() {
System.out.println("学生听了一天课了,准备写完作业再休息");
}
}
运行结果:
代码示例二:
package com.boker.oo;
public class TestPolymorphic {
public static void main(String[] args) {
Person person = new Person(); //创建人类对象
Teacher teacher = new Teacher(); //创建老师对象
Student student = new Student(); //创建学生对象
//父类person的方法
person.rest();
//子类teacher向上转型,实际调用的是子类的方法
person = teacher;
person.rest();
//子类student向上转型,实际调用的是子类的方法
person = student;
person.rest();
}
}
//人类
class Person{
public void rest() {
System.out.println("人类需要休息");
}
}
//老师类
class Teacher extends Person{
@Override
public void rest() {
System.out.println("老师上了一天课,要休息了");
}
}
//学生类
class Student extends Person{
@Override
public void rest() {
System.out.println("学生听了一天课了,准备写完作业再休息");
}
}
运行结果:
代码示例三:
package com.boker.oo;
public class TestPolymorphic {
public static void main(String[] args) {
Person person = new Person(); //创建父类人类对象
person.rest();
Person person1 = new Teacher(); //创建子类老师对象,子类向上转型
person1.rest();
Person person2 = new Student(); //创建子类学生对象,子类向上转型
person2.rest();
}
}
//人类
class Person{
public void rest() {
System.out.println("人类需要休息");
}
}
//老师类
class Teacher extends Person{
@Override
public void rest() {
System.out.println("老师上了一天课,要休息了");
}
}
//学生类
class Student extends Person{
@Override
public void rest() {
System.out.println("学生听了一天课了,准备写完作业再休息");
}
}
运行结果:
可以看见,多态的三个必要条件,缺一不可,其中的向上转型,是否也可以向下转型呢?显然是不能的,比如所有的老师是人类,那所有的人类不可能都是老师吧,但是有一天,有老师离职了,不再是老师了,可是后来他又再找一份老师的工作,那该怎么办呢?这就需要把原来向上转型的再向下转型了(强转)
代码示例:
package com.boker.oo;
public class TestPolymorphic {
public static void main(String[] args) {
Person person = new Person(); //创建父类人类对象
person.rest();
Person person1 = new Teacher(); //创建子类老师对象,子类向上转型
person1.rest();
Teacher teacher = (Teacher)person1; //向下转型(强转)
teacher.teach();
}
}
//人类
class Person{
public void rest() {
System.out.println("人类需要休息");
}
}
//老师类
class Teacher extends Person{
@Override
public void rest() {
System.out.println("老师上了一天课,要休息了");
}
//老师会教书
public void teach() {
System.out.println("教授课程");
}
}
运行结果:
注意:这里的强转是指把之前的子类对象向上转型,再转回来,不是把本来是父类的对象强转回去,否则会报类型转换错误异常
好了,关于多态就介绍到这,后期有补充的地方会在评论区发布的