实现多态的多种方式

简介: 【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
面试官:如何保证本地缓存的一致性?
面试官:如何保证本地缓存的一致性?
2559 1
|
Java
方法重载和方法重写有什么区别?
本文解释了Java中方法重载(Method Overloading)和方法重写(Method Overriding)的区别,包括它们的定义位置、参数要求、返回值要求、业务功能以及绑定方式的不同,并提供了示例代码。
427 2
方法重载和方法重写有什么区别?
|
Java
Java中的throw和throws:异常处理详解
Java中的throw和throws:异常处理详解
1216 0
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
SQL 数据处理 数据库
DELETE 和 TRUNCATE 语句之间的详细区别
【8月更文挑战第31天】
1874 0
|
算法 搜索推荐 开发者
解锁Python代码的速度之谜:性能瓶颈分析与优化实践
探索Python性能优化,关注解释器开销、GIL、数据结构选择及I/O操作。使用cProfile和line_profiler定位瓶颈,通过Cython减少解释器影响,多进程避开GIL,优化算法与数据结构,以及借助asyncio提升I/O效率。通过精准优化,Python可应对高性能计算挑战。【6月更文挑战第15天】
2114 1
|
Java Maven
maven父子工程打包,跳过指定的子工程配置
maven父子工程打包,跳过指定的子工程配置
443 0
|
运维 监控 安全
阿里云云通信短信服务安全之安全责任共担与安全合规
阿里云云通信长久以来致力于为客户提供稳定可靠、安全可信、合法合规的通信服务,利用先进技术、建立产品体系、严格管理人员等不同手段以保护客户及合作伙伴数据的机密性、完整性、可用性,以数据安全、用户隐私保护作为阿里云云通信的最高准则。
691 0
Echarts legend图例配置项 设置位置 显示隐藏
Echarts legend图例配置项 设置位置 显示隐藏
2265 0
|
关系型数据库 MySQL 数据安全/隐私保护
64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)
原文:64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录) 上一节的MySQL的配置安装里,并没有用到配置文件my.ini。那在MYSQL8.0.13如何解决密码重置问题呢。
5734 0