2012-02-12 13 views
15

Mam klasy GUI więc mogę utworzyć obiektu takiego:Czym różnią się odniesienia do obiektów w java?

GUI g1 = new GUI(); 

i zmienną referencyjną takiego:

GUI g2; 

teraz tyle, ile wiem, g2 jest zmienna referencyjna co daje odniesienie do klasy GUI i g1 jest obiektem klasy GUI. Jaka jest różnica między g1 i g2? Mogę używać właściwości klasy GUI z obiektem, ale jakie jest możliwe użycie g2?

+2

Myślę, że nie można użyć g2 w kodzie, ponieważ nie został jeszcze zainicjowany i jest pusty. – evilone

+3

g1 również stanowi odniesienie! –

+2

Myślę, że to pytanie zasługuje na miłą odpowiedź, aby pozostać w pobliżu! – slezica

Odpowiedz

22

Referencje są nazwami. Obiekty to coś. Możesz mieć różne nazwy rzeczy, nawet dla rzeczy, które tak naprawdę nie istnieją.

Można zadeklarować nazwy, bez faktycznie dając im żadnych „prawdziwe”, czyli, jak to:

GUI g1; 

można przypisać znaczenie (prawdziwe rzeczy w odniesieniu do) do nazw z = operatora:

GUI g1 = some_gui; 

Nazwy mogą zmieniać swoje znaczenie w czasie. Ta sama nazwa może odnosić się do różnych rzeczy w różnych punktach historii.

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

Istnieją również synonimy: wiele nazw może odnosić się do tego samego:

GUI g2 = g1; 

To dość dużo, co zrobić referencje. Są to nazwy przeznaczone do odniesienia się do rzeczy.

Rzeczy mogą być tworzone:

new GUI(); 

Rzeczy mogą być tworzone i nazwany na miejscu dla późniejszego wykorzystania (dosłownie!):

GUI g1 = new GUI(); 

I rzeczy można określić, używając jego nazwy (lub dowolne z jego nazw!):

g1.doSomething(); 
g2.doSomethingAgain(); 

Można utworzyć różne rzeczy tego samego rodzaju (klasy) i nam ed inaczej:

GUI g1 = new GUI(); 
GUI g2 = new GUI(); 
GUI g3 = new GUI(); 

GUI g1_synonym = g1; 

:)

+2

Wielki pierwszy akapit. Dobry sposób na przedstawienie pomysłów OOP. –

5

Nie jesteś w stanie wykorzystać g2 aż przypisać obiekt do niego, ponieważ obecnie nie wskazują na dowolny obiekt, a g1 wskazuje już na GUI obiektu i można z niego korzystać.

to:

GUI g1 = new GUI(); 

jest prawie równoznaczne z:

GUI g1; 
g1 = new GUI(); 
2

Obiekty są jak bańki pływające przez przestrzeń o nazwie sterty. Zmienne są jedynie linkami do tych baniek. Wyrażenie new GUI() tworzy obiekt, a operator = łączy go ze zmienną g1. g2 jest również zmienną, ale nie jest powiązana z żadnym obiektem. Można łatwo zamienić je pisząc

g2 = g1; 
g1 = null; 

Teraz g2 odnosi się do obiektu, który g1 powołuje się na początku, a g1 odnosi się do niczego. Obiekt jest nienaruszony, zmieniono tylko zmienne.

0

Właściwie w języku Java nazwa zmiennej jest odniesieniem (z wyjątkiem typów pierwotnych). Nie można użyć wartości g2, ponieważ nie została ona zainicjowana, a nawet nie jest pusta. Dostaniesz błąd czasu kompilacji, próbując wywołać metodę dla g2. Po GUI g2; g2 nie wskazuje obiektu w pamięci. Jeśli ustawisz g2 na wartość null taką jak ta GUI g2 = null;, możesz użyć go po deklaracji, ale jeśli wywołasz metodę g2, uzyskasz NullPointerException.

0

Zarówno g1, jak i g2 są odniesieniami. Ale g2 nie jest zainicjalizowany, więc nie można go użyć w kodzie.

//Tells that g1 g2 should hold Gui object. Currently they are not holding any object. 
Gui g1; 
Gui g2; 

//Now g1 reference holds object. g2 reference still doesn't point to any object. 
g1 = new GUI(); 
11

Jaka jest różnica między odniesienia i obiektów w Java?

Odwołanie to jednostka zapewniająca sposób dostępu do obiektu tego typu. Obiekt to encja zapewniająca sposób dostępu do członków klasy lub typu.

Zasadniczo nie można uzyskać dostępu do obiektu bez odniesienia do niego.

class GUI 
{ 
    void aMethod() 
    { 
     // some business logic. 
    } 
} 

Możesz zadzwonić pod numer aMethod z lub bez odniesienia. ale zdecydowanie potrzebujesz obiektu.

bez odniesienia:

new GUI().aMethod(); 
// you can't reuse the object 
// bad way to code. 

Nawiązując:

GUI aGUIReference = new GUI(); 
aGUIReference.aMethod(); 
// Now, the object can be reused. 
// Preferred way to code 

Teraz trochę wyjaśnienia na linii kodu:

GUI g1 = new GUI(); 
// g1 is a reference to an object of GUI class. 

GUI g2; 
// g2 is a reference that can point to an object of GUI class 
// but currently not pointing to any. 

Jedyna różnica b/w g1 ijest g1 jest inicjowany przedmiotu, ale g2 punktów null

g2 = g1; 
// it means g2 will point to the same object g1 is pointing to 
// only one object but two references. 
+1

To jest właściwa odpowiedź. –

+2

To musi być zaakceptowana odpowiedź. – wfunston

0

Odniesienia stanowią nazwy. Obiekty to coś. Możesz mieć różne nazwy rzeczy, nawet dla rzeczy, które tak naprawdę nie istnieją.

Można zadeklarować nazwy, bez faktycznie dając im żadnych „prawdziwe”, czyli, jak to:

GUI g1; 

Nazwy mogą zmienić ich znaczenie w czasie. Ta sama nazwa może odnosić się do różnych rzeczy w różnych momentach.

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

To właśnie to, co robią referencje. Są to nazwy przeznaczone do odniesienia się do rzeczy.

Rzeczy mogą być tworzone:

new GUI(); 

Rzeczy mogą być tworzone i nazwany na miejscu dla późniejszego wykorzystania (dosłownie!):

GUI g1 = new GUI(); 

:)

0

Odwołanie jest "haczyk", gdzie można powiesić na obiekt. Obiekt może znajdować się na więcej niż jednym haku.

3

References są rodzajem wskaźników do bloku pamięci o nazwie objects.

GUI g1 = new GUI(); 

Dla wyjaśnienia, pozwól mi przełamać powyższe stwierdzenie.

GUI g1; 
g1 = new GUI(); 

1. krok: g1 jest zmienną odniesienia (wskaźnik), jeszcze nie wskazując na każdej ważnej lokacji pamięci.

Krok 2: W drugim kroku pamięć dla obiektu klasy GUI jest przydzielana, a operacja przypisania powoduje, że zmienna referencyjna wskazuje obiekt (położenie pamięci). Słowo kluczowe new przydziela pamięć dla obiektu klasy GUI.

Powiązane problemy