发布作者: Charlotte
百度收录: 正在检测是否收录...
作品采用: 《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》许可协议授权
Java中的多态性是面向对象编程的核心概念之一,它增强了代码的可读性、灵活性和可维护性。但理解它的细节并不总是那么直观。在这篇博客中,我们将通过具体的示例来探讨多态性的工作原理和常见的陷阱。
首先,让我们从一个简单的示例开始,以理解多态性的基本概念。
class Animal {
void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
void sound() {
System.out.println("狗汪汪叫");
}
}
class Cat extends Animal {
void sound() {
System.out.println("猫喵喵叫");
}
}
public class TestPolymorphism {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 输出:狗汪汪叫
myCat.sound(); // 输出:猫喵喵叫
}
}
尽管我们使用的是Animal
类型的引用,但在运行时,实际调用的方法是基于对象的真实类型。这就是运行时多态的魔力。
与方法不同,字段不是多态的。这意味着字段的访问基于引用变量的类型,而不是对象的实际类型。这可以通过以下示例来说明:
class Animal {
String name = "动物";
}
class Dog extends Animal {
String name = "狗";
}
public class TestFieldPolymorphism {
public static void main(String[] args) {
Animal myDog = new Dog();
System.out.println(myDog.name); // 输出:动物
}
}
尽管myDog
实际上是一个Dog
对象,但输出的仍然是"动物",因为字段的访问不是多态的。
final
、static
和private
与多态这些修饰符会影响到多态性。为了演示这一点,让我们考虑以下示例:
class Animal {
final void finalMethod() {
System.out.println("这是一个final方法,不能被重写");
}
static void staticMethod() {
System.out.println("静态方法与类相关,不是多态的");
}
private void privateMethod() {
System.out.println("私有方法在子类中不可见,不能被重写");
}
}
class Dog extends Animal {
// 下面的代码会报错,因为final方法不能被重写
// void finalMethod() {}
// 这不是重写,只是子类中的一个新方法
static void staticMethod() {
System.out.println("Dog类的静态方法");
}
}
在使用多态时,尤其是在类型转换中,我们需要小心。以下是一个常见的陷阱:
Animal animal = new Animal();
Dog dog = (Dog) animal; // 这将抛出一个ClassCastException
为避免这种情况,我们应使用instanceof
进行检查:
if(animal instanceof Dog) {
Dog dog = (Dog) animal;
}
—— 评论区 ——