Java Object Assignment

Jestem nowy w Javie i mam kilka pytań dotyczących przypisywania obiektów. Na przykład,

Test t1 = new Test();
Test t2 = t1;
t1.i=1;

Zakładając, że zmienna i jest zdefiniowana wewnątrz klasy testowej, czy mam prawo założyć, że zarówno t1, jak i t2 wskazują na ten sam obiekt, gdzie modyfikacja t1.i=1 wpływa zarówno na t1, jak i t2? Właściwie to przetestowałem i wydaje mi się, że miałem rację. Jednak kiedy próbuję tego samego na String, modyfikacja dzieje się tylko po jednej stronie, gdzie druga strona jest nienaruszona. Jaki jest powód to?

Edit: sprawa, którą próbowałem z String.

String s1 = "0";
String s2 = s1;          
s1 = "1";
System.out.println(s1);
System.out.println(s2);

Uświadamiam sobie swój błąd testując przypadki na łańcuchu, ponieważ jest niezmienny. Sytuacja, w której myślałem, że s1="1" zmodyfikować łańcuch jest w rzeczywistości zwracając odniesienie " 1 " do s1. Niemniej jednak moje pytanie pozostaje. Czy Test t2 = t1; powoduje, że zarówno t2, jak i t1 wskazują na ten sam obiekt, czy też każdy ma teraz swoje własne obiekty? Czy ta sytuacja dotyczy wszystkich obiektów w Javie?

Author: Sahar Rabinoviz, 2012-06-13

6 answers

Masz rację, ale ciągi są szczególnym przypadkiem; są niezmienne i zachowują się jak prymitywy w tym przypadku.

@newacct

Cytuję http://docs.oracle.com/javase/tutorial/java/data/strings.html :

Uwaga: Klasa String jest niezmienna, tak że po utworzeniu Obiekt String nie może zostać zmieniony. Klasa String ma numer metod, z których część zostanie omówiona poniżej, które wydają się zmodyfikuj ciągi. Ponieważ ciągi są niezmienne, co te metody naprawdę do jest tworzenie i zwracanie nowego ciągu zawierającego wynik operacja.

To sprawia, że struny są szczególnym przypadkiem. Jeśli tego nie wiesz, możesz oczekiwać, że metody omówione w cytacie nie zwrócą nowych ciągów, co doprowadziłoby do nieoczekiwanych wyników.

@ user1238193

Biorąc pod uwagę następujące pytanie: "czy Test t2 = t1; powoduje, że zarówno t2, jak i t1 wskazują na ten sam obiekt lub każdy ma teraz swój własny przedmioty? Czy ta sytuacja dotyczy wszystkich obiektów w Javie?"

T1 i t2 będą wskazywać na ten sam obiekt. Jest to prawdą dla dowolnego obiektu java (dołączone obiekty niezmienne)

 14
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 17:09:18

Masz rację z pierwszym założeniem. Z następującą linijką kodu:

Test t1 = new Test();

Tworzysz nowy obiekt testowy i jednocześnie tworzysz odniesienie testowe o nazwie t1, aby się do niego odnosić.

W drugiej linijce kodu napisałeś:

Test t2 = t1;

Tworzysz kolejne odniesienie do testu i przypisujesz je do tego samego obiektu, do którego odnosi się t1.

Więc t1.i = 1; wpłynie t2.i, ponieważ w końcu jest to ten sam obiekt.

Co do strun, Ciągi są niezmienne i nie mogą być modyfikowane po utworzeniu instancji.

Odnośnie Twojej edycji:

String s1 = "0";
String s2 = s1;          
s1 = "1";
System.out.println(s1);
System.out.println(s2);

Będą drukować różne wyniki, ponieważ kiedy rzeczywiście powiesz

s1 = "1";

W rzeczywistości wiążesz s1 z innym obiektem typu String, ale s2 nadal będzie odnosić się do obiektu o wartości "0".

 5
Author: NlightNFotis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 09:31:01

Masz absolutną rację, ponieważ zarówno t1, jak i t2 odnoszą się do tego samego obiektu, każdy chane w stanie obiektu wpłynie na oba.

String jest obiektem niezmiennym. Więc nie można go w ogóle modyfikować. Zobacz ten Aby uzyskać więcej informacji na temat niezmiennego obiektu w Javie.

 3
Author: Chandra Sekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 09:17:02

Robisz zupełnie inne rzeczy w tych dwóch przypadkach. W pierwszym przypadku, za pomocą t1.i = 1;, modyfikujesz obiekt wskazywany przez t1. W drugim przypadku, za pomocą t1 = "1";, zmieniasz odniesienie do punktu na inny obiekt (podobnie jak wtedy, gdy zrobiłeś t2 = t1;.

Jeśli zrobisz to samo z Test, co w drugim przypadku, otrzymasz taki sam wynik (zakładając, że Test ma konstruktor, który przyjmuje liczbę całkowitą):

Test t1 = new Test(5);
Test t2 = t1;          
t2 = new Test(1); // Here we are assigning to the variable, just like your 2nd example
System.out.println(t1);
System.out.println(t2);

Ludzie wspominają, że String jest niezmienna. Ale to jest nieistotne i nie ma pojęcia "zmienności" w języku i nie ma różnicy między tym, jak działają klasy "mutable" i "immutable". Nieformalnie mówimy, że klasa jest "niezmienna", jeśli nie ma żadnych pól, które możesz ustawić lub metod, które mogą zmienić jej wewnętrzną zawartość. Tak jest w przypadku String. Ale mutowalna klasa działa dokładnie tak samo, jeśli po prostu nie zrobisz nic, aby ją zmutować.

 2
Author: newacct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 18:04:01

Obiekty String są niezmienne .


EDIT

czy Test t2 = t1; powoduje, że zarówno t2, jak i t1 wskazują na ten sam obiekt, czy też każdy ma teraz swoje własne obiekty?

Tak. Chociaż t2 jest nowym odniesieniem, ale będzie wskazywało na ten sam obiekt, ponieważ kazałeś mu to zrobić. Utwórz nową referencję t2 Typu Test i pozwól jej wskazywać na ten sam obiekt, na który wskazuje t1.

Ale kiedy robisz to z String s, a potem robisz coś podobnie jak s1 = "1" ; sprawiasz, że s1 wskazuje na inny obiekt String. Można o tym myśleć w kategoriach s1 = new String(1);.

 2
Author: Kazekage Gaara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 18:07:43

String są obiektami jak każdy inny. Tak więc każda przypisana zmienna odnosi się do tej samej instancji obiektu, podobnie jak w przypadku obiektu testowego.

Ale pamiętaj, że String nie ma pola, które możesz ustawić tak jak to robisz w teście, więc zasadniczo nie możesz wykonać tego samego testu, więc nie ma możliwości przeniesienia kodu z obiektu testowego do obiektu String.

Otrzymujesz przeciwne zachowanie używając prymitywnych typów, takich jak long, int itp. Są przypisane do zmiennych "według wartości" , więc jeśli do

int t1 = 12;
int t2 = t1;
t1=15;

T2 nadal ma wartość 12

 1
Author: Andrea Parodi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 09:20:43