Что означает «это» в Java?

143

Обычно я использую thisтолько в конструкторах.

Я понимаю, что он используется для идентификации переменной параметра (с помощью this.something), если она имеет то же имя, что и глобальная переменная.

Однако я не знаю, что на самом деле означает thisJava и что произойдет, если я буду использовать thisбез точки ( .).

Гильгамос
источник
7
Отвечающим: meta.stackexchange.com/questions/15775/…
BalusC
2
Якшемаш! ТАК друзья. Возможно, вы захотите обратиться и к моему вопросу здесь - stackoverflow.com/questions/23334336/… Chenqui.
Эрран Морад

Ответы:

160

this относится к текущему объекту.

Каждый нестатический метод запускается в контексте объекта. Итак, если у вас есть такой класс:

public class MyThisTest {
  private int a;

  public MyThisTest() {
    this(42); // calls the other constructor
  }

  public MyThisTest(int a) {
    this.a = a; // assigns the value of the parameter a to the field of the same name
  }

  public void frobnicate() {
    int a = 1;

    System.out.println(a); // refers to the local variable a
    System.out.println(this.a); // refers to the field a
    System.out.println(this); // refers to this entire object
  }

  public String toString() {
    return "MyThisTest a=" + a; // refers to the field a
  }
}

Затем вызов frobnicate()на new MyThisTest()напечатаем

1
42
MyThisTest a = 42

Так эффективно вы используете его для нескольких целей:

  • поясните, что вы говорите о поле, когда есть еще что-то с тем же именем, что и поле
  • относится к текущему объекту в целом
  • вызывать другие конструкторы текущего класса в вашем конструкторе
Иоахим Зауэр
источник
Это не работает. Я получаю сообщение о том, что требуется mainметод. Если я добавлю основной метод, мне придется звонить оттуда. И любая попытка вызвать frobnicate () внутри main говорит о том, что вы не можете вызвать нестатическую ссылку из статической. И удаление статики из mainснова возвращает ошибку, что основной метод не найден. Пожалуйста, объясни.
dbconfession
7
@dbconfession: приведенный здесь код не предназначен для использования в качестве автономной самодействующей программы. Вы предназначены для чтения на код и текст, а не запускать его! Это действительный код, но он предназначен только для демонстрационных целей (поэтому у него нет надлежащего основного кода). Для получения справки по основному методу см. Stackoverflow.com/questions/146576/… .
Joachim Sauer
@Joachim Спасибо! Мне не хватает чего-то фундаментального о том, что значит сделать метод статическим и как он this.работает. Насколько я понимаю, это this.позволяет вам вызывать метод или переменную, уникальную для созданной версии класса, позволяя существовать другой версии метода или переменной, которая вызывается без вызова. this. В простом вызове у Test.classменя есть два метода: public static void main()и public Test() я не может передавать информацию между методами, потому что mainявляется статическим, а конструкторы не могут быть статическими. Должен ли я опубликовать как новый вопрос?
dbconfession
@dbconfession: у меня есть ощущение, что на ваш вопрос уже дан ответ в другом месте, но я не совсем понимаю, в чем именно заключается ваш вопрос, поэтому вы можете опубликовать его (но будьте готовы закрыть его как дубликат). Однако на самом фундаментальном уровне создание метода staticозначает, что вам не нужен экземпляр класса для его вызова и что у вас не будет доступа к thisнему.
Joachim Sauer
@JoachimSauer Если бы я хотел запустить его, как бы я это сделал? У меня та же проблема, что и у dbconfession.
FudgeMuffins
52

Следующее является копией и вставкой отсюда , но очень хорошо объясняет все варианты использования thisключевого слова:

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

Ниже приведены способы использования этого:

  1. Чтобы специально обозначить, что переменная экземпляра используется вместо статической или локальной переменной. То есть,

    private String javaFAQ;
    void methodName(String javaFAQ) {
        this.javaFAQ = javaFAQ;
    }
    

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

  2. This используется для ссылки на конструкторы

     public JavaQuestions(String javapapers) {
         this(javapapers, true);
     }
    

    Это вызывает конструктор того же класса Java, который имеет два параметра.

  3. This используется для передачи текущего экземпляра Java в качестве параметра

    obj.itIsMe(this);
    
  4. Подобно приведенному выше, это также можно использовать для возврата текущего экземпляра

    CurrentClassName startMethod() {
         return this;
    }
    

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

  5. This может использоваться для получения дескриптора текущего класса

    Class className = this.getClass(); // this methodology is preferable in java
    

    Хотя это можно сделать

    Class className = ABC.class; // here ABC refers to the class name and you need to know that!
    

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

