Metoda equals a operator ==.

0

Nie za bardzo rozumiem różnicy mieczy metoda equals a operatorem == ?

0

== porównuje adresy napisów w pamięci, nie zaglądając do treści.

0

prosze opisz dokładniej

0

A wpisałeś coś w google?

Nie licz, że ktoś tutaj będzie przepisywał po raz setny to co możesz znaleźć w minutę w internecie.

0

Prosze opis z API javy: Indicates whether some other object is "equal to" this one. Nic konkretnego nie pisze. Nie pisza nic pod jakim względem jest równy. Prosze Was o porade bo robie sobie ćwiczonka na jednej metodzie i drugiej i nie mam pewności.

0

2 pierwsze rekordy z poniższego linku, zajęło mi to mniej niż 15 sekund...

http://lmgtfy.com/?q=java+equals+vs+%3D%3D

0

Cel tego postu miał być dyskusyjny, ponieważ miałem pewne niejasności. Zacytuje coś z książki:

"Dostępna w klasie Object metoda equals porównuje dwa obiekty. Jej implementacja w klasie
Object sprawdza, czy dwie referencje do obiektów są identyczne."

Wg tego co mówicie i z tego co ja z moich ćwiczeń wywnioskowałem ten cytat jest nieprawidłowy.
Referencja to inaczej adres obiektu w pamieci. Więc ten cytac pasuje do operatora ==
Co Wy na to??

0

To my na to że klasa Object nie wie o żadnych polach klas dziedziczących więc jedyne co potrafi porównać to "adresy" obiektów.
Metodę equals możesz jednak overridować i sprawić żeby porównywała np. niektóre pola obiektów a nie adresy.

0

Shalom chyba zrozumiałem. Jeszcze podsumuje moje wnioski.

Wniosek 1. Klasa Object zawiera w metodzie equals() tylko sprawdzanie adresów za pomocą operatora == i żeby ta metoda sprawdzała coś wiecej trzeba ja nadpisać w podklasie bo gdy nie nadpiszemy dalej bedzie sprawdzać tylko adresy.

====================================================================================

Wniosek 2. Operator == sprawdza tylko sam adres w pamięci. Troche to bezsensowne bo gdy utworzymy 2 obiekty tej samej klasy np.

Object a = new Object();
Object b = new Object();

to i tak utworzyliśmy dwa różne obiekty i porównanie

a==b

zwróci false


