Java - funkcja zwracająca referencję do obiektu lokalnego
Ostatnio zmodyfikowano 2017-07-10 20:47
latajacaryba Temat założony przez niniejszego użytkownika |
Java - funkcja zwracająca referencję do obiektu lokalnego » 2017-07-07 21:40:27 Witam. Ostatnio wyczytałem, że w Javie metody mogą zwracać obiekt zadeklarowany w funkcji i nie byłoby to nic niezwykłego, gdyby nie to, że tak naprawdę zwracają referencję do obiektu, a nie wartość (nie zwracają przez wartość). W C++ coś takiego byłoby niedopuszczalne, gdyż taki obiekt po zakończeniu funkcji po prostu znika: int & f() { int a = 5; return a; }
int main() { int * ptr = & f(); cout <<* ptr; }
Skorzystałem ze znalezionego kiedyś źródła informacji, na temat: Jak działają funkcję C++ . Tu oczywiście jasno jest powiedziane - po zakończeniu funkcji obiekt jest usuwany. Natomiast w Javie jakoś to działa. Prosiłbym, by ktoś wytłumaczył mi jak. |
|
pekfos |
» 2017-07-07 21:45:39 W Javie nie ma czegoś takiego, jak obiekt lokalny. |
|
Kinexity |
» 2017-07-07 22:08:40 Magia maszyny wirtualnej - jak się nie mylę to w Javie zmienne (czy jak się one w niej zwą) są usuwane przez GC dopiero gdy nie są potrzebne, więc gdy dana zmienna jest wciąż potrzebna to GC zostawi ją w spokoju. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-07-07 22:14:03 W takim razie co się dzieje ze zmiennymi utworzonymi w metodach? Przecież gdyby nie były usuwane, to coś takiego:
void f() { T obj = new T( 3.14 ); }
public static void main( String[] args ) { T obj = new T( 4.12 ); obj.f(); }
Wystąpiłby błąd - 2 razy zadeklarowana zmienna obj PS. No chyba, że tylko zmienne obiektowe sa usuwane, a obiekty zostają. Te nieużywane ubija Garbage Collector. Ale to tylko moje domysły. Co więc się dzieje ze zmiennymi obiektowymi / obiektami stworzonymi w funkcji EDIT: @Kinexity Ohh, potwierdziło sie :DD Ale to chyba tylko z obiektami? A co ze zmiennymi obiektowymi? |
|
Kinexity |
» 2017-07-07 22:16:34 *mogę się mylić* Ale one mają takie same nazwy tylko w kodzie. Z pewnością w czasie wykonywania są one rozpoznawane jako dwie różne. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-07-07 22:23:46 Ok, odpowiedź to prawdopodobnie - zasięg blokowy. objw funkcji po prostu nie jest widoczny w main. |
|
Monika90 |
» 2017-07-08 11:56:07 W C++ odpowiednikiem referencji Javy są wskaźniki. Ta funkcja w Javie T f() { T obj = new T(); return obj; }
w C++ wyglądałaby tak T * f() { T * obj = new T; return obj; }
W Javie nie zwraca się obiektu przez referencję, ale zwraca się referencję przez wartość, podobnie jak w C++ - wskaźńik przez wartość. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-07-08 13:21:34 Nigdy nie miałem potrzeby zwracania wskaźnika, toteż zapytam; Czy wygląda to tak: T * f() { T * ptr; ptr = new T(); return ptr; }
Za to w Javie wszystkie obiekty są tworzone na stogu (?), więc zwracanie do nich referencji jest możliwe (bo nie giną po zakończeniu funkcji). Dobrze rozumiem? |
|
« 1 » 2 |