定义
多态(Polymorphism)是面向对象编程的三大特性之一,它表示同一个操作作用于不同的对象上,可以产生不同的执行结果。简单来说,多态允许我们使用父类类型的引用来操作子类对象,并在运行时根据对象的实际类型来执行相应的方法。
论述
-
方法的重载(Overloading)与重写(Overriding)
- 重载:在同一个类中,可以有多个同名但参数列表不同的方法。这是编译时的多态。
- 重写:在子类中定义一个与父类中同名、同参数列表的方法,从而覆盖父类中的方法。这是运行时的多态。
-
向上转型和向下转型
- 向上转型:将子类对象赋给父类类型的引用。例如,
Animal a = new Dog();
这里Dog
是Animal
的子类。 - 向下转型:将父类类型的引用转换为子类类型的引用。这通常需要显式转换,并可能引发
ClassCastException
。
- 向上转型:将子类对象赋给父类类型的引用。例如,
-
接口与多态
- 通过接口,我们可以实现更高级别的多态。一个类可以实现多个接口,并使用接口类型的引用来引用这些类的对象。
- 当一个接口被多个类实现时,这些类的对象都可以被赋给该接口类型的引用,从而表现出多态性。
-
运行时多态的实现
- 在Java中,运行时多态主要通过方法表的动态分派来实现。当通过父类类型的引用调用方法时,Java虚拟机会在运行时根据对象的实际类型查找并执行相应的方法。
-
多态的优势
- 多态提高了代码的灵活性和可扩展性。通过多态,我们可以编写更加通用的代码,而无需关心具体的对象类型。
- 多态也支持开放封闭原则,即在不修改现有代码的情况下扩展系统的功能。
例:
//测试
public class Domo_02 {
public static void main(String[] args){
//对象类型转换
Animal an1 = new Cat();
Animal an2 = new Dog();
an1.shout();
an2.shout();
}
}
//定义抽象类
abstract class Animal{
abstract void shout();//定义shout方法
}
//定义类并继承抽象类
class Cat extends Animal{
//重写shout方法
public void shout(){
System.out.println("喵喵......");
}
}
//定义类并继承抽象类
class Dog extends Animal{
//重写shout方法
public void shout(){
System.out.println("汪汪......");
}
}