网站首页 > java教程 正文
Java面向对象编程中的多态性(Polymorphism)是其核心特性之一,指的是同一接口(或父类)的不同实现类对象可以相互替换并呈现出不同的行为。多态体现了“一个接口,多种实现”的原则,有助于提高代码的灵活性和可扩展性。
概念
多态允许你使用一个接口或父类引用指向其实现类的对象。这意味着你可以针对基类(父类)定义一个引用变量,然后让这个变量引用其任意子类的对象。在运行时,实际调用的方法是子类中重写(overridden)的版本。
多态优点
序号 | 优点 |
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类特有的方法
}
猜你喜欢
- 2024-09-27 Java多态重载和重写(类方法设计中多态与重载的区别是什么)
- 2024-09-27 什么是多态?Java为什么要用多态?(java中什么是多态性)
- 2024-09-27 别找了!月薪30k的T6大佬整理的Java多态知识点总结,限时收藏
- 2024-09-27 Java多中包括态理解、多态实现、重写、转型和抽象类
- 2024-09-27 Java中的封装、继承和多态,你真的都懂了吗
- 2024-09-27 java基础之多态与向上转型,很用心的一篇笔记
- 2024-09-27 Java多态的介绍-学习日志(java的多态是什么)
- 2024-09-27 Java路径-25-Java多态(java路径错误)
- 2024-09-27 Java中的多态(基础语法)(java多态的定义和应用)
- 2024-09-27 Java面试-Java中是如何实现多态的?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)