Top.Mail.Ru

Перечень уроков по Java

23. Ключевое слово this

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

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

Пример. В классе определим метод ret(), который будет выводить адрес скрытого поля this, т.е. адрес объекта. Создадим несколько объектов  и для каждого объекта  вызовем ret()

public class whose {

private String  str;

public     void ret() {

     System.out.println("мой адрес: "+ this);

}

}

 

public class TestThis {

 

    public static void main(String[] args) {

        whose w1 = new whose();

        whose w2 = new whose();;

        whose w3 = new whose();

System.out.print("Объект w1: "); w1.ret();

System.out.print("Объект w2: "); w2.ret();       

System.out.print("Объект w3: "); w3.ret();       

    }

   }

Будет выведено:

Объект w1: мой адрес: testthis.whose@1db9742

Объект w2: мой адрес: testthis.whose@106d69c

Объект w3: мой адрес: testthis.whose@52e922

 

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

Ссылка this не может быть использована в методах класса (то есть заданных с модификатором static), поскольку они могут вызываться без существующего объекта.

Ссылка this  также используется для разрешения конфликта имен в том случае,  если в методе класса используется параметр с тем же именем, что и поле класса, например:

 

public class Set {

int x; // поле - переменная класса

int y; // поле - переменная класса

public void SetX(int x) //имя параметра x- локальная переменная

{ // разрешение конфликтов

    this.x=x;

}

public void Speed()

{

int x =10;   //локальная переменная

int y =10;   //локальная переменная

// разрешения   конфликтов

this.x=this.x+x;

this.y=this.y+x;

}

}