繁体   English   中英

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

[英]Does a method's signature in Java include its return type?

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) {}

会给你报错: method is already defined in class ,这进一步证实了上面的说法。

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

兄弟,在java中,我们习惯通过名字和参数来调用方法,只是为了在我们的代码中使用它们,比如

我的方法(20, 40)

因此,JAVA 只在其相应的声明(名称+参数)中搜索匹配的类似内容,这就是为什么方法签名只包含方法名称和参数的原因。 :)

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

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

public             String         getString(String myString)

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

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

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

Reffer :Oracle Docs '定义方法'

使用 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;

方法签名只是方法的名称和参数。 但我相信如果他们在同一个班级,你的例子会产生错误。 您可以简单地在任何 ide 上对其进行测试,然后查看编译器是否会抛出错误

如果您尝试运行您在 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) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM