实现多态的多种方式

简介: 【10月更文挑战第19天】这些多态的实现方式各有特点,在不同的场景中可以灵活运用,以提高代码的灵活性、可扩展性和复用性。

除了方法重写,还有以下几种方式可以实现多态:

  1. 接口实现:通过让不同的类实现同一个接口,这些类可以以各自不同的方式来实现接口中的方法,从而体现多态性。每个实现类都可以有其独特的行为表现。
  2. 抽象类继承:一个抽象类可以定义一些抽象方法和具体方法。子类继承这个抽象类后,必须实现其中的抽象方法,同时可以根据需要重写具体方法,实现不同的行为,这也是一种多态的体现。
  3. 方法参数类型的多态性:在方法中接受父类类型的参数,实际传递子类对象。这样,在方法内部可以根据实际对象的类型来执行相应的操作,体现了多态性。
  4. 对象造型:将子类对象转换为父类对象,然后通过父类引用调用方法。运行时会根据实际对象的类型执行相应的方法,实现多态。

以接口实现多态为例,假设有一个接口Shape

public interface Shape {
   
    void draw();
}

然后有两个类CircleSquare分别实现这个接口:

public class Circle implements Shape {
   
    @Override
    public void draw() {
   
        System.out.println("绘制圆形");
    }
}

public class Square implements Shape {
   
    @Override
    public void draw() {
   
        System.out.println("绘制正方形");
    }
}

在使用时,可以创建不同的形状对象,并通过接口引用调用方法:

Shape shape1 = new Circle();
Shape shape2 = new Square();

shape1.draw();
shape2.draw();

在这里,虽然shape1shape2都是Shape类型的引用,但实际执行的是不同类的draw方法,体现了多态性。

抽象类继承的方式也类似。假设有一个抽象类Animal

public abstract class Animal {
   
    public abstract void makeSound();
}

然后有两个子类DogCat继承自它:

public class Dog extends Animal {
   
    @Override
    public void makeSound() {
   
        System.out.println("汪汪汪");
    }
}

public class Cat extends Animal {
   
    @Override
    public void makeSound() {
   
        System.out.println("喵喵喵");
    }
}

在使用时,可以通过抽象类引用调用方法:

Animal animal1 = new Dog();
Animal animal2 = new Cat();

animal1.makeSound();
animal2.makeSound();

同样,根据实际对象的类型执行不同的方法。

方法参数类型的多态性可以通过一个方法接受父类类型的参数来实现。比如有一个方法processShape

public void processShape(Shape shape) {
   
    shape.draw();
}

然后可以传递不同的形状对象给这个方法:

processShape(new Circle());
processShape(new Square());

在方法内部,根据实际对象的类型执行相应的操作。

对象造型的方式则是将子类对象转换为父类对象,然后通过父类引用调用方法。比如:

Circle circle = new Circle();
Shape shape = (Shape) circle;

shape.draw();

在这种情况下,运行时会根据实际对象的类型执行相应的方法。

这些多态的实现方式各有特点,在不同的场景中可以灵活运用,以提高代码的灵活性、可扩展性和复用性。

目录
相关文章
|
缓存 NoSQL Java
面试官:如何保证本地缓存的一致性?
面试官:如何保证本地缓存的一致性?
2800 1
Temporary email邮箱API发送邮件的步骤
使用Temporary email API发送邮件可保护隐私。步骤包括:了解API原理,注册获取API密钥,调用API并传入密钥,生成临时邮箱地址,编写邮件内容,然后发送。此方法确保真实邮箱不被泄露,适用于避免垃圾邮件。记得遵守使用规定和法规。
|
存储 数据可视化 C语言
[iOS研习记]聊聊iOS中的Mach-O
Mach-O的全称为Mach Object,是OS X与iOS上的一种可执行文件格式。Mach本身指一种操作系统的微内核标准,被用于OS X与iOS系统的内核中。相信对于移动端的iOS开发者来说,对Mach-O文件一定不陌生,我们编译打包的iOS IPA文件,内部其实就有一个可执行的Mach-O文件,我们开发的framework和.a等动态库静态库中,也会包含Mach-O文件,本篇文章,我们就来详细看看Mach-O中究竟放的是什么,Mach-O的结构是怎样的。
1198 0
|
3月前
|
人工智能 iOS开发
|
Java
方法重载和方法重写有什么区别?
本文解释了Java中方法重载(Method Overloading)和方法重写(Method Overriding)的区别,包括它们的定义位置、参数要求、返回值要求、业务功能以及绑定方式的不同,并提供了示例代码。
528 2
方法重载和方法重写有什么区别?
|
Java
Java中的throw和throws:异常处理详解
Java中的throw和throws:异常处理详解
1380 0
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
算法 搜索推荐 开发者
解锁Python代码的速度之谜:性能瓶颈分析与优化实践
探索Python性能优化,关注解释器开销、GIL、数据结构选择及I/O操作。使用cProfile和line_profiler定位瓶颈,通过Cython减少解释器影响,多进程避开GIL,优化算法与数据结构,以及借助asyncio提升I/O效率。通过精准优化,Python可应对高性能计算挑战。【6月更文挑战第15天】
2335 1
|
SQL 数据处理 数据库
DELETE 和 TRUNCATE 语句之间的详细区别
【8月更文挑战第31天】
2159 0
|
关系型数据库 MySQL 数据库
Flask使用SQLAlchemy添加悲观锁和乐观锁
什么是悲观锁和乐观锁? • 悲观锁:假设在访问数据时会发生冲突,因此在访问数据前,先锁住数据。在锁被释放之前,其他事务无法访问此数据。是属于数据库中的一种互斥锁机制 • 乐观锁:假设在访问数据时冲突较少,因此不会锁住数据,而是在提交更新时检查是否有冲突。如果检测到冲突,则放弃更新。但是乐观锁并非真正的数据库锁。