java多态中的就近原则介绍

Java多态中的就近原则介绍

Java中的多态性有三种表现形式:方法重载、方法重写和对象引用的多态性。其中,对象引用的多态性就是实现延迟绑定的方式,它可以让我们在程序运行时根据实际对象类型来确定调用哪个方法。

在多态场景下,就近原则是作用于对象引用调用方法时的参数列表类型的选择(即决定使用哪个方法),它和方法重载得到相同条件下的参数匹配的方式相同。当Java编译器在遇到一个方法调用时,有多个方法可以作为候选时,就近原则规定,编译器使用参数类型与方法参数类型最接近的那个方法。

举例说明:

假设我们有一个父类Animal,子类Cat继承了父类。父类中定义了一个show()方法接收参数为Animal类型,子类重写了show()方法并接收参数为Cat类型。

class Animal {
    public void show(Animal animal) {
        System.out.println("Animal show");
    }
}

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

    public void show(Cat cat) {
        System.out.println("Cat show, Cat parameter");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal cat = new Cat();
        Cat cat1 = new Cat();
        cat.show(cat1);
    }
}

上述代码中,我们创建了一个Animal类型的变量cat,并用它指向了一个Cat类的实例。在调用cat.show(cat1)时,会出现多个同名的show方法可供调用,参数列表分别为(Animal)(Cat)。由于参数类型Cat更加接近方法中的参数类型,所以选择就近规则,在此情况下,会选择(Cat)类型的方法,输出结果为Cat show, Cat parameter

再举例说明:

假设我们定义两个接口InterfaceAInterfaceB,类Test实现了两个接口,并分别实现了接口方法showA()showB()

interface InterfaceA {
    public void show();
}

interface InterfaceB {
    public void show();
}

class Test implements InterfaceA, InterfaceB {
    public void show() {
        System.out.println("Test");
    }

    public static void main(String[] args) {
        Test test = new Test();
        InterfaceA ia = test;
        InterfaceB ib = test;
        ia.show();
        ib.show();
    }
}

在代码中,我们创建了一个Test类型的实例test并将其赋值给类型为InterfaceAInterfaceB的两个变量。分别调用ia.show()ib.show()时,输出结果均为Test。由于Java中的接口只能定义未实现的方法,因此编译器需要根据参数类型来确定使用哪个实现,这里就近规则依然适用,选择输出Test

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多态中的就近原则介绍 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Win11玩红警黑屏怎么办?Win11玩红警出现黑屏的两种解决方法

    在Win11系统下玩红警游戏时,偶有出现黑屏的情况。这是由于Win11系统在开启了虚拟化技术后,对显卡的驱动会有一定的要求,而一些较老的显卡可能无法满足这些要求,导致在游戏中出现黑屏情况。下面是两种解决方法,供大家参考: 方法一:关闭虚拟化技术 在电脑开机时,按下电源键,直到电脑完全关闭,再按下电源键,开机进入系统。 在开机过程中,按下F2、DEL、F12或…

    other 2023年6月27日
    00
  • vue LogicFlow自定义边实现示例详解

    下面是对“vue LogicFlow自定义边实现示例详解”的完整攻略。 一、前言 Vue LogicFlow 是一个基于 Vue.js 的流程图库,它提供了许多丰富的功能和组件,例如节点、连线、锚点等。其中,连线是流程图中不可或缺的一个元素,Vue LogicFlow 可以自定义连线,本文将详细讲解如何实现自定义边。 二、实现自定义边 2.1 边类型定义 在…

    other 2023年6月25日
    00
  • Android开发技巧之我的菜单我做主(自定义菜单)

    下面我将详细讲解“Android开发技巧之我的菜单我做主(自定义菜单)”的完整攻略。 1. 确定需求和设计菜单样式 在进行自定义菜单开发之前,我们需要确定自己的需求并设计出菜单的样式。根据需求和样式设计,我们可以选择使用 PopupMenu 或者自定义 PopupWindow 实现菜单。 2. 实现 PopupMenu 2.1 引入支持包 在使用 Popup…

    other 2023年6月25日
    00
  • Springboot打包部署修改配置文件的方法

    下面是详细讲解SpringBoot打包部署修改配置文件的方法的攻略: 1. 打包SpringBoot项目 在打包之前,需要确保已经在项目中引入了spring-boot-starter-parent依赖,并且在pom.xml文件中配置了打包方式。 <!– 引入SpringBoot父级依赖 –> <parent> <groupI…

    other 2023年6月25日
    00
  • Android实战–电话拨号器

    Android实战–电话拨号器的完整攻略 在Android应用程序中,我们可以使用电话拨号器来拨打电话。本文将介绍如何在Android应用程序中实现电话拨号器,包括权限申请、UI设计、拨号功能实现等。 1. 权限申请 在Android应用程序中,我们需要申请CALL_PHONE权限才能拨打电话。在AndroidManifest.xml文件中添加以下代码: …

    other 2023年5月5日
    00
  • 基于Jquery的动态添加控件并取值的实现代码

    以下是基于JQuery的动态添加控件并取值的实现代码攻略: 步骤一:在HTML中添加基本的页面结构 首先,在HTML中添加基本的页面结构,包含一个用于添加元素的按钮和一个用于显示所添加元素的容器。可以使用以下代码: <!doctype html> <html> <head> <meta charset="u…

    other 2023年6月27日
    00
  • 锐龙5 3600和酷睿i5-9600KF怎么选 锐龙5 3600和酷睿i5-9600KF对比介绍

    当选择锐龙5 3600和酷睿i5-9600KF之间的处理器时,可以考虑以下几个方面进行对比和评估: 性能对比 首先,我们可以比较它们的性能指标,包括核心数量、线程数量和主频。锐龙5 3600拥有6个核心、12个线程和3.6GHz的基础主频,而酷睿i5-9600KF则有6个核心、6个线程和3.7GHz的基础主频。从核心和线程数量上看,锐龙5 3600具有更多的…

    other 2023年10月17日
    00
  • Windows 11系统怎么修改用户名密码? win11更改账户密码的多种方法

    以下是“Windows 11系统怎么修改用户名密码? win11更改账户密码的多种方法”的完整攻略。 方法一:使用系统设置更改密码 打开“设置”应用,点击左侧菜单栏中的“帐户”选项。 在右侧的“帐户信息”窗口中,找到“登录选项”下的“更改密码”链接,点击进入。 在弹出的“更改您的密码”窗口中,输入当前账户的密码,并输入新密码,确认新密码后点击“下一步”按钮。…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部