metoda equals()

0

Witam
Jakiś czas temu zacząłem się uczyć programowania w javie na serwisie javastart.pl. Dotarłem do lekcji o metodzie equals(). I był przykład przesłoniętej metody:

@Override
    public boolean equals(Object obj) {
        // sprawdzenie równości fizycznej za pomocą ==
        if (this == obj)
            return true;
        // sprawdzamy, czy nie null
        if (obj == null)
            return false;
 
        // sprawdzamy, czy przekazany argument jest typu Student
        if (!(obj instanceof Student))
            return false;
        //rzutowanie na odpowiedni typ
        Student s = (Student) obj;
         
        // sprawdzenie kolejnych pól klasy, uważając na wartości null
        if(this.firstName == s.firstName && this.lastName == s.lastName)
            return true;
       ** if(this.firstName != null)
            if(!this.firstName.equals(s.firstName))
                return false;
        if (this.lastName != null)
            if(!this.lastName.equals(s.lastName))
                return false;**
        //jeśli dojdziemy do tego miejsca to obiekty są równe
        return true;
    }

Pogrubiłem część kodu, której nie rozumiem. Czy ktoś byłby tak łaskawy i wytłumaczył mi to. Z góry dzieki.

0

Część kodu zaznaczyłem "**" myślałem, że to pogrubienie :)

0

Sprawdzasz w tym fragmencie w ifach czy pole wskazuje na jakiś obiekt, jeśli na coś wskazuje (czyli jest tam jakiś obiekt) porównujesz jego zawartość metodą equals z tym samym polem innego obiektu i tak dalej. W Twoim przypadku reagujesz gdy pola są różne - wyrzucasz false.

Pamiętaj, że np. :

if(this.firstName != null)

Porównując obiekty przez != (i inne) sprawdzasz ich adresy w pamięci, natomiast metoda equals(Object dupa) sprawdza zawartość obiektów (np. tym porównujesz dwa Stringi).
Typy proste nie są obiektami, zatem możesz je porównywać przez ==, >, < itp.

0

Ale jak to: (!this.firstName.equals(s.firstName) wyśle do metody Stringa to czy np ta operacja: "this == obj" wybierze sobie pole czy porówna całą klasą do jednego Stringa dla ułatwienia podam cały kod:

public class Student {
    String firstName;
    String lastName;
 
    public Student(String fn, String ln) {
        firstName = fn;
        lastName = ln;
    }
 
    @Override
    public boolean equals(Object obj) {
        // sprawdzenie równości fizycznej za pomocą ==
        if (this == obj)
            return true;
        // sprawdzamy, czy nie null
        if (obj == null)
            return false;
 
        // sprawdzamy, czy przekazany argument jest typu Student
        if (!(obj instanceof Student))
            return false;
        //rzutowanie na odpowiedni typ
        Student s = (Student) obj;
         
        // sprawdzenie kolejnych pól klasy, uważając na wartości null
        if(this.firstName == s.firstName && this.lastName == s.lastName)
            return true;
        if(this.firstName != null)
            if(!this.firstName.equals(s.firstName))
                return false;
        if (this.lastName != null)
            if(!this.lastName.equals(s.lastName))
                return false;
        //jeśli dojdziemy do tego miejsca to obiekty są równe
        return true;
    }
}
1

Nie !
== i inne operatory porównują adres.

String s1 = new String("dupa");
String s2 = new String("dupa");

Jeśli porównasz te obiekty == to będzie false bo są to 2 RÓŻNE obiekty w pamięci z TĄ SAMĄ zawartością.
Jesli porównasz te obiekty metodą equals to będzie true bo porównujesz ZAWARTOŚĆ tych obiektów.

Jesli dalej tego nie rozumiesz to trudno.

0

if (this == obj) porówna adresy 2 obiektów, żeby sprawdzić czy nie są tym samym obiektem.

0

Rozumiem, ale nie mogę ogarnąć tego:

 if(!this.firstName.equals(s.firstName))
                return false;
0

Czego tutaj nie rozumiesz? Jeśli zawartość zmiennej firstName obiektu this nie jest równa zawartości zmiennej firstName obiektu s, zwróc false.
Btw this jest tutaj zbędne, wystarczy:

if (!firstName.equals(s.firstName))
    return false;
0

ok, dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1