Answers:
从Oracle Docs报价:
定义:方法声明的两个组成部分包括方法签名 -方法的名称和参数类型。
由于对问题进行了编辑以包括以下示例:
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
不,编译器不会知道它们之间的区别,因为它们的签名myMethod(int param)
是相同的。第二行:
public char myMethod(int param) {}
会给您带来错误:方法已经在class中定义,可以进一步确认上述声明。
foo.bar(baz);
?
在字节码级别,“返回类型”是方法签名的一部分。考虑一下
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
它们仅在返回类型上有所不同。
不,不是Java。方法名称和参数列表仅用于方法签名。返回类型不包括在内。
不,在Java中,方法签名不包括返回类型,但声明包括。
public String getString(String myString)
^access modifier ^return type ^name ^parameter type and name
根据以下反馈进行了编辑:)
String method( String s )
,并Double method( String s )
在同一个班,例如。
method signature
与method declaration
方法签名中不包含返回类型,只有方法名称和参数定义为方法签名。
方法签名包括返回类型。
当必须检查重复项时,编译器将忽略它。对于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;
方法签名只是方法的名称和参数。但是我相信,如果您的示例属于同一类,则会产生错误。您可以简单地在任何方面进行测试,看看编译器会抛出错误
如果您尝试运行在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)。