Prośba o wytłumaczenie

0

Witam.

public class kObject {
    public static void main(String[] args) {
        
        Punkt[] pk = new Punkt[5]; 
        pk[0] = new Punkt(1,1);
        pk[1] = new Punkt(2,5);
        pk[2] = new Punkt(1,1);
        pk[3] = new Punkt(1,4);
      
        System.out.println(pk[0].equals(pk[2])); **//o co dokładnie tutaj chodzi? poeównuje pk[0] i pk[2] i wyskakuje false,  natomiast jak porówna pk[0] i pk[0] to będzie true.  O co dokładnie kaman?**
        System.out.println(pk[2]);
    }
}
class Punkt {
    public Punkt(){
        this.x = 0;
        this.y = 0;
    }
    public Punkt(int x, int y){
        this.x = x;
        this.y = y;
    }

    private int x;
    private int y;
}

O co dokładnie tutaj chodzi? poeównuje pk[0] i pk[2] i wyskakuje false, natomiast jak porówna pk[0] i pk[0] to będzie true. O co dokładnie kaman?

0

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

Po polskiemu - zastosowana metoda nie sprawdza wartości atrybutów, tylko sprawdza czy dwie referencje wskazują na ten sam obiekt.


Opolski Portal Programistyczny
http://programowanie.opole.pl

0

Rozwiązanie:
Napisać własną implementację funkcji equals. Nie zapomnieć przy okazji o przeciążeniu hashCode.

0

p[0] i p[0] wskazują na to samo miejsce( więc pojawi się true) ale nie rozumiem jak wskazują na to samo miejsce? Proszę o prostę wytłumaczenie jak to mam dokładnie rozumieć, będę bardzo wdzięczny!

0

Na to samo miejsce w pamięci, czyli na ten sam obiekt. pk[0] i pk[2] to dwa różne obiekty, tylko z tymi samymi wartościami x i y.
Tzn., jeśli np. napiszesz pk[1] = pk[0], to pk[1] będzie tym samym, co pk[0]. Zakładając, że Punkt.x jest publiczne to:

println(pk[1].x); // 2
println(pk[0].x); // 1
println(pk[0] == pk[1]); // false
pk[1] = pk[0];
println(pk[1].x); // 1
println(pk[0].x); // 1
println(pk[0] == pk[1]); // true
pk[1].x = 10;
println(pk[1].x); // 10
println(pk[0].x); // 10
println(pk[0] == pk[1]); // true
println(pk[0] == pk[2]); // false
println(pk[2].x); // 1, oczywiście

Implementacja equals w Object wygląda tak:

public boolean equals(Object obj) {
    return (this == obj);
}

Więc trzeba ją przesłonić, porównując tylko x i y.

0

Już rozumiem :) Fajnie, że są tacy Profesionaliści na tym forum!! Dzięki serdeczne wszystkim. Pozdrawiam.

0

Profesjonaliści? Przecież to podstawy języka.

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