微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

阐述:方法重载是静态/编译时绑定,但不是多态将静态绑定与多态相关联是否正确?

如何解决阐述:方法重载是静态/编译时绑定,但不是多态将静态绑定与多态相关联是否正确?

在Java世界中,多态是指类之间的多态。也就是说,可能有多个子类与其共同的父类一起引用。在Java中,方法之间没有多态性。

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

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

解决方法

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

  • 除非进行覆盖,否则仅通过Override才能实现多态。而且,它只能在运行时看到,人们可能将其命名为“运行时多态性”。( 我不反对将 多态 称为 运行时多态
  • 我反对 方法重载 称为 编译时多态 或多

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

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

根据javadoc中名为“
定义方法”的部分所述,它解释了方法的重载。但是,编译时多态性没有任何意义。

据我说:

如果将多态放入“运行时多态”的类别中,则在更改JDK版本时只能看到“编译时多态”:

如果从较高的JDK版本切换到较低的版本,您将开始看到编译错误。
相同的代码在编译期间的行为有所不同,例如:lambda表达式,菱形运算符,开关大小写的字符串,泛型等。

让我详细说明一下我对运行时多态性和编译时多态性的预测如何进入博客/教程:

对话1

开发人员1:
嘿,我今天读到有关多态的信息。如果对接口进行编码,则可以实现多态。编写不是紧密耦合到类的代码,而是通过进行松散耦合将其写入接口,调用超类方法或接口方法实际上取决于传递的实例来调用子类的方法。

开发人员2: 对不起,我没有得到您。

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

开发人员2: 哦! 运行时间 。我知道了。

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

开发人员2:运行时间!** 知道了

对话2

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

开发人员3: 通过覆盖方法运行时多态吗?那么什么是oveloading?编译时多态性?

开发人员2: 您怎么说重载是编译时多态性?

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

开发人员2: 无声!

多态性编码接口的 最佳示例是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实例的方法。即,它执行重写的方法。如果注册了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);
}

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

问题2: 方法调用add(3,4);在什么情况下会显示多态性,除非将其修改为add(3,5)


EDIT
@FutureVisitor, 因为此线程没有找到支持方法重载作为多态性类型的答案(即使在问了一个月的问题之后),也没有任何理由接受支持
方法重载的 答案,而不支持 方法重载不是多态性 (如果有答案的话)在我的方法重载论点中,多态性不会被接受并支持其观点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。