Java 类/接口中的方法签名是否包括其返回类型?
例子:
Java是否知道这两种方法之间的区别:
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
还是只有方法名称和参数列表才重要?
Java 类/接口中的方法签名是否包括其返回类型?
例子:
Java是否知道这两种方法之间的区别:
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
还是只有方法名称和参数列表才重要?
引用Oracle 文档:
定义:方法声明的两个组成部分包括方法签名——方法的名称和参数类型。
由于对问题进行了编辑以包含此示例:
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
不,编译器不会知道区别,因为它们的签名:myMethod(int param)
是相同的。第二行:
public char myMethod(int param) {}
会给你错误:方法已经在类中定义,这进一步证实了上述说法。
Java中的类方法签名是否包括返回类型?
在 Java 中,它没有,但在这个 JVM 中,它会导致明显的混乱。
Java中的接口方法签名是否包括返回类型?
与类方法相同。
还是只有方法名称和参数列表?
Java 的方法名称和参数类型。例如,参数注释和名称无关紧要。
在字节码级别,“返回类型”是方法签名的一部分。考虑这个
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 和许多其他语言中,您可以调用不带变量的方法来保存返回值。如果返回类型是方法签名的一部分,则在没有指定保存返回值的变量的情况下,无法知道调用时将调用哪个方法。
兄弟,在 java 中,我们使用方法的名称和参数来调用方法,只是为了在我们的代码中使用它们,比如
我的方法(20, 40)
所以,JAVA 只在其相应的声明(名称+参数)中搜索匹配的类似内容,这就是为什么方法签名只包含方法的名称和参数的原因。:)
方法签名只是名称和参数列表。
不,在 Java 中,方法签名不包含返回类型,但声明包含。
public String getString(String myString)
^access modifier ^return type ^name ^parameter type and name
根据以下反馈进行编辑:)
返回类型不包含在方法签名中。只有方法名称和参数被定义为方法签名。
使用 AspectJ (org.aspectj.lang.reflect.MethodSignature),它确实有返回类型
方法签名包括返回类型。
当必须检查重复项时,编译器会忽略它。对于 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;
}
}
抛出的错误是:重复方法 myMethod(int) in type Foo 。
方法签名只是方法的名称和参数。但我相信如果他们在同一个班级,你的例子会产生错误。您可以在任何 ide 上简单地对其进行测试,然后查看编译器会抛出错误