Confused about “this” operator in Java

Refresh

December 2018

Views

621 time

1

Though I'm trying to understand why "this" is needed, I'm very confused about its purpose. For instance, I coded the following:

public static void main (String args[])
{
    SandboxClass1 temp = new SandboxClass1(1,2,3);  
    System.out.println(temp.getX());
    System.out.println(temp.getY());
    System.out.println(temp.getZ());

    System.out.println("----------------------------");

    SandboxClass1 temp2 = new SandboxClass1(4,5,6);
    System.out.println(temp2.getX());
    System.out.println(temp2.getY());
    System.out.println(temp2.getZ());
}

public class SandboxClass1 
{

private int x = 1;
private int y = 1;
private int z = 0;

public SandboxClass1(int x, int y, int zz)
{
    this.x = x;
    this.y = y;
    z = zz;
}

public int getX()
{
    return(this.x);
}

public int getY()
{
    return(this.y);
}

public int getZ()
{
    return(this.z);
}

}

Why do I need to code "this.z = zz"
when I could just as well write, "z = zz"?

LTH

8 answers

2

В SandboxClass1конструкторе двух параметров ( xи y) скрыть переменные класса , потому что они одни и те же имя. Если вы хотите присвоить переменной х классов на любое значение , в то время как в коде> SandboxClass1 конструктор, вы должны обратиться его помощью , this.xчтобы сообщить компилятору , что «я хочу , чтобы присвоить переменную области видимости класса с именем х, а не переменная метода область с именем х ». То же самое относится к у.

Поскольку параметр zне скрывает переменную области видимости класса с именем zzвам не нужно , чтобы сказать компилятору сферу ZZ переменного, область класса ZZ является единственным признанным переменным так , что это тот , который получает назначение.

DwB
1

В отличие, скажем, Objective-C, «этот» является необязательным, когда метод или переменная является локальной, и не существует никакого другого конфликтующие использование одного и того же имени.

Это очень удобно в тех случаях, имя противоречивого, хотя, например, в методах , которые устанавливают переменный экземпляр , такие как , void setOnionCount(int onionCount)где вы хотели бы использовать «onionCount» для формального параметра , но до сих пор «onionCount» в качестве имени переменного экземпляра. В таком случае вы можете сделать this.onionCount = onionCount;и все довольны (кроме, я полагаю, те в Peanut Gallery , кто будет возражать против этого метода).

«Это» абсолютно необходимо в тех случаях, когда вам нужно передать ссылку на текущий объект в какой-то другой класс, конечно.

2

В конструкторе SandboxClass1, у вас есть две пары переменных каждая называется х и у. Там в х и у объявлены на самом объекте ( «частный ИНТ х = 1»), а также отдельные х и у, которые являются параметрами для конструктора ( «ИНТ х»).

Локальный (параметр) переменная затеняет переменную класса. Так что, если в конструкторе вы только что сделали

x = x;

назначение не будет иметь никакого эффекта.

Ключевое слово thisявляется ссылкой на объект , что метод / Конструктор был вызван. В заявлении

this.x = x;

вы используете его для назначения других й на уровне класса. По квалификации имени, вы можете сказать им друг от друга.

Это не обязательно использовать thisс назначением г / ZZ , потому что они имеют разные названия.

Также нет необходимости в методах GetX / Y / Z, поскольку нет локальных переменных в этих методах затенения соответствующих переменных класса. Это не делает никакого вреда, хотя.

3

Вы этого не сделаете, в этом случае. Это только требуется , когда необходимо устранить неоднозначность, как , когда параметры и переменные экземпляра разделяют имя.

Некоторые люди предпочитают использовать «это», чтобы удалить концептуальную неоднозначность и явно указать, что код ссылается на переменном экземпляр.

(На стороне записки, скобки вокруг возвращаемых значений являются ненужными и немного шумно, IMO).

1

«Это» оператор просто уточняет, что свойство / поле принадлежит к классу вы работаете в Это полезно Whe у вас есть, например, две переменные с тем же именем.:

this.zz = zz;
2

Она имеет тот же эффект. thisнеобходимо , если есть локальная переменная , которая перекрывает поле класса; то вы получите локальную переменную , а не поле класса.

Дополнительное преимущество можно указать переменные лучше. Если есть this; это поле; локальная переменная в противном случае.

1

эй это использовать , чтобы обеспечить обращение вызова объекта. То есть говорят , предположит поле ур класса , то , если вы хотите , чтобы обеспечить это объект , то вы можете предоставить его в поле класса , используя thisключевое слово.

class Box {
    int x;
    public Box(int x){
        this.x = x;
    }
}

здесь , в этом случае , если ваш объект Ob (т.е. Box ob = new Box(1)) , то ссылка будет передан сам по себе. Примечание: Вы не можете использовать это ключевое слово за пределами класса. Если вы используете так , то это даст ссылку другого класса. для полной детализации по этому ключевому слову относятся следующие ссылки http://download.oracle.com/javase/tutorial/java/javaOO/thiskey.html

2

ключевое слово это используется для обозначения атрибута, который находится в классе. Ключевое слово это было создано, чтобы различать атрибуты класса и параметры методы. как это:

public class human
{
    public void setName(String name)
    {
        // the first name is a reference to the class attribute name
        this.name = name;
        // the second name is a reference to the method parameter name
    }

    // definition of the class attribute name
    private String name;
}

При использовании ключевого слова в этом он ссылается на имя переменной внутри класса Вот пример, где вам не нужно использовать это:

public class Human
{
    public void setName(String myName)
    {
        name = myName
    }

    private String name;
}

см теперь есть только одна переменная с именем имя и есть только одна переменная с именем Myname. В другом примере было 2 переменных с именем имя. Один из них был атрибут класса и один был параметр метода.