/ / Použitie „tohto“ v Jave - java, toto, priradenie premenných

Využitie „tohto“ v jazyku Java - java, to variabilné priradenie

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ď č. 1

Ak 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.