多态是什么?
多态是指同一个方法调用可以在不同的对象上产生不同的行为。在多态的情况下,同一个方法可以被不同的对象调用,并且会根据对象的实际类型来执行不同的行为方法体。多态可以通过继承和接口实现。
先了解一下引用类型。
引用类型:是存储的是对象在内存中的地址 包括类、接口和数组等。创建这些类型的对象时,通常使用 new
关键字。
class Animal {
void sound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 向上转型
myDog.sound(); // 输出 "Bark"
}
}
上面的例子就是使用了多态
myDog是一个Animal引用类型变量,指向Dog类
Animal myDog = new Dog();
这条语句创建了两个对象:
-
Dog
对象:使用new Dog()
创建了一个Dog
类的实例。 -
myDog
引用:myDog
是一个Animal
类型的引用,指向刚刚创建的Dog
对象。
多态的实现形式就是
父类引用指向子类引用的实例
引用类型变量存储的是对象在内存中的地址。引用类型变量可以指向其子类对象,允许调用子类重写的方法。
向上转型(Upcasting)
向上转型是将子类的引用赋值给父类的引用类型变量。这种转换是隐式的,不需要显式的类型转换操作符。
Animal myDog = new Dog();
这条语句创建了两个对象:
Dog
对象:使用new Dog()
创建了一个Dog
类的实例。myDog
引用:myDog
是一个Animal
类型的引用,指向刚刚创建的Dog
对象。
尽管 myDog
是 Animal
类型,但它调用的是 Dog
类中重写的 sound
方法。
向下转型(Downcasting)
如果需要调用子类特有的方法,可以进行向下转型,将父类的引用转换为子类的引用。这种转换是显式的,需要类型转换操作符。
Dog myRealDog = (Dog) myDog; // 向下转型
myRealDog.sound(); // 现在可以调用子类的方法
在向下转型时,如果引用的对象不是实际的子类对象,会抛出 ClassCastException
。因此,通常在向下转型前,会使用 instanceof
操作符进行检查。
if (myDog instanceof Dog) {
Dog myRealDog = (Dog) myDog;
myRealDog.sound();
}
多态的实现方式
1.多态是同一个行为具有多个不同表现形式或形态的能力。---重写 重写与重载(看完就懂)-CSDN博客
2.多态就是同一个接口,使用不同的实例而执行不同操作。----接口
多态在接口中的应用是面向对象编程中的一个重要特性,允许不同类通过实现同一个接口来实现不同的行为。 --就是用接口指向实现类的对象
相当于接口是父类,实现类是子类
interface Animal {
void sound();
}
class Dog implements Animal {
public void sound() {
System.out.println("Bark");
}
}
class Cat implements Animal {
public void sound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 向上转型
Animal myCat = new Cat(); // 向上转型
myDog.sound(); // 输出 "Bark"
myCat.sound(); // 输出 "Meow"
}
}
Dog
和 Cat
类都通过多态实现了 Animal
接口,并提供了各自的 sound
方法。通过向上转型,我们可以使用 Animal
类型的引用来调用不同实现类的方法