2015-09-09 15 views
11

çalışır Bir sınıfın bir yönteminde equals(""); çağrısı, Eclipse içinde herhangi bir hata oluşturmadığını fark ettim. Hiç string1.equals(string2); gibi bir şey olmadan .equals denilen görmedim.Arama eşittir (""); kendi başına derler ve

package voodoo; 

public class Equals { 

    public void method(){ 
     equals(""); 
    } 

} 

burada oluyor ve ne zaman kendiliğinden equals() arayarak hangi şimdiye kullanılabilir ?

Bunu test etmek için JUnit numaralı telefona koyarsam, çalışır ve geçer.

+3

@WOUNDEDStevenJones: Neden bunu düşünüyorsun? –

+0

Bu işlevde yanlış bir şey yok: "public void answerToLifeTheUniverseAndEverything() {42; } '. Bu 42 bit zemininde bırakılır, tıpkı sizin eşittir ("") 'dir. –

+2

@DavidHammen Derleme yapılmayacak. Keyfi ifadeler C++ [ancak Java değil] geçerli ifadeleridir (https://stackoverflow.com/questions/32406041/when-is-an-unassigned-expression-a-valid-statement). – Boann

cevap

16

equals açıkça belirtmeden this referansa çağrılabilir Object 'ın equals yöntemidir. Bir uslu uygulama daima false dönmelidir rağmen başka deyişle, çağrı,

this.equals(""); 

Bu mükemmel geçerli eşdeğerdir. Dönüş değeri göz ardı edilir, bu da yasaldır.

Denemeye meselesi olarak, bir mesaj yazdırır şeyle equals geçersiz kılarak neler görebilirsiniz: açık nesne olmadan

public class Equals { 

    public void method(){ 
     equals(""); 
    } 
    @Override 
    public boolean equals(Object other) { 
     System.out.println("I am being compared to '"+other+"'"); 
     return super.equals(other); 
    } 
} 
+1

"iyi huylu bir uygulama her zaman yanlış döndürmelidir". Gerçekten mi? Kendi gelişmiş string sınıfımı (belki de ekstra kodlamalar ile) yapamıyorum ve normal dizelerle karşılaştırılmasın mı? Sadece argüman uğruna;) – LS97

+9

@ LS97 Bu [simetri gereksinimi] (http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals (java. lang.Object)), çünkü "java.lang.String", "java.lang.String" olmayan bir şey için "false" i döndürür ve "java.lang.String" in bir alt sınıfını yapmak mümkün değildir. çünkü sınıf "final" dir. – dasblinkenlight

+0

Tamam, 'final' hakkında bilmiyordum. Sanırım okumamı yapmalıyım. – LS97

5

Her şey Object sınıfının alt sınıfı olduğundan, burada süper sınıf (Object) equals yöntemini çağırıyorsunuz. Ve Nesne, ""'un bir dize nesnesi olduğu bir parametre olarak alır, iyi derler.

Ve aslında boolean döndürür, ancak almak için göz ardı ediyorsunuz. Sonucu görmezden gelmek yasaldır.

Aldığınızda ve kontrol ederseniz, Equals sınıfınız boş bir dizgeye eşit olmadığından false döndürür.

6

equals, statik olmayan bir yöntemdir ve Object'un equals numarasını çağırmaktadır; bu, sınıfın diğer yöntemlerini çağırmak gibi bir şeydir. Ayrıca, sınıfımız Object çocuktur. Metod çağrısı, thisObject.equals(emptyString) no'lu bir nottur. Burada String da bir Object'dur. Sonuç olarak, Object'un altından currntObject.equals(object) yöntemini çağırıyoruz.

Bu benzer,

class A { 
    public boolean ok(Object str) { 
     return false; 
    } 
} 

class B extends A { 

    public void method(){ 
     ok(""); 
    } 
} 

Burada çocuk böylece equals yeri etkilenmez etti, bunun yöntemini çağıracak ebeveyn ve o anki örneğini ifade edecektir. Aradığınız

3

equals(...)this üzerine yöntemini çağırır. Örneğinizde, Equals örneğini boş bir dizeyle karşılaştırıyorsunuz. Sınıfı Object sınıfında equals() kamu metodu

2

. Tüm sınıf varsayılan olarak Object sınıfının doğrudan/dolaylı bir çocuk sınıfıdır. Equals sınıfınız, herhangi bir sınıfı açıkça devralmaz. Yani, Object'un doğrudan bir alt sınıfıdır.

Ve Object sınıfı yöntemi equals() yılında

böyle ilan edilir -
public boolean equals(Object obj){} 

Yani kod tamamen geçerlidir. Aslında Equals.equals()'u method() numaralı telefondan arıyorsunuz.

İlgili konular