Java中的方法签名是否包含返回types?

Java类/接口中的方法签名是否包含其返回types?

例:

Java是否知道这两种方法之间的区别:

public class Foo { public int myMethod(int param) {} public char myMethod(int param) {} } 

或者,也许只有方法名称和参数列表是重要的?

从Oracle Docs引用:

定义:方法声明的两个组件包括方法签名 – 方法名称和参数types。

在这里输入图像描述

由于这个问题被编辑成包含这个例子:

 public class Foo { public int myMethod(int param) {} public char myMethod(int param) {} } 

不,编译器将不会知道它们的签名: myMethod(int param)是相同的。 第二行:

  public char myMethod(int param) {} 

会给你的错误: 方法已经在类中定义了 ,这进一步证实了上面的说法。

Java中的类方法签名是否包含返回types?

在Java中,它不会在这个JVM中执行,这会导致明显的混淆。

Java中的接口方法签名是否包含返回types?

和甲类一样。

还是只有方法名称和参数列表?

Java的方法名称和参数types。 例如,参数注释和名称无关紧要。

没有没有在Java中。 方法名称和参数列表仅用于方法签名 。 返回types不包括。

Java语言规范

方法名和参数列表是方法签名的一部分,因此No,返回types不是方法签名的一部分

在字节码级别,返回types是方法签名的一部分。 考虑这个

 public class Test1 { public Test1 clone() throws CloneNotSupportedException { return (Test1) super.clone(); } } 

在字节码中有2个clone()方法

 public clone()LTest1; throws java/lang/CloneNotSupportedException public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

他们只有返回types不同。

兄弟,在java中,我们用它们的名称和参数来调用方法,只是在我们的代码中使用它们

myMethod(20,40)

所以,JAVA只在其相应的声明(名称+参数)中search类似的东西匹配,这就是为什么方法签名只包含方法的名称和参数。 🙂

方法签名只是名称和参数列表。

不,在Java中,方法签名不包括返回types,但声明的确如此。

 public String getString(String myString) ^access modifier ^return type ^name ^parameter type and name 

根据以下反馈编辑:)

在JAVA和许多其他语言中,你可以调用一个没有variables的方法来保存返回值。 如果返回types是方法签名的一部分,则无法知道调用哪个方法时不指定variables保持返回值。

使用AspectJ(org.aspectj.lang.reflect.MethodSignature),它具有返回types

返回types不包含在方法签名中。只有方法名称参数被定义为方法签名。

Reffer: Oracle Docs的“定义方法”

方法签名只是方法的名称和参数。 但是我相信你的例子如果他们在同一个class上就会产生一个错误。 你可以在任何IDE上简单的testing一下,看看编译器会抛出一个错误

方法签名包括返回types。

当必须检查重复项时,编译器会忽略它。 对于Java来说,有两种签名只有返回types不同的方法是非法的。

尝试一下:

 public class Called { public String aMethod() { return ""; } } public class Caller { public static void main(String[] main) { aMethod(); } public static void aMethod() { Called x = new Called(); x.aMethod(); } } 

build立项目,进入bin目录,在某处复制Caller.cass 。 然后改变被调用的方法:

 public int aMethod() { return 0; } 

构build项目,你会看到Called.class和Caller.class都有一个新的时间戳。 replace上面的Caller.class并运行该项目。 你会有一个例外:

 java.lang.NoSuchMethodError: it.prova.Called.aMethod()Ljava/lang/String;