/ / Използването на „това“ в Java - java, това, присвояване на променлива

Използването на “this” в Java - java, this, variable-assignment

Ако напиша следния клас:

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);
}

}

Програмата компилира, но когато стартирам програмата,основният метод ще разпечата две 0s. Знам, че за да кажа, че искам да инициализирам променливите на инстанцията в конструктора, трябва да напиша:

this.j = j;
this.k = k;

Но ако не го напиша, тогава коя променлива еоценява се (или се разглежда) в конструктора (отляво и от страната на писане на изразите)? Променлив ли е аргументът или инстанцията? Има ли значение?

Има ли други случаи, когато използването на this задължително ли е?

Отговори:

30 за отговор № 1

Ако не пишете това.променлива "във вашия конструктор и ако имате локална променлива (включително параметъра на функцията) със същото име като променливата на полето в конструктора, то локалната променлива ще бъде разгледана; локалната променлива засенчва полето (известна още като променлива клас) ,

Едно място, където "това" е единственият начин да отидете:

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 за отговор № 2

Ако кажеш просто j във вашия конструктор, тогава компилаторът ще мисли, че имате предвид аргумента и в двата случая. Така

j = j;

просто присвоява стойността на аргумента j към спора j (което е доста безсмислено, но въпреки това валидно твърдение).

Така че за да разграничите това, можете да представите this. за да стане ясно, че имате предвид променливата член със същото име.

Другата употреба на this е, когато трябва да предадете препратка към текущия обект към някакъв метод, като този:

someObject.addEventListener(this);

В този пример трябва да се обърнете към текущия обект като цяло (вместо само член на обекта).


6 за отговор № 3

Ако не пишете това, тогава присвоявате аргумента на себе си; променливите на аргумента засенчват променливите на инстанцията.


5 за отговор № 4

това е полезно, когато искате да върнете самия обект

return this;

Това е полезно, защото ако в клас има например Method1 () и Method2 (), и двете връщащи това, имате право да пишете обаждания като

object.Method1().Method2()

Също така в рамките на метод може да бъде полезно да прехвърлите самия обект към друга функция по време на разговор.


5 за отговор № 5

Друг полезен подход (макар и рядко използван) е декларирането на параметрите на метода за окончателно:

Следващият блок няма да се компилира, като по този начин ви предупреждава за грешката незабавно:

  public Example(final int j, final int k) {
j = j;
k = k;
}

3 за отговор № 6

Във вашия конструкторски код присвояватепроменливи за себе си. "j" е j, посочен в аргумента за конструктора. Дори ако това беше класовата променлива j, дефинирана по-горе, тогава все още казвате "j = j" ... тоест j isn "няма да оценява различно вляво и вдясно.

  public Example(int j, int k) {
this.j = j;
this.k = k;
}

3 за отговор № 7

Това, което изпитвате, се нарича променливо засенчване, Разгледайте този преглед за различни видове променливи в Java.

Най-общо казано: Java компилаторът използва най-близката променлива, която може да намери за задание. В метод той първо ще се опита да намери локална променлива и след това да разшири фокуса на своето търсене до променливи от клас и инстанция.

Един навик, който аз лично намирам за добър (други не го правят)като него) е префиксиране на променлива на члена с m_ и използване на главни букви за CONSTANT_VARIABLES, които не променят стойността си. Код, където променливото засенчване се използва нарочно, е много (!) трудно за отстраняване на грешки и работа с.


2 за отговор № 8

Вие присвоявате параметъра на себе си във вашия пример.

По-общо казано: Ако не добавяте приложно поле към вашата променлива, се приема текущият обхват - което е функцията във вашия случай. "This.j" казва на jre да използва променливата j в обхвата на обекта - променливата член на обекта ,


1 за отговор № 9

Точно както Робърт Грант каза, "това" е начинът, по който давате да се разбере, че имате предвид променлива член, а не локална променлива.


1 за отговор № 10

За да отговорите на вашето последващ въпрос за това с метод, вътрешният клас, споменат от Srikanth, все още е валиден пример за използване на това: (с този път метод)

public class OuterClass
{
void f() {System.out.println("Outer f()");};
class InnerClass {
void f() {
System.out.println("Inner f()");
OuterClass.this.f();
}
}
}

Имате същото положение и с анонимни класове:

Можете да се обърнете към методите на външния клас чрез:

  • MyOuterClass.this.yOuterInstanceMethod(),
  • MyOuterClass.myOuterInstanceMethod(),
  • или просто myOuterInstanceMethod() ако няма неяснота.

0 за отговор № 11

Това не отговаря съвсем на вашия въпрос, но ако използвате Eclipse, може да намерите полезна настройката „Присвояване няма ефект“. Сигурен съм, че това ще бъде и в други IDE.


0 за отговор № 12

Може да искате да погледнете Какво е предимството да имаш this/self указател задължително изрично?
Въпреки че използвате this не е задължително в Java, както забелязах, сигурен съм, че ще хвърли малко светлина по темата за използването this и в Java.


0 за отговор № 13

За да избегнете това, използвайте IDE (като Eclipse) и той ще генерира предупреждения в този случай.

Освен това направете вашите полета окончателни, освен ако те абсолютно не могат да бъдат. Има редица причини (освен тази) за това.