Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Java - funkcja zwracająca referencję do obiektu lokalnego

Ostatnio zmodyfikowano 2017-07-10 20:47
Autor Wiadomość
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:

C/C++
int & f()
{
    int a = 5;
    return a;
}

int main()
{
    int * ptr = & f(); // ohh jak zle...
    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.
P-163086
pekfos
» 2017-07-07 21:45:39
W Javie nie ma czegoś takiego, jak obiekt lokalny.
P-163087
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.
P-163088
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:

C/C++
//JAVA

void f()
{
    T obj = new T( 3.14 );
    //dalsze operacje
}

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?
P-163089
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.
P-163090
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.
P-163091
Monika90
» 2017-07-08 11:56:07
W C++ odpowiednikiem referencji Javy są wskaźniki.

Ta funkcja w Javie
C/C++
T f()
{
    T obj = new T();
    return obj;
}

w C++ wyglądałaby tak
C/C++
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ść.

P-163119
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:
C/C++
// C++
T * f()
{
    T * ptr; // tworzenie wskaznika NA STOSIE
    ptr = new T(); // tworzenie zmiennej NA STOGU
   
    return ptr; // zwracamy wskaznik, czyli adres do zmiennej na ktora wskazuje, po czym sam wskaznik jest usuwany (bo jest na stosie w ramce funkcji) a sam dynamicznie alokowany obiekt nie(bo jest                      //na stogu)?
}

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?
P-163120
« 1 » 2
  Strona 1 z 2 Następna strona