Запутался насчет оператора this в Java - PullRequest
1 голос
/ 02 октября 2011

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

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

}

Зачем мне код "this.z = zz"
когда я мог так же хорошо написать «z = zz»?

Ответы [ 8 ]

3 голосов
/ 02 октября 2011

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

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

(Примечание: в скобках вокруг возвращаемых значений нет необходимости и немного шумно, IMO.)

2 голосов
/ 02 октября 2011

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

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

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

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

    private String name;
}

см. Теперь есть только 1 переменная с именем name и есть только одна переменная с именем myName. В другом примере было 2 переменные с именем name. Один из них был атрибутом класса, а другой - параметром метода.

2 голосов
/ 02 октября 2011

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

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

2 голосов
/ 02 октября 2011

В вашем конструкторе SandboxClass1 у вас есть две пары переменных, каждая из которых называется x и y. Там есть x и y, объявленные в самом объекте ("private int x = 1"), и отдельные x и y, которые являются параметрами для конструктора ("int x").

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

x = x;

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

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

this.x = x;

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

Нет необходимости использовать this с назначением z / zz, поскольку они имеют разные имена.

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

2 голосов
/ 02 октября 2011

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

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

1 голос
/ 02 октября 2011

эй, это используется для предоставления ссылки на вызывающий объект. То есть, скажем, предположим, что ваш класс - это блок, тогда, если вы хотите предоставить его объект, вы можете указать его в блоке класса, используя ключевое слово 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

1 голос
/ 02 октября 2011

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

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

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

1 голос
/ 02 октября 2011

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

this.zz = zz;
...