• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porównywanie typów podstawowych z obiektowymi

Object Storage Arubacloud
0 głosów
786 wizyt
pytanie zadane 7 maja 2017 w Java przez abautblank Nowicjusz (190 p.)

Witam. Czy mógłby mi ktoś wytłumaczyć co właściwie się dzieje jeśli porównywany jest typ referencyjny z typem podstawowym?
Rozumiem, że jeśli porównujemy obiekt z obiektem to porównywana jest referencja tych obiektów chyba, że używamy metody equals() która jeśli jest przesłonięta to porównuje zawartość obiektów.

Rozumiem także działanie operatorów relacji na typach podstawowych ale co zachodzi w przypadku kiedy porównujemy zmienną typu podstawowego ze zmienną typu referencyjnego?
Co w takiej sytuacji robi kompilator?

		int x = 1;
		long y = 1;
		double z = 1.0;
		
		Integer a = new Integer(1);
		Long b = new Long(1);
		Double c = new Double(1.0);
		
		System.out.println(x == a); // true
		System.out.println(y == b); // true
		System.out.println(z == c); // true
		System.out.println(x == 1); // true
		
		String s = new String("S");
		String s2 = "S";
		
		System.out.println(s == "S"); // false
		System.out.println(s2 == "S"); // true
		
		boolean t = true;
		Boolean t2 = new Boolean(true);
		
		System.out.println(t == t2); // true

 

1 odpowiedź

0 głosów
odpowiedź 7 maja 2017 przez Wiciorny Ekspert (270,150 p.)
wybrane 7 maja 2017 przez abautblank
 
Najlepsza

Czołem: polecam lekturke, jasna i klarowna 

Zmienne w języku Java mogą być zasadniczo dwojakiego rodzaju – typu prostego albo referencyjnego. Zmienne typu prostego to pewna ilość bajtów pamięci – np. 4 bajty dla typu ‘int’ – przechowujących explicite wartość zmiennej. Zmienne typu referencyjnego to również pewna ustalona ilość bajtów pamięci, ale zapisana tam wartość nie jest bezpośrednio dla nas użyteczna. Możemy o tej wartości myśleć jak o wskaźniku na obiekt, ale bynajmniej nie musi to być adres obszaru pamięci, w którym przechowywany jest obiekt. To, jaka dokładnie wartość jest przechowywana w zmiennej referencyjnej zależy od implementacji JVM (akr. Java Virtual Machine) a my potrzebujemy wiedzieć tylko tyle, że wartość ta jednoznacznie reprezentuje pewien obiekt, albo referencję pustą, czyli ‘null’. Zerknijmy na poniższy przykład.

http://www.mariuszlipinski.pl/2008/05/scjp-zmienne-typw-prostych-i.html 

komentarz 7 maja 2017 przez abautblank Nowicjusz (190 p.)
edycja 7 maja 2017 przez abautblank
Niestety nie o to mi chodziło. Dlaczego w tym przypadku porównywana jest wartość obiektu z wartością zmiennej podstawowej?
komentarz 7 maja 2017 przez Wiciorny Ekspert (270,150 p.)

zajrzyj do biblioteki Javy uzywasz konstruktorów obiektów Integer,Long i Double, sprawdz jak działają te konstruktory, bo z nich korzystasz.

Więc po prostu tworzysz obiekty które, mimo że są obiektami- mają określony typ, więc porównanie tu jest nie tyle obiektu z "wartością' prostej zmiennej, co porównanie "typu obiektu" z wartością zmiennej 

Constructor and Description
Integer(int value)

Constructs a newly allocated Integer object that represents the specified int value.

 allocated Integer object więc allokujesz pamięć na dokładnie int. JVM jest na tyle bystra, że poróbnuje po prostu ich wartości, a obiekt jak napisane w konstruktorze reprezentuje wartość wpisaną stąd masz tutaj true 

** EDIT: kompilator nie spawdza tutaj, czy typ prosty jest typem obiektowym ... w ten sposób on po prostu sprawdza czy wartość zmiennej w alokowanej pamięci INT jest równa wartości zapisanej w obiekcie, nie porównuje typu prostego do obiektu gdyż zwrócny zostałby błąd 

1
komentarz 7 maja 2017 przez abautblank Nowicjusz (190 p.)
Ok. Już rozumiem.
A co zachodzi w przypadku Stringa w kodzie który zamieściłem?
komentarz 7 maja 2017 przez Wiciorny Ekspert (270,150 p.)

bo tutaj nie porównujesz wartośći tylko referencje czy referencja do obiektu String jest tą samą referencją co Obiekt String utworzony operatorem new, a nie wartość 

String str = "abc";
 
is equivalent to:

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);
 

 

Podobne pytania

0 głosów
2 odpowiedzi 174 wizyt
pytanie zadane 27 lipca 2017 w Java przez qaz3011 Nowicjusz (240 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 23 czerwca 2015 w Java przez nowszy94 Bywalec (2,320 p.)
0 głosów
1 odpowiedź 413 wizyt
pytanie zadane 19 grudnia 2017 w Java przez rubesom Obywatel (1,690 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...