java多态中的就近原则介绍

yizhihongxing

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日

相关文章

  • vue如何根据不同的环境使用不同的接口地址

    Vue可以通过配置不同的环境变量来实现在不同的环境下使用不同的接口地址。以下是实现的步骤: 1. 创建环境变量配置文件 在Vue项目根目录下创建.env文件,以及.env.development、.env.production等与环境对应的文件。其中,.env是默认的环境配置文件,.env.production文件适用于生产环境,.env.developme…

    other 2023年6月27日
    00
  • ios学习——uialertcontroller详解

    iOS学习——UIAlertController详解 在iOS开发中,弹窗是必不可少的一个组件。UIAlertController是iOS 8之后引入的一个更加强大和灵活的弹窗组件,取代了之前的UIAlertView和UIActionSheet。本文将详细介绍UIAlertController的用法和相关属性。 UIAlertController的类型 UI…

    其他 2023年3月29日
    00
  • Java NIO实现多人聊天室

    Java NIO(New IO)是Java 1.4版本新增的一组IO API,是Java提供的非阻塞IO解决方案。Java NIO通过Channel、Buffer、Selector等新的概念,提供高速的、可扩展的、非阻塞的IO操作方式,使其能够轻松地实现高性能的网络应用程序。下面将详细介绍如何使用Java NIO实现多人聊天室。 1. 需求分析 我们需要实现…

    other 2023年6月27日
    00
  • Android webview和js互相调用实现方法

    Android WebView和JS互相调用实现方法攻略 在Android开发中,WebView是一个用于显示网页内容的控件,而JavaScript(JS)是一种用于在网页中实现交互功能的脚本语言。在WebView中,我们可以通过互相调用来实现Android和JS之间的交互。下面是实现方法的详细攻略。 1. Android调用JS方法 要在Android中调…

    other 2023年8月26日
    00
  • Windows11搜索栏不起作用怎么办?搜索栏不起作用的修复方法

    针对“Windows11搜索栏不起作用”的问题,我们可以尝试以下几种修复方法: 方法一:重启Windows资源管理器 有时候,Windows资源管理器会出现异常,导致搜索栏无法正常工作。这时,我们可以尝试通过重启Windows资源管理器来解决问题。 打开任务管理器。可以通过按下Ctrl + Shift + Esc快捷键来快速打开任务管理器。 在“进程”选项卡…

    other 2023年6月27日
    00
  • python递归法解决棋盘分割问题

    Python递归法解决棋盘分割问题 什么是棋盘分割问题 棋盘分割问题,又称为拼图游戏(jigsaw puzzle)问题,是一种求解问题的方式,将原始问题分解成若干个易于解决的子问题,然后再组合各个子问题的解得到原问题的解。它是一种典型的分治算法问题,即把一个大问题分成若干个小的相似的子问题来解决。 问题描述 在一个$n\times n$的棋盘中,删除一个任意…

    other 2023年6月27日
    00
  • Java扫描文件夹下所有文件名

    下面是Java扫描文件夹下所有文件名的详细攻略。 步骤一:获取文件夹路径 首先,我们需要通过代码获取待扫描的文件夹路径。Java中提供了File类,它可以用来代表文件或文件夹。我们可以通过该类的构造函数传入文件夹路径来创建一个File对象,从而获取待扫描的文件夹路径。示例代码如下: String path = "C:\\example\\&quot…

    other 2023年6月26日
    00
  • gitstash命令及提交指定文件

    Git Stash命令 Git Stash命令用于将当前工作目录中的修改暂存起来,以便在后续需要时恢复。这个命令非常有用,可以让开发者在切换分支或者修复紧急bug时,暂时保存当前的修改,以免丢失。下面是Git Stash命令的基本用法: 1. git stash 将当前工作目录中的修改暂存起来,命令如下: git stash 2. git stash lis…

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