Obiekt jako parametr

0

Cześć. Pytanie polega na następnym:

static void changePerson(Person p){
    p = new Person("Alice");    // 
    p.setName("Ann");           // 
}
p = new Person("Alice") i Person person = new Person("Alice")

Czy są to po prostu dwa sposoby tworzenia obiektu, albo może czymś one się różnią? Przecież to nie jest błąd, jeżeli nie w głównym classie wpiszę Person person = new Person("Alice") zamiast wysyławania Person p do parametru?

0

Jeżeli podajesz w parametrze funkcji Person p to znaczy, ze do funkcji przekażesz zainicjowaną zmienną obiektową. W pierwszej linijce swojej funkcji przypisujesz zmiennej nowy obiekt korzystając z konstruktora parametrycznego.

0

Jeśli kod:

static void changePerson(Person p){
    p = new Person("Alice");    // 
    p.setName("Ann");           // 
}

to Java to ja tu widzę co najmniej cztery będy. Jeden duży i trzy mniejsze ideologiczne, ale i tak nie rozumiem o co pytasz

0

Tak, różnią się:

    p.setName("Ann");

Brawo, właśnie zmieniłeś stan obiektu, do którego referencję przekazałeś jako parametr p. Zmiana będzie widoczna po wyjściu z metody (w tym samym wątku) a nawet jeszcze przed wyjściem - jeśli masz więcej wątków, któryś trzyma referencję do tego obiektu i akurat zechce coś przy nim zrobić. Np. ustawić imię na "Jola". I teraz zgadnij czyje będzie na wierzchu. Ale to już inna broszka ;)

    p = new Person("Alice");

Brawo, właśnie stworzyłeś obiekt, który zostanie posprzątany przez GC po wyjściu z metody. Czemu? Bo parametr p trzyma sobie referencję do obiektu, a nie... referencję do referencji, lub referencję do obiektu, który z kolei trzymałby referencję do Person. Czyli przypiszesz do niego nową referencję do nowego obiektu, ale stara referencja (używana poza metodą) nadal będzie referencją do starego obiektu. Nikt nic nie zauważy, tylko Ty i GC będziecie wiedzieć o tych wszystkich Jolach i Mariolach, które sobie tu wyprodukujesz ;)

2

Powiedz mi Person person = new Person(); Po co w ogóle piszemy to pierwsze słowo "Person"? Jaka jego logika?

Person person to deklaracja typu obiektu i jego nazwa, natomiast new Person(); odpowiada za utworzenie i przypisanie do zmiennej konkretnej instancji.

1

Po co w ogóle piszemy to pierwsze słowo "Person"? Jaka jego logika?

To wynika z braku tzw. type inference, przynajmniej w starszych wersjach Javy, bo ostatnio chyba w końcu wprowadzili jakąś tam namiastkę inferencji typów - dlatego trzeba wprost definiować typ definiowanej zmiennej.

Różne języki w różnym stopniu to wspierają - niektóre wcale, inne dopiero od niedawna, jedne pozwalają jej używać właściwie dowolnie, inne w mniej lub bardziej ograniczonym zakresie. W niektórych od zarania dziejów typy w ogóle są traktowane bardzo liberalnie, że tak to ujmę, a w innych niby jest dynamiczne typowanie, ale weszły do języka tzw. type hints które pozwalają doprecyzować np. typ zmiennej czy parametru, jeśli ktoś czuje taką potrzebę.

Tak czy owak, kompilator chce znać typ definiowanej zmiennej, by wiedzieć, do jakiego typu obiektów może się ta zmienna odnosić - bez wprost zdefiniowanego typu albo nie będzie tego w ogóle wiedział, albo domyśli się (inferencja typów), ale jego domysły mogą nie być zgodne z intencją programisty - bo programista mógłby na przykład chcieć, by zmienna była typu interfejsu albo jakiejś klasy nadrzędnej.

2

Powiedz mi Person person = new Person(); Po co w ogóle piszemy to pierwsze słowo "Person"? Jaka jego logika? Jeżeli person - to referencja, nazwa, a new Person(); - to prośba tworzenia obiektu z classy Person. To właśnie po co pisać to pierwsze słówko? Przecież ----- person = new Person(); - bardziej logiczne. nie? Bardzo ci dziękuję

No nie do końca. Bo może chciałbyś jednak zrobić

Object p = new Person();

? Albo bardziej ogólnie, przypisać obiekt pochodny do typu bazowego i korzystać z polimorfizmu? Wyobraź sobie taki kod:

List<Integer> lista;
if(x == 1){
    lista = new ArrayList<Integer>();
}else{
    lista = new LinkedList<Integer>();
}

Ale wracając do pytania, nowsze wersje javy pozwalają na deklaracje bez podania typu o ile inferencja jest w stanie wydedukować jaki typ powinien tam być.

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