Nie za bardzo rozumiem różnicy mieczy metoda equals a operatorem == ?
Metoda equals a operator ==.
- Rejestracja: dni
- Ostatnio: dni
== porównuje adresy napisów w pamięci, nie zaglądając do treści.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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.
- Rejestracja: dni
- Ostatnio: dni
Proszę, 20sekund w google http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java
- Rejestracja: dni
- Ostatnio: dni
- Postów: 21
2 pierwsze rekordy z poniższego linku, zajęło mi to mniej niż 15 sekund...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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??
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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ę??)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
Tak. O dziwo póki co piszesz z sensem...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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??
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
A jakąż to treść według ciebie mają te obiekty? Po czym chciałbyś stwierdzić czy są sobie równe czy nie?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
Właśnie nie wiem jaką mają treśc te obiekty. To prosiłbym Ciebie o wytłumaczenie i chyba byłby koniec tematu.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
Z twojego punktu widzenia nie mają żadnej stąd też brak możliwości innego ich porównania.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 12
We własnych klasach musisz przeciążyć metodę equals, definiując jak mają być porównywane jej obiekty.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
1.A mój punkt widzenia jest dobry??
2. Klasa Object jest klasą która nie zawiera pól tylko same metody??
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
@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ć ;]
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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 ??
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
- Operator
==zawsze porównuje tożsamość obiektów, czyli wyrażenieobiekt1 == obiekt2sprawdza czy referencjaobiekt1wskazuje na ten sam obiekt co referencjaobiekt2. - Metoda
equalsw klasieObjectz 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 rzucaNullPointerExceptiongdy jest wywoływana na pustej referencji. - Metodę
equalsmoż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 metodyequalszależy co będzie porównywane. - Operator
==na typach prymitywnych takich jakint,long,charetc porównuje zawartość zmiennych. - Zawartością zmiennych referencyjnych są adresy, a więc operator
==na referencjach w zasadzie też porównuje zawartość zmiennych. - W Javie nie ma zmiennych typu obiekt. Typ zmiennej to albo prymityw (
int,long,char, etc) albo referencja do obiektu. - 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ć.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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:
xjest prymitywem.objjest zmienną typu obiekt.refjest referencją na obiekt.ptrjest 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++.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
To jest temat o javie i nie chce sobie robić bałaganu w głowie z c++
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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??
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
Bo wyraźnie nie rozumiesz co to słówko oznacza? o_O
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 215
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??