Jedyne sensowne wykorzystanie operatora == widze wtedy aby sprawdzić czy dwie różne zmienne odwołują sie do tego samego obiektu np.
```java
Object a = new Object();
Object c = a;
a==c

zwróci true


====================================================================================

Czy dobre są moje wnioski??  (a jeśli nie to gdzie się mylę??)
0

Tak. O dziwo póki co piszesz z sensem...

0

Wiesz czasem w książkach nie pisza wszystkiego a wiele razy mylą pojecia referencja i obiekt i stosują je zamiennie, dlatego czasem mam mix w głowie i powstaje tutaj na forum niezbyt miła sytuacja a to w wiekszości przypadków problemem jest nieistotna rzecz.
Powiem Wam, że jestem bardzo wyczulony na pojecia i jak w książce mylą pojecia, to wtedy nie wiem w końcu o co im chodzi.

Mam jedno pytanie skoro klasa Object posiada tylko taka metodę która porównuje tylko adresy to gdy stworze 2 osobne obiekty klasy Object (które treściowo są sobie równe).

Object a = new Object();
Object b = new Object();

i dam porównanie metodą equals() (która teoretycznie ma zaglądać do treści obiektu) to i tak dostanę wartość

false

.

Więc jak porównać w takim wypadku dwa obiekty klasy Object pod względem ich treści??

0

A jakąż to treść według ciebie mają te obiekty? Po czym chciałbyś stwierdzić czy są sobie równe czy nie?

0

Właśnie nie wiem jaką mają treśc te obiekty. To prosiłbym Ciebie o wytłumaczenie i chyba byłby koniec tematu.

0

Z twojego punktu widzenia nie mają żadnej stąd też brak możliwości innego ich porównania.

0

We własnych klasach musisz przeciążyć metodę equals, definiując jak mają być porównywane jej obiekty.

0

1.A mój punkt widzenia jest dobry??
2. Klasa Object jest klasą która nie zawiera pól tylko same metody??

0

@golec2604 implementacja klasy Object to jest wewnętrzna sprawa JVMa i ciebie nie powinna w ogóle interesować. Możesz sobie założyć że ta klasa nie ma zadnych pól które mogły by cię interesować ;]

0

Moja wad to ze jestem za bardzo dociekliwy i nie potrafie sie uczyć czegoś dalej jak nie wiem czegoś wcześniej w tym przypadku klasy Object.
Może jedna uchylisz rąbka tajemnicy o jej implementacji i co z jej polami ??

0
  1. Operator == zawsze porównuje tożsamość obiektów, czyli wyrażenie obiekt1 == obiekt2 sprawdza czy referencja obiekt1 wskazuje na ten sam obiekt co referencja obiekt2.
  2. Metoda equals w klasie Object z której to dziedziczą wszystkie inne obiekty (przy czym nie trzeba pisać extends Object; gdy brakuje to kompilator sam sobie dorzuci na etapie kompilacji) działa identycznie jak operator ==, z wyjątkiem tego, że rzuca NullPointerException gdy jest wywoływana na pustej referencji.
  3. Metodę equals można nadpisać, tak by robiła coś innego niż domyślna implementacja. Na przykład porównywała zawartość zamiast tożsamości. To od autora nowej implementacji metody equals zależy co będzie porównywane.
  4. Operator == na typach prymitywnych takich jak int, long, char etc porównuje zawartość zmiennych.
  5. Zawartością zmiennych referencyjnych są adresy, a więc operator == na referencjach w zasadzie też porównuje zawartość zmiennych.
  6. W Javie nie ma zmiennych typu obiekt. Typ zmiennej to albo prymityw (int, long, char, etc) albo referencja do obiektu.
  7. Często jednak stosuje się skróty myślowe, typu "przekazujemy obiekt" zamiast "przekazujemy referencję do obiektu". Nie powoduje to niejednoznaczności właśnie z tego powodu, że obiektu nie da się przekazać, a tylko referencję, więc brakujące słowa można sobie dopowiedzieć.
0

@golec2604:

Podam ci przykład z C++:

class C {
    int f;
};

int main(int argc, char** argv) {
    int x;
    C obj;
    C& ref = obj;
    C* ptr = &obj;

    return EXIT_SUCCESS;
}

Tutaj:

  1. x jest prymitywem.
  2. obj jest zmienną typu obiekt.
  3. ref jest referencją na obiekt.
  4. ptr jest wskaźnikiem na obiekt.

Różnica między referencją, a wskaźnikiem w C++ jest moim zdaniem kosmetyczna. Głównie sprowadza się to do trochę innej składni oraz faktu iż referencje mają wymuszoną niezmienność. Javowe zmienne referencyjne są czymś pomiędzy referencjami, a wskaźnikami z C++. Składnia jeśli chodzi o używanie jest podobna do referencji z C++, natomiast przypisywanie wartości jest podobne jak przy wskaźnikach z C++.

0

To jest temat o javie i nie chce sobie robić bałaganu w głowie z c++

0

No dobra, to inaczej.

Każda zmienna referencyjna jest typu swojej klasy.

Ale nie jest typu obiekt (w sensie obiekt vs adres). Zmienna referencyjna nie zawiera obiektu. Zawiera adres obiektu. Wszystkie adresy mają ten sam rozmiar, wobec czego można adres tego samego obiektu przypisywać do zmiennych różnych typów i nic się złego nie podzieje. W szczególności można napisać co takiego:

Klasa r1 = new Klasa();
Object r2 = r1;
Klasa r3 = (Klasa) r2;

I po czymś takim zawartość wszystkich zmiennych będzie taka sama i nic się po drodze nie popsuje. Gdyby zmienna przechowywała obiekt, a więc musiała mieć rozmiar wystarczający do zmieszczenia wszystkich jego pól, to nie dałoby się do niej np zmieścić instancji klas pochodnych, które dodają jakieś nowe pola.

0

Zauważyłem że jak nadpisuje się metode z klasy Object to nie trzeba pisać słówka super w implementacji nowej metody. Dlaczego tak jest??

0

Bo wyraźnie nie rozumiesz co to słówko oznacza? o_O

0

Wiem co oznacza.

0

Musimy zaznaczyć, że odwołujemy się do metody nadklasy, a nie klasy,
w której się znajdujemy. Do tego celu służy słowo kluczowe super.

Definicja z książki.

0

No dobrze no i potrafisz mi wyjaśnić PO CO chciałbyś odwołać sie do metody equals z nadklasy (czyli z Object)? Skoro już ponoć zrozumiałeś że ta metoda potrafi jedynie porównać dwie referencje. Więc na co by ci się ona przydała? Co byś chciał zrobić z wynikiem takiego porównania? o_O

0

AHA. Czyli weźmy inny przypadek z innymi klasami i gdy nie chcemy sie odwoływać w implementacji nowej metody do metody nadklasy (i przez to nie korzystać z pól nadklasy) to wystarczy zrobić nadpisanie danej metody z całkowicie nową implementacją ale z identycznym wzorem konstruktora jak w nadklasie. Dobrze rozumiem??

0

Tak. Do metody nadklasy odwołujesz się kiedy ma to jakiś sens.

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