为什么在方法重载的上下文中,参数顺序被视为方法签名的一部分?



在此代码中…

public class Person {

public void walk(String alpha, int beta) {}

public void walk(int beta, String alpha) {}
}

…我只是改变了参数的顺序,但它仍然被认为是方法重载,即编译时的静态绑定。我的问题是:

  1. 为什么在Java中顺序被认为是方法签名的一部分?
  2. 优点是什么?从我的角度来看,我没有看到这样做的确切优势。

因为"先吃午饭后慢跑"one_answers"先慢跑后发射"是两种不同的模式,尽管它们只是顺序不同。

在Java中,我们有一个方法重载的概念,也就是说,在一个类中,你可以定义具有相同名称的方法,只要它们的签名不同。

现在让我们重新定义上面的"慢跑/午餐";例如,转换为更正式和与java相关的概念:

当你有重载方法时,JVM需要一些方法来理解调用哪个特定的重载方法,使用标识多个方法的名称;并且它知道,由于类型、数字和,顺序

只有类型是不够的信息,因为如果Java忽略了匹配形参及其各自实参的顺序,就不清楚调用哪个特定的方法。

假设您定义了foo(int a, char b)foo(char a, int b),然后在某处调用了.foo([...])。你认为基于什么编译器应该决定为这个代码编译哪个方法调用?(如果你违反了签名,编译器不会让你通过);此外—稍后,在运行时,当调用foo时,JVM应该如何执行绑定,但是至少有两个方法定义了相同的名称?

为此,方法具有签名,其中参数的顺序显示出不同的模式,使Java机器能够进行正确和适当的绑定和调用。

同样,在假设的场景中,考虑变量,其中参数的顺序无关紧要。

你认为:

foo(String... a, String b)

foo(String b, String... a)

将是相同的?

如果你这样做,你错了。

用外行人的话来说,解析输入模式变得很困难-应该考虑在其第一个参数中接受多少输入字符串字面值,第一个签名的方法,作为数组参数(仅第一个字面值?前两个?有多少?数组在哪里结束?),特别是哪个字符串参数应该被接受为第二个形参(要获得更深入的解释,请参阅此);因此,您将有一个编译时错误:

error: varargs parameter must be the last parameter

而在第二种情况下,不管调用该方法时会使用多少个字符串s,第一个参数将始终绑定到第一个形参,其余的将构成一个数组,作为实参传递给第二个形参。

参数的顺序是不同的,因为它是不同的签名。想象一下,你有一个人的签名,并改变了字母的顺序,它将不再是相同的签名。

如果我们以我的Username为例,RStevoUK和UKRStevo是完全不同的。

你提出的案例有什么优点吗?没有。

我不建议使用具有相同名称和相同参数的方法,而只是四处走动,因为这样做没有意义。你所能达到的只是调用错误方法的可能性(如果它们都有不同的方法体)和混淆,就像你建议的那样。

相关内容

最新更新