gpt4 book ai didi

java - 阐述 : Method overloading is a static/compile-time binding but not polymorphism. 将静态绑定(bind)与多态性相关联是否正确?

转载 作者:行者123 更新时间:2023-11-30 01:46:33 24 4
gpt4 key购买 nike

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

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

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

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

根据 javadoc 中名为 Defining Methods 的部分,它解释了方法的重载。但是没有关于编译时多态性的内容。

据我所知:

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

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

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

对话1

Developer 1: Hey I read about polymorphism today. If you do coding to interface, you can achieve polymorphism. writing codes not tightly coupling to a class but instead writing it to interface by making loose coupling, calling a superclass method or interface method actually invokes method of subclass depending on instance passed.

Developer 2: Sorry, I didn't get you.

Developer 1: It's simple at run time which object instance you will pass, that instance method will be executed.

Developer 2: Ohh! Run Time. I got it.

Developer 1: Yes same piece of code, but at Run Time passed instances are different.

Developer 2: **Run Time! Okay, I got it.

对话2

Developer 2: Hey yesterday I've met Developer1, he was telling about some run-time polymorphism. By overriding methods in a sub-class we can achieve it.

Developer 3: Run time polymorphism by overriding methods? Then what is oveloading? Compile time polymorphism?

Developer 2: How do you say overloading as compile time polymorphism?

Developer 3: Because it is decided at compile time only.

Developer 2: Silent!

多态接口(interface)编码最好的例子是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,依此类推。

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

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

According to javadoc ,

The Java programming language supports overloading methods, and Java can distinguish between methods with different method signatures.

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

问题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);
}

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

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

<小时/> 编辑
@FutureVisitor 因为该线程没有找到支持方法重载作为一种多态性的答案(即使在提出一个月的问题之后),没有任何理由接受支持方法重载的答案不是多态性,如果我的方法重载不是多态性论点中的任何答案点问题都会被接受并支持他们的观点。

最佳答案

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

void add(int a, int b)void add(int a, int b, int c) 在 Java 语法中是完全不同的方法。不应该如此 - 例如,在 C++ 中,您可以将它们相互转换 - 但在 Java 中却是如此。

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

关于java - 阐述 : Method overloading is a static/compile-time binding but not polymorphism. 将静态绑定(bind)与多态性相关联是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com