1.基本介绍
1.1多态的理解
1.多态允许不同类型的对象对同一消息做出响应。在Java中,多态可以通过继承、接口和重学方法来实现。
2.其实就是一种能力——同一个行为具有不同的表现形式活形态;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。
例子:比如有动物(Animal)之类别(Class), 而且由动物继承出类别鸡(Chicken)和类别狗(Dog),并对同一源自类别动物(父类)之一消息有不同的响应,如类别动物有"叫()"之动作,而类别鸡会"啼叫()", 类别狗则会"吠叫()",则称之为多态。
3.具体来说,多态分为编译时多态和运行时多态。编译时多态也称为重载,是指在同一个类中定义了多个同名但参数不同的方法,编译器根据调用方法时传递的参数类型来匹配具体要调用的方法。运行时多态也称为重写,是指子类重写了父类的方法,当通过父类引用子类对象的方法是,会运行子类中重写的方法而不是父类中的方法。通过多态实现的代码更加灵活,易于扩展,降低了代码的耦合度。同时,多态也是面对对象编程中的一种基本原则之一,能够使程序的可维护性和可读性更好。
4.多态就是同一个接口,使用不同的实例而执行不同操作,多态性是对象多种表现形式的体现。
1.2多态的优点
1.可扩展性:通过多态,代码可以更容易地扩展和修改,而不会影响现有的代码。通过继承子类并重写其父类的方法,您可以添加新的功能或修改现有的行为。
2.灵活性:多态使代码更具灵活性,因为它允许动态地确定对象 的类型和执行相应的方法。这意味着您可以编写更通用的代码,可以处理许多不同类型的对象,从而使代码更加灵活和可维护。
3.代码复用: 多态提供了代码复用的机会。通过创建一个通用的父类来实现代码重用,并通过子类进行继承和重写,在不同的场景中使用相同的代码来处理不同的对象。
4.降低了耦合性: 多态还有助于降低代码之间的耦合性。通过使用父类的引用来处理子类对象,您可以减少代码中的直接依赖关系,从而使代码更加松散耦合,更容易理解和维护。
1.3多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
class Shape {
void draw() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
}
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有的类对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
//Test.java 文件代码:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat(); // 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
执行结果:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
1.4多态的具体体现
对象的多态使多态的核心和重点。
规则:
- 一个对象的编译类型与运行类型可以不一致;
- 编译类型在定义对象时,就确定了,不能改变,而运行类型时可以改变的;
- 编译类型看定义对象时 = 号的左边,运行类型看 = 号的右边。
1.5入门案例
说明:
- 定义一个Person类为父类,定义Student类和Teacher类作为子类继承父类;
- Person类拥有mission()方法;
- Student类和Teacher类重写父类的mission()方法;
- 最后在main函数中利用多态形式创建对象。
(1) 定义父类Person类:
package Polymorphism;
public class Person {
public void mission() {
System.out.println("人要好好活着!");
}
}
(2) 定义子类Student类:
public class Student extends Person {
@Override
public void mission() {
System.out.println("学生要好好学习!");
}
}
(3)定义子类 Teacher 类
public class Teacher extends Person {
@Override
public void mission() {
System.out.println("老师要好好教书!");
}
}
(4)在 Test01 类中编写 main 函数,体现多态性\
//多态性
public class Test01 {
public static void main(String[] args) {
//多态形式,创建对象
//注意编译类型看等号左边,运行类型看等号右边
Person p1 = new Student();
//此时调用的是 Student 类 的 mission() 方法
p1.mission();
//多态形式,创建对象
Person p2 = new Teacher();
//此时调用的是 Teacher 类 的 mission() 方法
p2.mission();
}
}
(5)运行结果
学生要好好学习!
老师要好好教书!