MicSim
источник
44

Для полноты, thisтакже может использоваться для ссылки на внешний объект

class Outer {
    class Inner {
        void foo() {
            Outer o = Outer.this;
    }
  }
}
бесспорный
источник
5
thisэто то, что я искал! ;)
forresthopkinsa
3
Это простоsuper
killjoy
19

Он относится к текущему экземпляру определенного объекта, поэтому вы можете написать что-то вроде

public Object getMe() {
    return this;
}

Типичный вариант использования this- предотвратить затенение. Возьмем следующий пример:

public class Person {
    private final String name;

    public Person(String name) {
        // how would we initialize the field using parameter?
        // we can't do: name = name;
    }
}

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

public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }
}
Джон Фридман
источник
4
Будьте осторожны, чтобы использовать правильный стиль при его вызове: o.getMe (). GetMe (). OutOfHere ()
Джастин К.
8

В Swing довольно часто пишут класс, который реализует ActionListenerи добавляет текущий экземпляр (то есть «this») в качестве ActionListener для компонентов.

public class MyDialog extends JDialog implements ActionListener
{
    public MyDialog()
    {
        JButton myButton = new JButton("Hello");
        myButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent evt)
    {
        System.out.println("Hurdy Gurdy!");
    }

}
Qwerky
источник
8

Цитата из статьи на programming.guide:


thisимеет два использования в программе Java.

1. В качестве ссылки на текущий объект

Синтаксис в этом случае обычно выглядит примерно так

this.someVariable = someVariable;

Этот тип использования описан здесь: Ссылка «это» (с примерами)

2. Чтобы вызвать другой конструктор

Синтаксис в этом случае обычно выглядит примерно так

MyClass() {
    this(DEFAULT_VALUE); // delegate to other constructor
}

MyClass(int value) {
    // ...
}

Этот тип использования описан здесь: вызов конструктора this (…) (с примерами)

aioobe
источник
7

Фактически, это «ссылка на объект в текущем контексте». Например, чтобы распечатать этот объект, вы можете написать:

System.out.println(this);

Обратите внимание, что ваше использование «глобальной переменной» несколько неуместно ... если вы используете, this.variableNameто по определению это не глобальная переменная - это переменная, специфичная для этого конкретного экземпляра.

Джон Скит
источник
4

Он относится к экземпляру, на котором вызывается метод

class A {

  public boolean is(Object o) {
    return o == this;
  }

}

A someA = new A();
A anotherA = new A();
someA.is(someA); // returns true
someA.is(anotherA); // returns false
Барт ван Хёкелом
источник
4

Это ключевое слово используется для обозначения текущих переменного блока, например , рассмотрит ниже код (просто exampple, поэтому не ожидайте стандартный JAVA код):

Public class test{

test(int a) {
this.a=a;
}

Void print(){
System.out.println(a);
}

   Public static void main(String args[]){
    test s=new test(2);
    s.print();
 }
}

Это оно. На выходе будет «2». Если мы не использовали ключевое слово this , то вывод будет: 0

Баладжи
источник
3

У объектов есть методы и атрибуты (переменные), которые являются производными от классов, чтобы указать, какие методы и переменные принадлежат конкретному объекту, используется thisзарезервированное слово. В случае переменных экземпляра важно понимать разницу между неявными и явными параметрами. Взгляните на fillTankпризыв к audiобъекту.

Car audi= new Car();

audi.fillTank(5); // 5 is the explicit parameter and the car object is the implicit parameter 

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

Давайте подробнее рассмотрим fillTankметод в Carклассе

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

   public void fillTank(double gallons)
   {
      tank = tank + gallons;
   }

}

В этом классе у нас есть переменная экземпляра tank. Может быть много объектов, которые используют переменную экземпляра tank, чтобы указать, что переменная экземпляра tank используется для определенного объекта, в нашем случае для объекта «audi», который мы создали ранее, мы используем thisзарезервированное ключевое слово. для переменных экземпляра использование this в методе указывает, что переменная экземпляра, в нашем случае «tank», является переменной экземпляра неявного параметра.

Компилятор java автоматически добавляет thisзарезервированное слово, поэтому вам не нужно его добавлять, это вопрос ваших предпочтений. Вы не можете использовать thisбез точки (.), Потому что это правила java (синтаксис).

