当前位置: 首页 > 面试题库 >

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

滕令雪
2023-03-14
问题内容

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

  • 除非进行覆盖,否则仅通过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,4,5)

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


问题答案:

在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中方法签名的一部分,因此编译器会将其解释为方法的重新定义。)



 类似资料:
  • 静态绑定还是动态绑定? 这显示了什么样的多态性?

  • 关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗? 钥匙compareTo(list[position-1])使用动态绑定 (this . last name . compare to(S1 . last name))为什么使用静态绑定?

  • 本文向大家介绍浅谈Java中的重载,重写,多态,静态绑定、动态绑定,包括了浅谈Java中的重载,重写,多态,静态绑定、动态绑定的使用技巧和注意事项,需要的朋友参考一下 本文主要研究的是关于Java中重载,重写,多态,静态绑定、动态绑定的相关内容,具体如下。 重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称的方法,这些方法的参数个数、参数类型和顺序不能相同。返回类型可以相同,

  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 问题内容: 我正在为测试做练习,并且遇到了有关重载以及静态和动态绑定的练习。询问以下代码的输出: 我 认为 我获得了第一个,但在其他方面我完全迷失了。这是我解决第一个问题的方法: 在运行时,类型为,因此我们调用Curly的print方法。由于我们传递了要打印的类型的对象,因此在中运行了具有参数类型的相应打印方法。该方法的输出为,正确答案。 但是,当我将这种技术应用于以下几行时,我得到的答案是错误的

  • 我想我得到了第一个,但在其他方面我完全迷失了。我是这样解决第一个问题的: 在运行时,的类型是,所以我们调用curly的print方法。因为我们将类型的对象传递给print,所以相应的参数类型为的print方法在中运行。此方法的输出是,正确答案。 然而,当我将此技术应用到以下行时,我最终得到了错误的答案。有人能解释一下这个概念在Java中到底是如何工作的吗? 代码的正确输出是: