• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Słówko kluczowe this

Object Storage Arubacloud
0 głosów
637 wizyt
pytanie zadane 14 grudnia 2017 w Java przez rubesom Obywatel (1,690 p.)

Cześć Przerabiam sobie książkę "Java Rusz Głową" i nie mogę zrozumieć wszystkich aspektłówka this.

Rozumiem, że słowo kluczowe this jest odwołaniem do bieżącego obiektu.

Rozumiem to w takim zastosowaniu:

public class KlasaZKonstruktorami {

private int jakasLiczba;

public KlasaZKonstruktorami(int jakasLiczba) {
    this.jakasLiczba = jakasLiczba;
}

}

W powyższym przypadku słówko this (jeżeli dobrze rozumiem) znaczy tyle, że

this.jakasLiczba

odnosi się do parametru konstruktora a nie do pola w kalsie.

Ale nie rozumiem zastosowania słówka this w takiej formie:

public class KlasaZKonstruktorami {

private int jakasLiczba;

public KlasaZKonstruktorami() {
    this(10);
}

public KlasaZKonstruktorami(int jakasLiczba) {
    this.jakasLiczba = jakasLiczba;
}

}

Drugi przykład:

Color kolor;
public Mini() {
this(Color.red);
}
public Mini(Color k) {
super("Mini”);
kolor = k;
// dalsza inicjalizacja
}

Konstruktor bez argumentowy odwoła się do konstruktora z argumentem typu int (w pierwszym przykładzie)? Jeżeli tak, to jak się to ma do zdania (definicji) "słowo kluczowe this jest odwołaniem do bieżącego obiektu.". W takim przypadku rozumiał bym to tak, że

2 odpowiedzi

+1 głos
odpowiedź 14 grudnia 2017 przez Aisekai Nałogowiec (42,190 p.)
wybrane 14 grudnia 2017 przez rubesom
 
Najlepsza
This w javie służy do "odwołania obiektu do samego siebie". Jest to przydatne, wtedy gdy parametr funkcji koliduje z nazwą pola, albo w innych przypadkach gdy potrzebujesz się odwołać obiektem do samego siebie.

W drugim przypadku, jeżeli zostanie wywołany konstruktor bezparametrowy, to wywoła on konstruktor parametrowy przekazując jakaś "stała wartość". W tym przypadku 10.

Skąd jvm wie jaki konstruktor wywołać gdy w jednym konstruktorze jest wywolywany inny? Z tego samego powodu co wtedy, kiedy tworzysz obiekt używając jakiegoś konstruktora. Szuka konstruktora z odpowiednimi parametrami i wywołuje go.

Ciężko znaleźć plusy dla konstruktorów "jednolinijkowych". Zaoszczędzić można parę tych linijek gdy konstruktor będzie trochę większy. Ale zawsze potem taki kod łatwiej upgradeowac.
komentarz 14 grudnia 2017 przez rubesom Obywatel (1,690 p.)
Czyli dobrze rozumiem pierwszą funkcjonalność, że fragment "this.jakasLiczba" wskazuje na parametr konstruktora, natomiast "= jakasLiczba;" jest to wskazanie na pole klasy? Rozumiem po co się to robi ale chciałem uściślić, czy dobrze rozumiem która część odpowiada za co.

A druga funkcjonalność działa tak, że ten fragment " this(10);" wywoła konstruktor jedno parametrowy, czyli to " this.jakasLiczba = jakasLiczba;"?
1
komentarz 14 grudnia 2017 przez Aisekai Nałogowiec (42,190 p.)

Znowu nie tak. 

this.pole odnosi się do pola w jakiejś klasie.

Załóżmy, że mamy ten twój przykładowy konstruktor z tym this.jakasLiczba. Jeżeli w nagłówku  metody (jaką jest konstruktor) podamy parametr jakasLiczba i będziemy chcieli pole obiektu jakasLiczba ustawić tym parametrem wtedy posługujemy się this. This wtedy "wskazuje" na pole obiektu do którego przypisujemy parametr konstruktora (jakasLiczba). Żeby to lepiej zobrazować (nie pisz tak):

Załóżmy, że mamy konstruktor:

private int var;
public SomeClass(int someVar){
 var=someVar;
}

Wtedy do zmiennej var zapisujesz wartość zmiennej someVar. Tak samo w twoim konstruktorze, do pola jakasLIczba (this.jakasLiczba) zapisujemy parametr konstruktora. 

Odnośnie drugiego: tak. Inny przykład, dla którego byłoby to bardziej zrozumiałe. Załóżmy że jakiś czas temu napisałeś sobie funkcję, która by liczyła wystąpienie słów w pliku a zwracała - mapę (struktura danych) przechowującą słowo-ilość wystąpień. Ale potrzebowałbyś teraz napisać funkcję, która by liczyła ilość wystąpień każdego znaku, więc musiałbyś napisać jakąś część kodu ponownie, bo już raz napisałeś funkcję która coś takiego wykonuje tylko dla wyrazów. Więc masz (może więcej niż) trzy możliwości:

a) Modyfikujesz funkcję (co nie jest wskazane [zasada: Zamknięte na modyfikacje, otwarte na rozszerzenia])

b) Tworzysz od nowa funkcję przepisując kod

c) Tworzysz nową funkcję która wywołuje już napisaną funkcję(zakładam, że parametrem jest lista/struktura danych przechowująca słowa a nie np. plik lub ścieżkę do pliku). Np dodajesz jakiś jeden parametr który oznaczałby że liczysz znaki i wewnątrz wywołujesz funkcję z strukturą danych przechowującą znaki.Co prawda, nie byłoby to optymalne ale jakoś to zobrazować chciałem.

komentarz 14 grudnia 2017 przez rubesom Obywatel (1,690 p.)
Kiedyś źle sobie to wbiłem do głowy i tak z tym żyłem.

Dzięki za pomoc.
+1 głos
odpowiedź 14 grudnia 2017 przez mbabane Szeryf (79,280 p.)

odnosi się do parametru konstruktora a nie do pola w kalsie.

Nie, jest dokładnie odwrotnie. Odwołujesz się do danego pola klasy.

A to drugie użycie, czyli: this(Color.red), polega na tym, że w ten sposób wywołujesz inny konstruktor tej klasy. Przydaje się to np. w takiej sytuacji:

class User {
   private String login, password;
  private Date birthdate;

User(String login, String password){
   this.login = login;
   this.password = password;
}

User(String login, String password, Date birthdate){
   this(login, password);
   this.birthdate = birthdate;
}

Nie powiela się wtedy kodu. Należy też pamiętać aby this() było pierwszą instrukcją w danym konstruktorze.

komentarz 14 grudnia 2017 przez rubesom Obywatel (1,690 p.)
Może źle napisałem. Chodziło mi o to, że ten fragment "this.jakasLiczba" wskazuje na parametr konstruktora, który odwołuje sie do pola klasy "jakasLiczba".

A ta druga funkcjonalność (w Twoim przykładzie), "this(login, password);" spowoduje, że zostanie wywołany konstruktor (ten wyżej) dwóparametrowy?
A co w takim przypadku (pierwszy przykład z mojego wpisu) "this(10);"? Spowoduje to, że zostanie wywołany konstruktor jednoparametrowy i zaoszczędzi mi to pisania tej linijki "this.jakasLiczba = jakasLiczba;" na rzecz tej "this(10);"?

Jeżeli dobrze zrozumiałem, to skąd JVM wie do którego konstruktora odwołuje się ten w którym używam słówka this (w kontekście tej drugiej funkcjonalności)?

Podobne pytania

0 głosów
1 odpowiedź 205 wizyt
pytanie zadane 28 grudnia 2017 w Java przez rubesom Obywatel (1,690 p.)
0 głosów
0 odpowiedzi 488 wizyt
0 głosów
4 odpowiedzi 228 wizyt
pytanie zadane 22 kwietnia 2016 w Java przez KamilloPL Gaduła (3,470 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...