专业的JAVA编程教程与资源

网站首页 > java教程 正文

三十一、Java面向对象编程特性-多态

temp10 2024-09-27 22:55:48 java教程 9 ℃ 0 评论

Java面向对象编程中的多态性(Polymorphism)是其核心特性之一,指的是同一接口(或父类)的不同实现类对象可以相互替换并呈现出不同的行为。多态体现了“一个接口,多种实现”的原则,有助于提高代码的灵活性和可扩展性。

概念

多态允许你使用一个接口或父类引用指向其实现类的对象。这意味着你可以针对基类(父类)定义一个引用变量,然后让这个变量引用其任意子类的对象。在运行时,实际调用的方法是子类中重写(overridden)的版本。

三十一、Java面向对象编程特性-多态

多态优点

序号

优点

1

提高代码的通用性和可扩展性,增加程序的灵活性。

2

减少代码冗余,通过父类引用可以统一处理不同子类的对象。

3

更容易遵循开闭原则,即对扩展开放,对修改关闭。

多态类型

类型

描述

编译时多态

也称为静态多态或方法重载(Overloading)。在编译时,编译器根据方法的声明类型(即参数列表)来确定调用哪个方法。

运行时多态

也称为动态多态或方法重写(Overriding)。在运行时,JVM根据对象的实际类型(即运行时类型)来确定调用哪个方法。

实现条件(三个关键要素)

关键要素

描述

继承

存在类的继承关系。

重写(Override

子类需要重新定义父类中的至少一个方法,即实现相同方法签名的方法。

向上转型(Upcasting)

父类引用指向子类对象,如 `Parent p = new Child();` 这种形式。

类型擦除:

Java中的泛型也实现了某种程度的编译时多态,但因为Java的泛型是类型擦除的,所以在运行时不存在真正意义上的多态性。

动态绑定(实现多态):

在Java中,对于非静态方法,方法的调用是在运行时根据对象的实际类型决定的,而不是根据声明类型,这种机制被称为动态绑定或晚期绑定。

示例:

// 定义一个父类
public class Animal {
  public void makeSound() {
    System.out.println("The animal makes a sound.");
  }
}

// 定义一个子类
public class Dog extends Animal {
  @Override
  public void makeSound() {
    System.out.println("The dog barks.");
  }
}

public class Main {
  public static void main(String[] args) {
    Animal myAnimal = new Dog(); // 向上转型
    myAnimal.makeSound(); // 输出 "The dog barks."
  }
}

在上述示例中,尽管 `myAnimal` 是 `Animal` 类型的引用,但它实际上指向的是 `Dog` 对象。因此,当调用 `makeSound()` 方法时,实际执行的是 `Dog` 类中重写的版本。

向上转型(Upcasting)

当一个子类的对象被赋予一个父类引用时,就会发生向上转型。这是Java中自动发生的、隐式的类型转换,无需额外的类型转换语法。

向上转型的安全性在于,任何子类对象都可以视作其父类的实例,因为它总是具有父类的属性和方法。

示例:

class Animal {}
class Dog extends Animal {}
Animal animal = new Dog(); // 向上转型:子类Dog的对象自动转换为父类Animal的引用


向下转型(Downcasting)

向下转型是将父类引用显式地转换回它的子类引用,这个过程需要使用强制类型转换,并且不是自动完成的。

向下转型存在风险,只有当父类引用实际上指向的是目标子类的实例时,向下转型才是合法且安全的。否则,将会抛出`ClassCastException`异常。

示例:

Animal animal = new Dog();
Dog dog = (Dog) animal; // 向下转型:父类Animal的引用尝试转换为子类Dog的引用


向上转型与向下转型应用场景

向上转型通常用于实现多态,使得父类引用可以指向任何子类对象,方便统一处理多种子类对象。

向下转型通常发生在需要使用子类特有方法或属性的时候,恢复原始子类的完整功能。

判断安全性

在进行向下转型前,可以通过instanceof关键字检查对象是否确实是目标子类的实例,以确保转型成功:

if(animal instanceof Dog) {
    Dog dog = (Dog) animal;
    // 现在可以安全地调用Dog类特有的方法
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表