В итоге.

  • Объекты определяются классами и имеют методы и переменные
  • Использование thisна переменной экземпляра в методе указывает на то, что переменная экземпляра принадлежит неявного параметра, или что он является переменной экземпляра неявного параметра.
  • Неявный параметр - это объект, из которого вызывается метод в данном случае "audi".
  • Компилятор java автоматически добавляет это зарезервированное слово, добавляя его по своему усмотрению.
  • this нельзя использовать без точки (.) это синтаксически неверно
  • this также может использоваться для различения локальных переменных и глобальных переменных с одинаковыми именами.
  • то thisзарезервированное слово также относится к способам, чтобы указать способ относится к конкретному объекту.
user210021
источник
2

Переменные экземпляра являются общими для каждого создаваемого вами объекта. скажем, есть две переменные экземпляра

class ExpThisKeyWord{
int x;
int y;

public void setMyInstanceValues(int a, int b) {
    x= a;
    y=b;

    System.out.println("x is ="+x);
    System.out.println("y is ="+y);
}

}




class Demo{
public static void main(String[] args){

ExpThisKeyWord obj1 = new ExpThisKeyWord();
ExpThisKeyWord obj2 = new ExpThisKeyWord();
ExpThisKeyWord obj3 = new ExpThisKeyWord();

obj1.setMyInstanceValues(1, 2);
obj2.setMyInstanceValues(11, 22);
obj3.setMyInstanceValues(111, 222);



}
}

если вы заметили код выше, мы инициировали три объекта, и три объекта вызывают метод SetMyInstanceValues. Как вы думаете, как JVM правильно назначает значения для каждого объекта? есть уловка, JVM не увидит этот код, как показано выше. вместо этого он будет видеть следующий код;

public void setMyInstanceValues(int a, int b) {
    this.x= a; //Answer: this keyword denotes the current object that is handled by JVM.
    this.y=b;

    System.out.println("x is ="+x);
    System.out.println("y is ="+y);
}
Гуна Юван
источник
2

(Я знаю, что опаздываю, но шшш, я подлый парень, которого ты никогда не видел)

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

Вне класса, чтобы вызвать что-то в этом экземпляре объекта, например, скажем, у вас есть объект с именем object, и вы хотите получить поле, которое вам нужно будет использовать

object.field

Скажем, например, вы пытаетесь получить доступ к object.field изнутри своего класса, скажем, в вашем конструкторе, например, вы можете использовать

this.field

Это ключевое слово , по существу заменяет имя объекта ключевое слово , когда который вызывается внутри класса. Обычно нет особых причин для этого, если у вас есть две переменные с одинаковым именем, одна из которых является полем класса, а другая - просто переменной внутри метода, это помогает расшифровать между двумя . Например, если у вас есть это: (Ха, понял? Это ? Хе-хе .... только я? Хорошо :( Я уйду)

public String Name;
//Constructor for {object} class
public object(String Name){
    Name = Name;
}

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

public String Name;
//Constructor for {object} class
public object(String Name){
    this.Name = Name;
}

Таким образом, компилятор знает, что переменная Name, которую вы пытаетесь назначить, является частью класса, а не частью метода, и назначает ее правильно, то есть он назначает поле Name тому, что вы помещаете в конструктор.

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

Линкольн Дони
источник
1

Быстрый поиск в Google дал такой результат: http://xahlee.org/java-a-day/this.html

В значительной степени ключевое слово «this» является ссылкой на текущий объект (сам).

Рыба-альбинос
источник
1

это можно использовать внутри некоторого метода или конструктора.

Возвращает ссылку на текущий объект.

Дирадж Джоши
источник
1

Это относится к объекту, в котором вы сейчас находитесь. Другими словами, это относится к принимающему объекту. Вы используете это, чтобы уточнить, о какой переменной вы имеете в виду. Java_whitepaper, страница: 37

class Point extends Object
{
    public double x;
    public double y;

    Point()
    {
        x = 0.0;
        y = 0.0;
    }

    Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }
}

В приведенном выше примере кода this.x / this.y относится к текущему классу, который представляет собой переменные x и y класса Point, где (double x, double y) - это значения типа double, переданные из другого класса для присвоения значений текущему классу.

Мадхава Рао
источник
0

Я тоже искал тот же ответ и почему-то не мог четко понять концепцию. Но наконец я понял это из этого ссылки

это ключевое слово в Java. Что можно использовать внутри метода или конструктора класса. Он (это) работает как ссылка на текущий объект, метод или конструктор которого вызывается. это ключевое слово может использоваться для ссылки на любой член текущего объекта из метода экземпляра или конструктора.

