Tworzenie obiektu w funkcji

0

Siemka jestem początkującym w javie, wcześnie tylko c++ i trochę nie mogę się przestawić
mam do was takie pytanie jeśli chodzi o tworzenie obiektów w funkcji. Przykładowy kod :

public class JakasKlasa
{
      public static void main (String []args)
    {
          JakasInnaKlasa obiekt1 = null
          funkcja(obiekt1);
          sout(obiekt1);
    }

     pubic static void funkcja(JakasInnaKlasa obiekt1)
    {
        obiekt1=new JakasInnaKlasa ();
    }
}

Moje pytanie brzmi czemu po wyjsciu z funkcji wyswietlanie obiektu to "null". Obiekty w javie z tego co mi wiadomo są typami złożonymi i są przesyłane do funkcji ich oryginały.
toStringa przeciążyłem poprawinie ale i tak to nie ma chyba z tym nic wspólnego. Szperałem trochę po internecie ale nic niestety nie znalazłem :/ jakby ktoś mógł jak działają w Javie referencje to byłbym wdzięczny :) Z góry dzięki

0

Przeciez to nie dziala i w C++ i w Javie.
W C++ musisz miec podwojny wskaznik na obiekt zeby zadzialalo.
W Javie musisz nowy obiekt zwrocic w wyniku funkcji albo w jakiejs mutowalnej kolekcji poddanej na wejsciu.

0
Pliczek napisał(a):

Moje pytanie brzmi czemu po wyjsciu z funkcji wyswietlanie obiektu to "null".

Bo Java nie ma parametrów wyjściowych, a to co napisałeś zadział tylko dla języków mających patologię zwaną parametrami wyjściowymi typu C# czy PL/SQL.
W Javie jak chce się zwrócić nowy obiekt z metody (bo to co napisałeś to jest metoda statyczna według nazewnictwa w Javie) to używa się return a nie parametrów wyjściowych

public class JakasKlasa {
      public static void main (String []args) {
          JakasInnaKlasa obiekt1 = metodaStatyczna();
          sout(obiekt1);
    }

     public static JakasInnaKlasa metodaStatyczna(JakasInnaKlasa obiekt1) {
        return new JakasInnaKlasa ();
    }
}

Poprzesuwałem też otwarcia nawiasów żeby były zgodne z konwencją w Javie.
Powodzenia w nauce

0

Ew. jakbyś chciał potrolować lub mieć trochę Pascala / C# w Javie:

import java.util.*;
import java.lang.*;
import java.io.*;

class JakasKlasa
{
    public static void main (String []args)
    {
          JakasInnaKlasa obiekt1 = null;
          OutputParam param = new OutputParam(obiekt1);
          funkcja(param);
          System.out.println(param);
    }

    public static void funkcja(OutputParam<JakasInnaKlasa> obiekt1)
    {
        obiekt1.value(new JakasInnaKlasa());
    }
}

I OutputParam.java:

public class OutputParam<T> {
  T value;
  public OutputParam(T initialValue) {
  	this.value = initialValue;
  }	
  
  public void value(T newValue) {
  	this.value = newValue;
  }
  
  public T value() {
  	return this.value;
  }

  @Override
  public String toString() {
	return value != null ? value.toString() : "null";
  }
	
}

https://ideone.com/Jh8B1T

3

i są przesyłane do funkcji ich oryginały.

Nie, nie są. Przesyłane są tylko wskaźniki do tychże obiektów. W efekcie zmiana wartości wskazywanej przez taki wskaźnik nie powoduje żadnych skutków ubocznych widocznych poza funkcją. I dobrze zresztą, korzystaj z wartości zwracanej a nie z efektów ubocznych! W javie ten zapis po prostu nie ma żadnych * jak w C++, bo zawsze operujesz wskaźnikami wiec nie trzeba tego specjalnie sygnalizować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1