Konstruktory. Idea odwołania This();

0

Hej.
Rozwiązania problemu mojego szukałem po różnych materiałach, ale wciąż nie moge zrozumieć. Mógłby ktoś wytłumaczyć to bardziej praktycznie?
Mianowicie nie rozumiem idei słówka "this" w Javie, a konkretnie wsadzania go do każdego konstruktora i gdzie sie tylko da. O ile zrozumienie zagadnień innych nie sprawia mi problemu to owe, ktoś mógłby powiedzieć trywialne (nie bijcie mnie za to), przyprawia mnie o nerwice. :D

To co ja rozumiem: Warto używać gdy przeciążone konstruktory różnią się jedynie listami argumentów, a wykonują dokładnie te same czynności, te same inicjalizacje. Więc wykorzystujemy aby nie powielać kodu i aby był bardziej zautomatyzowany i elastyczny. Wywołuje this(); żeby odwołać się do konstruktora, który dokończy tworzenie obiektu.

Ten przykład rozumiem jest dla mnie logiczny (z Headfirst):

 class Mini extends Samochod{
    Color kolor;
    public Mini(){
        this(Color.red); // konstruktor bezargumentowy okresla domyślny kolor i odwołuje się do kolejnego konstruktora za pomoca "this"
    }
     public Mini(Color k){
         super("Mini"); 
         kolor = k;
     }
} 

Natomiast tych 2 przykładów już nie. Nie rozumiem sensu użycia "this."

 public class KlasaZKonstruktorami {

private int jakasLiczba;

public KlasaZKonstruktorami() {
    this(10);
}

public KlasaZKonstruktorami(int jakasLiczba) {
    this.jakasLiczba = jakasLiczba; // Nie rozumiem tego odwołania tutaj. Po co?
}

} 

LUB

 public class KotZKonstruktorami {

    String imie;

    public Kot() {
        //konstruktor bezargumentowy
    }

    public Kot(String imie) {
        this();                 //tego tutaj tez nie rozumiem
        this.imie = imie;       //ooo i tutaj też
    }
} 
1
this.jakasLiczba = jakasLiczba;

Nazwa jakasLiczba odnosi sie do dwóch różnych obiektów: pola w klasie i zmiennej lokalnej konstruktora. Poprzedzenie takiej dwuznacznej nazwy słowem kluczowym this wskazuje, że chodzi nam o pole w klasie.

 public class KotZKonstruktorami {

    String imie;

    public Kot() {
        //konstruktor bezargumentowy
    }

    public Kot(String imie) {
        this();                 //tego tutaj tez nie rozumiem
        this.imie = imie;         //ooo i tutaj też
    }
}

W tym przykładzie wiersz this(); jest zbyteczny.

0

I to wszystko? A w przypadku setterów?

public class Kot {

   private String imie;

public String getImie() {
         return imie;
     }

     public void setImie(String imie) {   // w parametrze zmienna lokalna "imie"
         this.imie = imie;                       // this.imie odnosi się do 2giej linijki "private String imie"
     }

Czyli jest to rownoznaczne z kodem:

public class Kot {

   private String imie;

public String getImie() {
         return imie;
     }

     public void setImie(String imieArgument) {   
         imie = imieArgument;   
}

????

1

Zamiast

 public Kot(String imie) {
    this.imie = imie;
}

można zrobić

 public Kot(String imieParam) {
    imie = imieParam;
}

W tym przypadku "this." jest po prostu wskaźnikiem na obecny obiekt.

0

Czyli "This" ma tak jakby 2 zastosowania:
this(); - odwołanie do konstruktora
this.jakiesPole; - odwołanie do Pola klasy

Si? :)

1

Si. Każde odwołanie do pola w klasie można poprzedzać słowem this, ale nie każde trzeba.
Zastanów się, co robi poprawny kod:

 private String imie;
 public Kot(String imie) {
    imie = imie;
}
0

Tak, w zasadzie takie ma zastosowanie. Żeby "tak naprawdę" zrozumieć czym jest wskaźnik this polecam przeczytać fragment książki Symfonia C++ Standard. Programowanie w języku C++ orientowane obiektowo. Tom I i II -- Jerzy Grębosz. Co prawda jest to książka do C++, ale zasada dotycząca this jest w zasadzie taka sama. Autor na przykładzie babci z wąsami (jeżeli dobrze pamiętam) tłumaczy to pojęcie (pamiętam, że długo miałem problem ze zrozumieniem tego i po przeczytaniu tamtego rozdziału wszystko się rozjaśniło).

1

Dlaczego znowu lincz. Ja wiem, że książka jest stara jak świat (poza tym szczerze nienawidzę c i c++ :D). Jednak jeżeli znajdzie się jakaś bardzo cenna informacja, która się nie starzeje, to może warto o niej wspomnieć. Miałem np. taką sytuację, że nie mogłem zrozumieć pewnego pojęcia matematycznego i godziny przeglądania internetu nie pomogły, a książka do matematyki z 1920 rozwiązała problem w 10 minut.

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