Ak napíšem túto triedu:
public class Example {
int j;
int k;
public Example(int j, int k) {
j = j;
k = k;
}
public static void main(String[] args) {
Example exm = new Example(1,2);
System.out.println(exm.j);
System.out.println(exm.k);
}
}
Program sa skompiluje, ale keď spustím program,hlavná metóda vytlačí dve 0 s. Viem, že ak chcem povedať, že chcem inicializovať premenné inštancie v konštruktore, musím napísať:
this.j = j;
this.k = k;
Ale ak to nepíšem, potom ktorá premenná jehodnotené (alebo zvažované) v konštruktore (naľavo a na strane zápisu výrazov)? Je argument alebo premenná inštancie? Má to nejaký význam?
Existujú aj iné prípady, keď použitie this
je povinné?
odpovede:
30 pre odpoveď č. 1Ak to „nepíšete“.premenná “vo vašom konštruktore a ak máte v konštruktore lokálnu premennú (vrátane parametra funkcie) s rovnakým názvom ako vaša premenná poľa, potom sa bude brať do úvahy lokálna premenná; lokálna premenná zatieni pole (premenná triedy) ,
Jediné miesto, kde „toto“ je jediný spôsob, ako ísť:
class OuterClass {
int field;
class InnerClass {
int field;
void modifyOuterClassField()
{
this.field = 10; // Modifies the field variable of "InnerClass"
OuterClass.this.field = 20; // Modifies the field variable of "OuterClass",
// and this weird syntax is the only way.
}
}
}
10 pre odpoveď č. 2
Ak povieš spravodlivo j
vo vašom konštruktore si potom kompilátor bude myslieť, že máte na mysli argument v oboch prípadoch. tak
j = j;
jednoducho priradí hodnotu argumentu j
k argumentu j
(čo je celkom zbytočné, ale napriek tomu platné vyhlásenie).
Aby ste to vylúčili, môžete predponu this.
aby bolo jasné, že máte na mysli členskú premennú s rovnakým názvom.
Iné použitie this
je, keď potrebujete odovzdať odkaz na aktuálny objekt nejakej metóde, ako je táto:
someObject.addEventListener(this);
V tomto príklade musíte odkázať na aktuálny objekt ako celok (namiesto iba člena objektu).
6 pre odpoveď č. 3
Ak to nenapíšete, priradíte argument sám k sebe; premenné argumentu zatienia premenné inštancie.
5 pre odpoveď č. 4
to je užitočné, keď chcete vrátiť samotný objekt
return this;
Je to užitočné, pretože ak má trieda napríklad Method1 () a Method2 (), ktoré to vracajú, môžete písať hovory ako
object.Method1().Method2()
Aj v rámci metódy môže byť užitočné počas hovoru preniesť samotný objekt na inú funkciu.
5 pre odpoveď č. 5
Ďalším užitočným prístupom (hoci sa používa zriedka) je deklarovať parametre metódy ako konečné:
Nasledujúci blok sa nezkompiluje, čím vás upozorní na chybu okamžite:
public Example(final int j, final int k) {
j = j;
k = k;
}
3 pre odpoveď č. 6
Vo svojom konštruktorovom kóde priraďujetepremenné pre seba. "j" je j špecifikované v argumente konštruktora. Aj keď to bola definovaná premenná triedy j, definovaná vyššie, stále hovoríte „j = j“ ... t. J. J. Nebude hodnotiť odlišne vľavo a vpravo.
public Example(int j, int k) {
this.j = j;
this.k = k;
}
3 pre odpoveď č. 7
To, čo zažívate, sa volá variabilné zatienenie, Pozrite sa na tento prehľad rôzne druhy premenných v Jave.
Všeobecne povedané: Kompilátor Java používa najbližšiu premennú, ktorú môže nájsť pre priradenie. V metóde sa najskôr pokúsi nájsť lokálnu premennú a potom rozšíri zameranie svojho vyhľadávania na premenné triedy a inštancie.
Jeden zvyk, ktorý osobne považujem za dobrý (iné nielike it) je predpona členskej premennej pomocou m_ a použitie veľkých písmen pre CONSTANT_VARIABLES, ktoré nezmenia svoju hodnotu. Kód, v ktorom sa zámerne používa premenný tieň, je veľmi (!) laditeľný a ťažko s ním pracovať.
2 pre odpoveď č. 8
Vo svojom príklade priradíte tento parameter k sebe.
Všeobecnejšie povedané: Ak do svojej premennej nepridáte rozsah, predpokladá sa aktuálny rozsah - čo je vo vašom prípade funkcia. "This.j" povie jre, aby použil premennú j v rámci rozsahu objektu - členskú premennú objektu ,
1 pre odpoveď č. 9
Rovnako ako Robert Grant povedal, „takto“ je jasné, že namiesto lokálnej premennej odkazujete na členskú premennú.
1 pre odpoveď č. 10
Odpoveď na vaše následná otázka o tom s metódou, vnútorná trieda uvedená Srikanthom je stále platným príkladom použitia tohto: (tentoraz s metódou)
public class OuterClass
{
void f() {System.out.println("Outer f()");};
class InnerClass {
void f() {
System.out.println("Inner f()");
OuterClass.this.f();
}
}
}
Máte rovnakú situáciu anonymná trieda:
Metódy vonkajšej triedy sa môžete odvolávať na:
MyOuterClass.this.yOuterInstanceMethod()
,MyOuterClass.myOuterInstanceMethod()
,- alebo jednoducho
myOuterInstanceMethod()
ak nejestvuje nejednoznačnosť.
0 pre odpoveď č. 11
Toto úplne neodpovedá na vašu otázku, ale ak použijete Eclipse, môže byť užitočné nastavenie „Priradenie nemá žiadny účinok“. Som si istý, že to bude aj v iných IDE.
0 pre odpoveď č. 12
Môžete sa na to pozrieť Aká je výhoda this/self
ukazovateľ povinný explicitný?
Aj keď použitie this
nie je povinný v jazyku Java, pretože ste si všimli, že som si istý, že vrhne nejaké svetlo na tému použitia this
aj v Jave.
0 pre odpoveď č. 13
Aby ste tomu zabránili, použite IDE (napríklad Eclipse) a v tomto prípade vygeneruje varovania.
Svoje polia urobte konečnými, pokiaľ to absolútne nemôže byť. Existuje niekoľko dôvodov (okrem tohto), aby ste to urobili.