详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是否正确?

2023-12-03

在提问之前,我先阐述一下我的理解和看法。

  • 除非有向上转换,否则仅通过重写无法实现多态性。由于它只能在运行时看到,人们可能将其命名为运行时多态性。 (我不反对打电话多态性 as 运行时多态性)
  • 我有异议打电话方法重载 as 编译时多态性 or 多态性.

我同意方法重载是静态绑定(编译时绑定),但我看不到其中的多态性。

根据javadoc,只有多态性。不存在编译时或运行时多态性。

根据 javadoc 中的一个名为定义方法,它解释了方法的重载。但是没有关于编译时多态性的内容。

据我说:

如果你把多态性归入运行时多态性范畴,那么当你改变你的JDK版本时,你只能看到“编译时多态性”:

如果您从较高版本的 JDK 切换到较低版本,您将开始看到编译错误。相同的代码在编译时表现不同,例如:lambda 表达式、菱形运算符、switch case 中的字符串、泛型等。

让我详细阐述我的观点,以及我对运行时多态性和编译时多态性如何出现在博客/教程中的预测:

对话1

开发商1:嘿,我今天读到了多态性。如果对接口进行编码,就可以实现多态性。编写不与类紧密耦合的代码,而是通过松散耦合将其写入接口,调用超类方法或接口方法实际上会根据传递的实例调用子类的方法。

开发者2:抱歉,我没听懂你的意思。

开发商1:在运行时很简单,您将传递哪个对象实例,将执行该实例方法。

开发者2: Ohh! Run Time。我得到了它。

开发商1:是的,同一段代码,但在运行时传递的实例是不同的。

开发人员 2:**运行时!好的,我明白了。

对话2

开发者2:嘿,昨天我遇到了 Developer1,他讲述了一些运行时多态性。通过重写子类中的方法我们可以实现它。

开发商3:通过覆盖方法实现运行时多态性?那么什么是超载呢?编译时多态?

开发者2:你怎么说重载作为编译时多态性?

开发商3:因为它仅在编译时决定。

开发者2: Silent!

多态性 and 编码到接口最好的例子是 java.sql:

java.sql.Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
java.sql.Statement stmt = conn.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(sql);

根据注册的驱动程序,同一段代码的行为有所不同。这意味着,如果我们注册 Mysql 驱动程序,由于多态性,该代码将执行 mysql 实例的方法。 IE。它执行重写的方法。如果您注册了 Oracle 驱动程序,它就适用于 Oracle,等等。

上面我们发现相同的代码表现不同。

现在任何人都可以向我展示相同的代码在编译时的行为不同。或者换句话说,告诉我add(3,4)方法在编译时绑定到不同的方法(其他签名方法)?

根据javadoc,

Java编程语言支持重载方法,并且Java可以区分具有不同方法签名的方法。

该方法将根据签名匹配来执行。方法具有相同的名称并不意味着存在多态性,因为调用方法的签名不同:

问题1:如果不更改调用方法签名,它会调用除签名匹配的方法之外的其他方法吗?在任何情况下它的行为都会有所不同吗?

我们来看看方法重载:

public void add(int a, int b)
{
    System.out.println(a+b);
}

public void add(int a, int b, int c)
{
    System.out.println(a+b+c);
}

public static void main(String[] args)
{
    add(3,4);
    add(3,4,5);
}

问题一:如果方法重载是多态性,那么上述代码块中哪一段代码的行为不同?这里的多态性在哪里?

问题2:方法调用add(3,4);在什么场景下才表现出多态性,除非修改为add(3,4,5)?


EDIT
@FutureVisitor since this thread found no answers in favor of method overloading as a type of polymorphism(Even after a month of question being asked), without any justification accepting answer in favor of Method overloading is not a polymorphism, if any answer points problem in my argument of method overloading is not polymorphism will be accepted and supported their views.

在Java世界中,多态意味着类之间的多态。 IE。引用可能的多个子类及其共同的父类。在Java中,方法之间不存在多态性。

void add(int a, int b) and void add(int a, int b, int c)在 Java 语法中是完全不同的方法。不应该这样 - 例如,在 C++ 中,你可以cast它们彼此为 -,但在 Java 中却是如此。

