2013-04-25 11 views
5

mam:Czy można ustawić kalendarz c równy Kalendarz c2?

Calendar c = Calendar.getInstance(); 
c.set(Calendar.HOUR_OF_DAY,1); 
c.set(Calendar.MINUTE,23); 
c.set(Calendar.SECOND,22); 

Calendar c2 = Calendar.getInstance(); 

c2 = c ; // 

jest to ostatnie stwierdzenie poprawne, jeśli chcę ustawić Kalendarz Kalendarz c2 równą c?

+0

Mam nadzieję, że jest poprawny ...! – SenthilPrabhu

+0

Dlaczego nie napisać małego programu testowego, aby porównać wyniki dla siebie? – Mike

+0

Ta instrukcja przypisuje wartość "c" do zmiennej "c2". ('c == c2' będzie" prawda "). – afk5min

Odpowiedz

0

Klasa kalendarza ma metodę compareTo. rzucić okiem na ten

CompareTo()

+0

tak, ale nie chcę ich porównywać, chcę ustawić jeden kalendarz równy drugiemu – ARMAGEDDON

10

Pomimo ich c2 = c wydaje się działać, to nie jest to, co chcesz: obie zmienne będą wskazując na tej samej instancji kalendarzowego. W wyniku tego przypisania wszelkie zmiany wprowadzone do c będą również dostępne w c2 i na odwrót.

Można użyć clone() sposób zrobić kopię obiektu Calendar, tak:

Calendar c= (Calendar)c2.clone(); 
+0

Tego właśnie chcę! Dziękuję bardzo. EDYCJA: Twoja odpowiedź jest niesamowita! – ARMAGEDDON

+0

Właśnie widziałem to zachowanie w moim kodzie! Nie mogłem uwierzyć własnym oczom i musiałem szukać potwierdzenia. Dzięki :) – Poutrathor

0

Ty nawet nie trzeba c2 = Calendar.getInstance(), wystarczy przypisać bezpośrednio C2 = 'c'.

2

c2 = c oznacza, że ​​będziesz mieć 2 pola wskazujące na to samo wystąpienie. jeśli modyfikujesz c, będziesz również modyfikował c2

c2 = c.clone() klonuje instancję i zwraca inną instancję. jeśli zmodyfikować c nie będzie modyfikować C2

3

To stwierdzenie:

c2 = c ; 

skopiuje wartość c w c2. Wartość c jest nie obiektu Calendar - jest odniesienie. Po tym stwierdzeniu dwie zmienne mają tę samą wartość - dwa odniesienia do tego samego obiektu. Wszelkie zmiany obiektu Calendar można zaobserwować za pomocą dowolnej zmiennej.

To tak, jakby dać dwie różne osoby kawałki papieru podając swój adres domowy - jeśli jedna osoba używa adresu, aby dostać się do domu i maluje zielone drzwi, to druga osoba też to zobaczy.

Należy zauważyć, że nie jest to specyficzne dla Calendar - jest to zachowanie przypisania dla wszystkich klas w Javie.

(Bardzo ważne jest, aby rozróżnić zmienne, odniesienia i obiekty, w zasadzie W normalnej dyskusji trzy często są używane niepoprawnie ze względu na zwięzłość, ale trzeba być w stanie odróżnić, kiedy trzeba).

Zauważ, że ten kod:

Calendar c2 = Calendar.getInstance(); 
c2 = c; 

tworzy nową instancję Calendar bezsensownie. Byłoby bardziej sensownie napisany jako:

Calendar c2 = c; 

Ten kod będzie miał ten sam efekt widoczny, ale bez wywoływania Calendar.getInstance() a następnie wyrzucać nowo utworzony obiekt.

+0

Dziękuję Jon Skeet! Świetna odpowiedź też! Teraz rozumiem więcej o klasach Java! – ARMAGEDDON

+0

+1 dla przykładu. Pozostałe wyjaśnienie znaku Skeety :) –

Powiązane problemy