Проверьте примеры по ссылке для четкого понимания

арго
источник
идеальный пример
сатья 06
0

Если переменные экземпляра совпадают с переменными, объявленными в конструкторе, мы используем «this» для присвоения данных.

class Example{
     int assign;// instance variable

     Example(int assign){ // variable inside constructor
          this.assign=assign;
     }
}

Надеюсь это поможет.

Android
источник
0

В Java «this» - это предопределенная переменная. Если мы используем «this» в методе, это означает, что мы получаем ссылку (адрес) на текущий запущенный объект. Для примера.

this.age ---> возраст текущего запущенного объекта.

Нисал Эду
источник
0

Хочу поделиться тем, что я понял из этого ключевого слова. Это ключевое слово имеет 6 применений в java следующим образом: -

1. Его можно использовать для ссылки на текущую переменную класса. Давайте разберемся с кодом. *

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

class Employee{  
int id_no;  
String name;  
float salary;  
Student(int id_no,String name,float salary){  
id_no = id_no;  
name=name;  
salary = salary;  
}  
void display(){System.out.println(id_no +" "+name+" "+ salary);}  
}  
class TestThis1{  
public static void main(String args[]){  
Employee s1=new Employee(111,"ankit",5000f);  
Employee s2=new Employee(112,"sumit",6000f);  
s1.display();  
s2.display();  
}}  

Выход:-

0 null 0.0
0 null 0.0

В приведенном выше примере параметры (формальные аргументы) и переменные экземпляра совпадают. Итак, мы используем это ключевое слово, чтобы различать локальную переменную и переменную экземпляра.

class Employee{  
int id_no;  
String name;  
float salary;  
Student(int id_no,String name,float salary){  
this.id_no = id_no;  
this.name=name;  
this.salary = salary;  
}  
void display(){System.out.println(id_no +" "+name+" "+ salary);}  
}  
class TestThis1{  
public static void main(String args[]){  
Employee s1=new Employee(111,"ankit",5000f);  
Employee s2=new Employee(112,"sumit",6000f);  
s1.display();  
s2.display();  
}} 

выход:

111 ankit 5000
112 sumit 6000

2. Вызвать метод текущего класса.

class A{  
void m(){System.out.println("hello Mandy");}  
void n(){  
System.out.println("hello Natasha");  
//m();//same as this.m()  
this.m();  
}  
}  
class TestThis4{  
public static void main(String args[]){  
A a=new A();  
a.n();  
}}  

Выход:

hello Natasha
hello Mandy

3. вызвать конструктор текущего класса. Он используется для создания цепочки конструкторов.

class A{  
A(){System.out.println("hello ABCD");}  
A(int x){  
this();  
System.out.println(x);  
}  
}  
class TestThis5{  
public static void main(String args[]){  
A a=new A(10);  
}}

Выход:

hello ABCD
10

4. передать как аргумент в метод.

class S2{  
  void m(S2 obj){  
  System.out.println("The method is invoked");  
  }  
  void p(){  
  m(this);  
  }  
  public static void main(String args[]){  
  S2 s1 = new S2();  
  s1.p();  
  }  
}  

Выход:

The method is invoked

5. передать в качестве аргумента при вызове конструктора

class B{  
  A4 obj;  
  B(A4 obj){  
    this.obj=obj;  
  }  
  void display(){  
    System.out.println(obj.data);//using data member of A4 class  
  }  
}  

class A4{  
  int data=10;  
  A4(){  
   B b=new B(this);  
   b.display();  
  }  
  public static void main(String args[]){  
   A4 a=new A4();  
  }  
} 

Выход:-

10

6. вернуть текущий экземпляр класса

class A{  
A getA(){  
return this;  
}  
void msg(){System.out.println("Hello");}  
}  
class Test1{  
public static void main(String args[]){  
new A().getA().msg();  
}  
}  

Выход:-

Hello

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

Гулсан Борбхуия
источник
0

Как все сказали, это представляет текущий объект / текущий экземпляр. Я понимаю это так, если это просто "this" - он возвращает объект класса, например: Dog, если у него есть this.something, something является методом в этом классе или переменной

class Dog {
private String breed;
private String name;

Dog(String breed, String name) {
    this.breed = breed;
    this.name = name;
}

public Dog getDog() {
    // return Dog type
    return this;
}

}

введите описание изображения здесь

user3520544
источник