Java'daki bir yöntemin imzası dönüş türünü içerir mi?


102

Bir Java sınıfındaki / arayüzündeki yöntem imzası, dönüş türünü içeriyor mu?

Misal:

Java bu iki yöntem arasındaki farkı biliyor mu?

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

Yoksa önemli olan yalnızca yöntem adı ve parametreler listesi mi?


7
Bu arada, Java 6'da jeneriklerin işlenmesinde, JVM imzada dönüş türünü kullandığından ve onları seçerek çağırdığından, her iki yönteme de sahip olmanıza izin veren bir hata vardı. Bu, Java 7'de düzeltildi. Vanillajava.blogspot.co.uk/2011/02/…
Peter Lawrey

Yanıtlar:


146

Oracle Docs'tan Alıntı :

Tanım: Bir yöntem bildiriminin iki bileşeni, yöntem imzasını içerir - yöntemin adı ve parametre türleri.

görüntü açıklamasını buraya girin

Soru bu örneği içerecek şekilde düzenlendiğinden:

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

Hayır, imzaları myMethod(int param)aynı olduğundan derleyici farkı bilmeyecektir . İkinci satır:

    public char myMethod(int param) {}

size hata verebilir: yöntem sınıfta zaten tanımlanmıştır , bu da yukarıdaki ifadeyi daha da doğrular.


Yani sınıfta aynı yöntem adına, aynı parametrelere sahip farklı dönüş türlerine sahip iki yönteme sahip olamayacağımızı mı söylüyorsunuz?
Kasun Siyambalapitiya

6
@KasunSiyambalapitiya biz yapamayız. Derleyici böyle bir senaryoda hangi yöntemlerin çağrılacağını nasıl bilir foo.bar(baz);?
Kolyunya

@Jops, ya atar anahtar kelimesine sahipsek? İmzaya da mı ait?
Akila Amarasinghe

19

Java'daki sınıf yöntemi imzası, dönüş türünü içeriyor mu?

Java'da değil, ancak bu JVM'de yapar ve bu da bariz bir kafa karışıklığına yol açabilir.

Java'daki arayüz yöntemi imzası, dönüş türünü içeriyor mu?

Sınıf yöntemleriyle aynı.

Veya sadece yöntem adı ve parametreler listesi mi?

Java için yöntem adı ve parametre türleri. Örneğin, parametre açıklamaları ve adları önemli değildir.


1
"Java'da değil ama JVM'de var" derken neyi kastediyorsunuz? JVM'de nasıl olduğunu açıklar mısınız?
Tarun Maganti

3
@TarunMaganti JVM, yöntem imzasında dönüş türünü içerir. Java bir dil olarak değil.
Peter Lawrey

3
@xyz bu, bayt kodunu okuyarak görebileceğiniz bir şeydir, ancak Java kodunu değil. Herhangi bir bayt kodu bunu gösterir.
Peter Lawrey

8

Bayt kodu seviyesinde, "dönüş tipi" yöntem imzasının bir parçasıdır. Bunu düşün

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}

bayt kodunda 2 clone () yöntemi vardır

public clone()LTest1; throws java/lang/CloneNotSupportedException 

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

sadece dönüş türüne göre farklılık gösterirler.


1
Örnek yöntemi örtük olarak ilk parametre olarak örneğe sahip olduğundan bu yanıltıcıdır. Bir zamanlar om (a) 'nın aslında m (o, a) olduğunu düşünebiliriz. Klon durumunda olduğu gibi, farklılık yaratan argümanın dönüş türü değil olmasıdır.
Huy Le


7

JAVA ve diğer birçok dilde, dönüş değerini tutmak için değişkensiz bir yöntemi çağırabilirsiniz. Dönüş türü bir yöntem imzasının parçasıysa, değişken tutma dönüş değeri belirtmeden çağırırken hangi yöntemin çağrılacağını bilmenin bir yolu yoktur.


7

Java Dil Spesifikasyonu diyor

Aynı ada ve bağımsız değişken türüne sahiplerse iki yöntem aynı imzaya sahiptir.

bu nedenle Hayır, dönüş türü yöntem imzasının bir parçası değildir.


4

Bro, Java'da yöntemleri adlarına ve parametrelerine göre çağırırız, yalnızca onları kodumuzda kullanmak için kullanırız, örneğin

myMethod (20, 40)

bu nedenle, JAVA yalnızca karşılık gelen bildirimlerinde (ad + param) eşleşen benzer şeyler arar, bu nedenle yöntem imzası yalnızca yöntemin adını ve parametrelerini içerir. :)



3

hayır, Java'da yöntem imzası dönüş türünü içermez, ancak bildirim içerir.

public             String         getString(String myString)

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

aşağıdaki geri bildirimlere göre düzenlendi :)


1
JLS'nin söylediği bu değil. "Aynı isim ve argüman türleri" dir. Erişim değiştiricisi ve parametre adı da yöntem imzasının bir parçası değildir.
Peter Lawrey

eğer bir test sorusuysa sorun değil, ancak bir program yazıyorsam public getString () yazmıyorum, public String getString () yazıyorum
Jeff Hawthorne

1
Erişim, geri dönüş tipi ve tipi (s) atar sen olamaz yüzden imza, bir parçası değildir String method( String s )ve Double method( String s )aynı sınıfta, örneğin.
Ray Stojonic

2
Belki de karıştırıyorsun method signatureilemethod declaration
Peter Lawrey

@Ray not etmek isterim, cevabımı ilk soruyu düzenlemeden önce yazdım, tek sorduğu imzanın bir parçasıydı, herkese açık bir isim () yazmaya çalışmadığından emin olmak istedim dönüş türü (doğruyu söylemek gerekirse, test etmek için basit bir program yazarak kendi sorusunu yanıtlayabilirdi)
Jeff Hawthorne


1

AspectJ'yi (org.aspectj.lang.reflect.MethodSignature) kullanarak, dönüş türüne sahiptir


1

YÖNTEM İMZASI İADE TİPİNİ DAHİLDİR.

Derleyici, kopyaları kontrol etmesi gerektiğinde onu yok sayar. Java için, imzanın yalnızca dönüş türüne göre farklılık gösteren iki yönteme sahip olması yasa dışıdır.

Bunu dene:

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

Projeyi oluşturun, bin dizinine gidin, Caller.cass dosyasını bir yere kopyalayın . Ardından çağrılan yöntemi değiştirin:

public int aMethod() {
    return 0;
}

Projeyi oluşturun, Called.class ve Caller.class'ın yeni bir zaman damgasına sahip olduğunu göreceksiniz. Yukarıdaki Caller.class'ı değiştirin ve projeyi çalıştırın. Bir istisnanız olacak:

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


0

Eclipse'de bahsettiğiniz kodu çalıştırmaya çalışırsanız, java derleyicisinin java yöntemleri arasında ayrım yapmak için hangi öğeleri aradığına dair bir cevabınız olacak:

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

Atılan hata şudur: Foo türünde myMethod (int) yöntemini çoğaltın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.