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 Docs 에서 인용 :
정의 : 메서드 선언의 구성 요소 중 두 가지는 메서드 서명 (메서드 이름과 매개 변수 유형)으로 구성됩니다.
이 예제를 포함하도록 질문이 편집되었으므로 :
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 , 이는 위의 문을 추가로 확인합니다.
foo.bar(baz);
있습니까?
Java의 클래스 메서드 서명에 반환 유형이 포함되어 있습니까?
Java에서는 그렇지 않지만이 JVM에서는 명백한 혼란을 초래할 수 있습니다.
Java의 인터페이스 메서드 서명에 반환 유형이 포함되어 있습니까?
클래스 메소드와 동일합니다.
아니면 메소드 이름과 매개 변수 목록 만 있습니까?
Java의 메소드 이름 및 매개 변수 유형. 예를 들어 매개 변수 주석 및 이름은 중요하지 않습니다.
바이트 코드 수준에서 "반환 유형"은 메서드 서명의 일부입니다. 이걸 고려하세요
public class Test1 {
public Test1 clone() throws CloneNotSupportedException {
return (Test1) super.clone();
}
}
바이트 코드에는 두 개의 clone () 메서드가 있습니다.
public clone()LTest1; throws java/lang/CloneNotSupportedException
public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
반환 유형에 의해서만 다릅니다.
Java가 아닙니다. 메소드 이름 및 매개 변수 목록은 메소드 서명 전용입니다 . 반환 유형은 포함되지 않습니다.
Bro, Java에서는 이름과 매개 변수로 메소드를 호출하여 코드에서 사용합니다.
myMethod (20, 40)
따라서 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
반환 유형은 메서드 서명에 포함되지 않으며 메서드 이름 과 매개 변수 만 메서드 서명으로 정의됩니다.
Reffer : Oracle Docs 'Defining Methods'
방법 서명에는 반환 유형이 포함됩니다.
컴파일러는 중복을 확인해야 할 때이를 무시합니다. 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에서 간단히 테스트하고 컴파일러에서 오류가 발생하는지 확인할 수 있습니다.
이클립스에서 언급 한 코드를 실행하려고하면 자바 컴파일러가 자바 메소드를 구별하기 위해 찾는 요소에 대한 답을 얻을 수 있습니다.
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.