2016-04-10 18 views
-3

Aşırı eşittir yöntemiyle çalışmaz. Bir Sınıf Noktası uygulamam ve sınıftaki nesnelerin eşit olup olmadığını görmek istiyorum == işleci kullanarak. Object'ten eşitlik yöntemini geçersiz kılmamı söyleyen birkaç çözüm araştırdım ve buldum. Okuduğum gibi yaptım ama == operatör hala çalışmıyor. P1.equals (p2) kullanırsam, çalışır. Bana yanlış yaptığımı söyleyen var mı? Hatta bir kapta Noktayı kullanmayı planlamadığım halde, hashCode yöntemini de geçersiz kılmaya çalıştım. Point== işleç,

Uygulama:

public final class Point { 

    private final int x; 
    private final int y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public boolean equals(Object other) { 

     if (!(other instanceof Point)) { 
      return false; 
     } 

     Point that = (Point) other; 
     return this.x == that.x && this.y == that.y; 
    } 

    @Override 
    public int hashCode() { 
     return x + y; //just for testing, equal objects should return same hash? 
    } 

    @Override 
    public String toString() { 
     return "(" + x + "," + y + ")"; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

Benim Testi sınıfı:

public class Test { 

    public static void main(String[] args) { 

     Point p1 = new Point(1,2); 
     Point p2 = new Point(1,2); 

     if(p1.equals(p2)) { 
      System.out.println("equal"); 
     } else { 
      System.out.println("not equal"); 
     } 

     if(p1 == p2) { 
      System.out.println("equal"); 
     } else { 
      System.out.println("not equal"); 
     } 

     System.out.println(p1); 
    } 
} 

çıktısı:

equal 
not equal 
(1,2) 

böylece toString yöntemi geçersiz görünüyor

çalışmak ama alışkanlık tek şey iş == operatörünün kendisi. Ben geçersiz kılınmış bir sout yöntemi eşittir eklemeyi denedim, ve ben p2.equals (p2) tarafından doğrudan eşittir yöntemi yürütmek zaman sadece

+2

Çünkü "eşittir" ve "==" farklı şeyleri test eder. 'eşittir' (her sınıf için özel bir şekilde tanımlanabilir) eşitliği test eder, '==' kimlik (test edemez). –

+2

Gerçekten de - Java'daki operatörleri aşırı yükleyemezsiniz. –

+0

Bu forumda, eşitlik tanımınızı kendi özel sınıflarınıza tanımlamak için eşitlik yöntemini nasıl geçersiz kılacağınıza ilişkin birçok soru vardır; bu, == operatörünü kullanarak, daha sonra adresleri karşılaştırmayan ancak geçersiz kılınan eşitlik yönteminin uygulanmasını kullanan. – Maxincredible52

cevap

0

Operatör == ve equals yöntemi birbiriyle bağlantılı değildir. mantıksal eşitliği için bir denetim uygulamak için equals yöntemini geçersiz kılabilir (ve).

== işleci, her zaman başvurulan eşitlik için bir denetim uygulayacaktır. Bu şekilde, iki nesnenin sadece aynı şeyi ifade etmediğini, ancak aslında aynı nesnenin olup olmadığını kontrol edebilirsiniz. Bu tasarım gereğidir.

1

== operatörü yalnızca nesnelerin başvuruları karşılaştırmak olduğunu ... mesajını görüntüler. Bu operatörü geçersiz kılabilirsiniz.

Sen java tutorial

+0

Bu cevabı okuyabiliyorlarsa, seninki ne? Sadece kopya olarak işaretleyin. – Savior

+0

@Pillar, Bu bağlantıyı cevabın ardından ekledim. Ve onu kopya olarak işaretliyorum. – IntFloat

0

== nesne başvurularını karşılaştırır resmi okuyabilir. Bu operatörün tam özellikleri here'dur.

İlgili konular