这里要理解的关键概念是方法签名。方法签名在语言中定义了识别各个方法的内容。 (例如,在一个void add(int a, int b);,你根本不能声明一个int add(int a, int b);方法 - 返回值不是 Java 中方法签名的一部分,因此编译器会将其解释为方法重新定义。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是否正确? 的相关文章

随机推荐

  • 使用 Ajax 访问 ServiceStack 验证的服务

    我一直在研究一个简单的 API 示例 它是带有身份验证的 ServiceStack Hello World 示例的修改版本 概念验证的目标是创建一个 RESTful API 其中包含需要完全通过 Ajax 从多个不同 Web 项目访问的服务
  • 互斥存储过程

    我想使用数据库表创建一些分布式互斥 如果存储过程具有以下接口那就太好了 等待 唯一标识符 我最初考虑通过一个唯一标识符表来实现这一点 对该过程的调用将等到表中不存在唯一标识符为止 但是 我不确定当从表中删除指定的唯一标识符时如何唤醒调用线程
  • Java PDFBOX 文本编码

    我尝试将 Java 应用程序中的一些数据导出到 pdf 文件 我决定使用 pdfBox 库 但我意识到我无法将希腊字符正确显示到 pdf 文件中 有没有办法设置编码 到 utf8 还是 iso 8859 7 我尝试了 PdFontEncod
  • wxPython:将文件拖到窗口中以获取文件路径

    我想将文件拖到窗口中并获取文件路径 我尝试这样做 class CSVDropper wx FileDropTarget def init self data wx FileDropTarget init self self data dat
  • JarFile 从 *.jar 或输入流内部到文件?

    我有一个罐子或战争 我正在以编程方式读取这个罐子 当我在这个罐子里找到罐子时 我想以编程方式再次读取它 但 JarFile 仅提供 getInputStream 我无法将其传递给 JarFile File file 构造函数 如何从jar中
  • Instagram“你不能喜欢这个媒体”400状态代码

    我知道 Instagram API 几个小时前关闭了 但现在似乎又恢复了 问题是 当我们向 Instagram 发布数据说喜欢某张特定照片时 我们会收到以下错误 meta error type APINotAllowedError code
  • 窗口大小调整时获取文档的大小

    当我调整窗口大小时 我可以找到窗口的大小 就像这样 现在我想在调整窗口大小时获取文档大小 每次调整窗口大小时如何获取大小 窗口 width 返回浏览器视口的宽度 文档 width 返回 HTML 文档的宽度
  • 嵌入式 Google 文档 PDF 查看器显示登录页面而不是 PDF

    我有一个网页 在 iFrame 中嵌入了 Google 文档查看器 其中 URL encoded URL 是实际编码的 URL 对于我的许多 大多数用户来说 Google PDF 文档查看器会出现并显示引用的 PDF 但我的一些用户却看到带
  • 如何在Python中读取大文件的特定部分

    给定一个大文件 数百 MB 我如何使用 Python 快速读取文件内特定开始索引和结束索引之间的内容 本质上 我正在寻找一种更有效的方法 open filename read start index end index You can se
  • webview 不显示 javascript windows.open()

    我有一个WebView我在其中显示我无法控制的网页内容 内容显示正常 但有生成弹出窗口的链接 执行此操作的 javascript 函数如下所示 function getEntry id var win window open Booking
  • 如何获取使用特定共享工作簿的用户列表?

    我正在使用共享工作簿 有一个代码可以撤消 WB 共享 更新工作表中的数据 然后再次共享 WB 如果有用户连接到该 WB 他们将失去在 WB 上保存的能力 Excel 会要求他们以不同的名称保存 WB 我的问题是如何获取当前正在使用 WB 的
  • REST WCF 的 WSDL

    我通过在 web config 中指定 WebGET 和 WebHttpBinding 在 C 中创建了 REST WCF 该服务通过 IE 运行良好 我的 wsdl 开始如下 它在 wsdl 中有肥皂 由于这是 REST soap 不应该
  • 输入键保存文本区域值

    你好 我有 ckeditor 和一个用于使用 ajax 保存 ckeditor 文本的按钮
  • 生成与现有一维数组具有预先指定相关性的 NumPy 一维数组?

    我有一个未生成的一维 NumPy 数组 现在 我们将使用生成的一个 import numpy as np arr1 np random uniform 0 100 1 000 我需要一个关联的数组0 3用它 arr2 print np co
  • 本地控制器与核心控制器

    我在本地管理 app code local Mage Adminhtml Block Catalog Product Grid php 中添加新的列和操作 但是效果很好 本地控制器 app code local Mage Adminhtml
  • 如何向Android中同一应用程序的注册用户发送通知

    每当我作为管理员添加某些内容时 我想通知已下载应用程序的用户 每个下载该应用程序的用户都会注册 我有关于用户的所有信息 我想在向我的应用程序添加某些内容时发出通知 通常我添加的数据将存储在数据库中 请告诉我如何实现这一点 你应该使用GCM用
  • PhotoKit 中的删除:可以跳过“最近删除”吗?

    从 iOS8 开始 当您删除照片时 它会进入一个名为 最近删除 的类似垃圾箱的文件夹中 当您通过 Photos app 或通过 PhotoKit API 使用PHAssetChangeRequest deleteAssets 在 Photo
  • Excel VBA If and then 无法正确评估

    我有下面的代码 在我看来 IF 语句有问题 工作簿中有两个选项卡 ALLDATA 选项卡和 COMP 选项卡 该宏应该按日期 ALLDATA 选项卡的 A 列 金额 COMP 选项卡上的单独列 以第 1 行开头 填充收款人列表 ALLDAT
  • 我的 .map 方法在功能上无法正常工作

    我不知道为什么 map 方法被完全忽略 即使在删除条件后 它也不会将小部件添加到我的列表中 似乎 groupsToRename map 根本不存在 List
  • 详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是否正确?

    在提问之前 我先阐述一下我的理解和看法 除非有向上转换 否则仅通过重写无法实现多态性 由于它只能在运行时看到 人们可能将其命名为运行时多态性 我不反对打电话多态性 as 运行时多态性 我有异议打电话方法重载 as 编译时多态性 or 多态性