Jaka jest różnica między referencjami a obiektami w Javie? [duplikat]

To pytanie ma już odpowiedź tutaj:

Mam klasę GUI więc mogę tworzyć obiekt w ten sposób:

GUI g1 = new GUI();

I zmienną odniesienia taką jak Ta:

GUI g2;

Teraz z tego, co wiem, G2 jest zmienną odniesienia, która daje odniesienie do GUI klasa i g1 jest obiektem klasy GUI. Jaka jest różnica między g1 i g2? Mogę użyć właściwości klasy GUI z obiektem, ale jakie jest możliwe użycie g2?

Author: Dani_NJ, 2012-02-12

9 answers

Odniesienia są nazwami. Przedmioty to rzeczy. Możesz mieć różne nazwy dla rzeczy, nawet dla rzeczy, które nie istnieją.

Możesz deklarować nazwy, nie podając im żadnego "prawdziwego" znaczenia, jak to:

GUI g1;

Możesz przypisać znaczenie (prawdziwe rzeczy do których się odnosisz) nazwom za pomocą operatora=:

GUI g1 = some_gui;

Imiona 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 właśnie robią referencje. Są to nazwy mające odnosić się do rzeczy.

Rzeczy można utworzyć:

new GUI();

Rzeczy mogą być tworzone i nazywane na miejscu do późniejszego odniesienia (dosłownie!):

GUI g1 = new GUI();

I do rzeczy można się odnieść, używając jego nazwy (lub dowolnej z jego nazw!):

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

Różne rzeczy tego samego rodzaju (klasy) mogą być tworzone i nazwane inaczej:

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

GUI g1_synonym = g1;

:)

 24
Author: slezica,
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-02-12 10:15:24

Jaka jest różnica między referencjami a obiektami w Javie?

Referencja to encja, która zapewnia dostęp do obiektu swojego typu. Obiekt jest encją, która zapewnia dostęp do członków jego klasy lub typu.

Ogólnie rzecz biorąc, nie można uzyskać dostępu do obiektu bez odniesienia do niego.

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

Możesz zadzwonić aMethod z referencją lub bez. ale zdecydowanie potrzebujesz przedmiotu.

Bez Odniesienia:

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

Z Referencja:

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

Teraz małe wyjaśnienie do 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.

Jedyną różnicą b / w g1 i g2 jest to, że g1 jest inicjowana obiektem, ale g2 wskazuje na null

g2 = g1;
// it means g2 will point to the same object g1 is pointing to
// only one object but two references.
 13
Author: Azodious,
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-02-12 10:45:17

Nie możesz używać g2 dopóki nie przypisasz do niego obiektu, ponieważ obecnie nie wskazuje on na żaden obiekt, podczas gdy {[3] } wskazuje już na GUI i możesz go używać.

To:

GUI g1 = new GUI();

Jest w zasadzie odpowiednikiem:

GUI g1;
g1 = new GUI();
 5
Author: MByD,
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-02-12 09:53:20

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

GUI g1 = new GUI();

Dla wyjaśnienia, pozwolę sobie złamać powyższe stwierdzenie.

GUI g1;
g1 = new GUI();

1st step: g1 jest zmienną referencyjną (Wskaźnikiem), nie wskazującą jeszcze żadnej poprawnej lokalizacji pamięci.

Drugi krok: drugi krok przydziela pamięć dla obiektu klasy GUI i operacja przypisania powoduje, że zmienna referencyjna g1 wskazuje na ten obiekt (położenie pamięci). Słowo kluczowe new przydziela pamięć dla obiekt klasy GUI.

 3
Author: Sumit Trehan,
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
2016-06-10 05:31:23

Obiekty są jak bąbelki unoszące się w przestrzeni zwanej stertą. Zmienne są jedynie linkami do tych bąbelków. Wyrażenie new GUI() tworzy obiekt i operator = łączy go ze zmienną g1. g2 jest również zmienną, ale nie jest powiązana z żadnym obiektem. Możesz je łatwo zamienić, pisząc

g2 = g1;
g1 = null;

Teraz g2 odnosi się do obiektu, do którego g1 odnosiło się na początku, a g1 odnosi się do niczego. Obiekt jest nienaruszony, tylko zmienne zostały zmienione.

 2
Author: Eser Aygün,
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-02-12 10:03:31

Właściwie w Javie nazwa zmiennej jest referencją (poza typami prymitywnymi). Nie możesz użyć g2, ponieważ nie została zainicjowana, a nawet nie jest null. Otrzymasz błąd w czasie kompilacji podczas próby wywołania metody dla g2. Po GUI g2; g2 nie wskazuje na obiekt w pamięci. Jeśli ustawisz g2 Na null w ten sposób {[3] } możesz go użyć po deklaracji, ale jeśli wywołasz metodę dla g2, otrzymasz Czas wykonania NullPointerException.

 0
Author: shift66,
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-02-12 10:03:46

Odniesienia są nazwami. Przedmioty to rzeczy. Możesz mieć różne nazwy dla rzeczy, nawet dla rzeczy, które nie istnieją.

Możesz deklarować nazwy, nie podając im żadnego "prawdziwego" znaczenia, jak to:

GUI g1;

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

GUI g1 = some_gui;

doSomething();

g1 = some_other_gui;
To właśnie robią referencje. Są to nazwy mające odnosić się do rzeczy.

Rzeczy mogą być utworzony:

new GUI();

Rzeczy mogą być tworzone i nazywane na miejscu do późniejszego odniesienia (dosłownie!):

GUI g1 = new GUI();

:)

 0
Author: slezica,
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-02-12 10:11:52

Odniesienie to "Hak", na którym można powiesić obiekt. Obiekt może znajdować się na więcej niż jednym haku.

 0
Author: Chriseyre2000,
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-02-12 10:17:31

Zarówno g1, jak i g2 są odniesieniami. Ale g2 nie jest inicjowany, więc nie może być użyty 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();
 0
Author: Иван Бишевац,
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-03-07 20:11:16