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

时间:2013-04-22 14:10:10

标签: java

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

示例:

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

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

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

14 个答案:

答案 0 :(得分:139)

引自Oracle Docs

  

定义:方法声明的两个组成部分包括 方法签名 - 方法的名称和参数类型。

enter image description here

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

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

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

    public char myMethod(int param) {}

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

答案 1 :(得分:18)

  

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

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

  

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

与类方法相同。

  

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

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

答案 2 :(得分:8)

在字节码级别,“返回类型”是方法签名的一部分。考虑一下这个

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 

它们的区别仅在于返回类型。

答案 3 :(得分:7)

Java Language Spec

  

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

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

答案 4 :(得分:7)

不,不是Java。 Method name and parameter list is only for method signature。返回类型不包括。

答案 5 :(得分:4)

Bro,在java中,我们使用它们的名称及其参数调用方法只在我们的代码中使用它们,比如

myMethod(20,40)

所以,JAVA只在相应的声明(name + param)中搜索匹配的类似东西,这就是方法签名只包括方法的名称和参数的原因。 :)

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

答案 8 :(得分:3)

不,在Java中,方法签名不包括返回类型,但声明包含。

public             String         getString(String myString)

^access modifier   ^return type   ^name    ^parameter type and name

根据以下反馈进行编辑:)

答案 9 :(得分:2)

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

Reffer:Oracle Docs 'Defining Methods'

答案 10 :(得分:1)

使用AspectJ(org.aspectj.lang.reflect.MethodSignature),它确实有返回类型

答案 11 :(得分:1)

方法签名包括返回类型。

必须检查重复项时,编译器会忽略它。对于Java而言,使用签名的返回类型不同的两种方法是非法的。

试试:

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();
    }
}

构建项目,转到bin目录,在某处复制 Caller.cass 。然后更改被调用的方法:

public int aMethod() {
    return 0;
}

构建项目,您将看到Called.class和Caller.class都有一个新的时间戳。替换上面的Caller.class并运行该项目。你有一个例外:

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

答案 12 :(得分:0)

方法签名只是方法的名称和参数。但我相信如果他们在同一个班级,你的例子会产生错误。 You can simply test it out on any ide and see that the compiler will throw an error

答案 13 :(得分:0)

如果你试图运行你在eclipse上提到的代码,你将得到一个答案,关于java编译器在java方法之间区分的内容:

class Foo {
    public int  myMethod(int param) {
        return param;}
    public char *myMethod*(int param) { //this line throws an error 
        return param;
    }
}

抛出的错误是: 类型Foo中的重复方法myMethod(int)。