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

far*_*oft 95 java method-signature

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

例:

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

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}
Run Code Online (Sandbox Code Playgroud)

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

Jop*_*ops 142

Oracle Docs引用:

定义:方法声明的两个组件包括方法签名 - 方法的名称和参数类型.

在此输入图像描述

由于编辑了该问题以包含此示例:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}
Run Code Online (Sandbox Code Playgroud)

不,编译器不会知道差异,因为他们的签名:myMethod(int param)是相同的.第二行:

    public char myMethod(int param) {}
Run Code Online (Sandbox Code Playgroud)

会给你错误:方法已在类中定义,这进一步证实了上述语句.

  • @casunSiyambalapitiya的cource我们不能.编译器如何知道在这个`foo.bar(baz);`这样的场景中调用哪些方法? (4认同)

Pet*_*rey 18

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

在Java中它不会,但在这个JVM中,它会导致明显的混淆.

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

与类methos相同.

或者只有方法名称和参数列表?

Java的方法名称和参数类型.例如,参数注释和名称无关紧要.

  • @xyz这是你可以通过读取字节代码而不是Java代码看到的东西.任何字节代码都会显示出来 (3认同)
  • @TarunMaganti JVM在方法签名中包括返回类型。Java作为一种语言没有。 (2认同)

Evg*_*eev 8

在字节码级别,返回类型是方法签名的一部分.考虑一下

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 
Run Code Online (Sandbox Code Playgroud)

它们只有返回类型不同.


Per*_*ror 7

Java语言规范

如果两个方法具有相同的名称和参数类型,则它们具有相同的签名.

因此,返回类型不是方法签名的一部分

.


小智 7

不,不是Java.方法名称和参数列表仅用于方法签名.返回类型不包括.


Huy*_* Le 7

在 JAVA 和许多其他语言中,您可以调用一个没有变量的方法来保存返回值。如果返回类型是方法签名的一部分,则在不指定保存返回值的变量的情况下,无法知道调用时将调用哪个方法。