Яке значення "цього" на Java?


140

Зазвичай я використовую thisлише конструктори.

Я розумію, що він використовується для ідентифікації змінної параметра (за допомогою використання this.something), якщо вона має те саме ім'я з глобальною змінною.

Однак я не знаю, що справжнє значення thisполягає в Java і що буде, якщо я буду використовувати thisбез крапки ( .).



2
Якшемаш! Так друзі. Ви можете послатися на моє запитання тут , а також - stackoverflow.com/questions/23334336 / ... Chenqui.
Ерран Морад

Відповіді:


157

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повертає помилку знову, що не знайдено основного методу. Будь ласка, поясніть.
dbconfession

7
@dbconfession: код тут не мається на увазі як окрема самостійна програма. Ви призначені для читання на код і текст, а не запускати його! Це дійсний код, але він призначений лише для демонстраційних цілей (тому він не має належного основного). За допомогою основного методу, будь ласка , см stackoverflow.com/questions/146576 / ... .
Іоахім Зауер

@Joachim Дякую! Мені не вистачає чогось принципового про те, що означає зробити метод статичним і як this.працює. Я розумію, що this.дозволяє викликати метод або змінну, яка є унікальною для інстанційованої версії класу, дозволяючи існувати іншу версію методу чи змінної, яка викликається без виклику. this. У простому, що називається, у Test.classмене є два методи: public static void main()і public Test() я не може передавати інформацію між методами, тому що mainє статичним і конструктори не можуть бути статичними. Чи слід публікувати як нове запитання?
dbconfession

@dbconfession: Я відчуваю, що на ваше питання вже відповіли в іншому місці, але я не дуже розумію, що саме є вашим питанням, тому ви можете також опублікувати його (але будьте готові закрити його як дублікат). Однак, на самому фундаментальному рівні, створення методу в staticосновному означає, що вам не потрібен екземпляр класу, щоб викликати його і що у вас не буде доступу до thisнього.
Йоахім Зауер

@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пов'язаний з його екземпляром, і це не буде працювати в статичних методах.


44

Щоб бути повною, thisтакож можна використовувати для позначення зовнішнього об'єкта

class Outer {
    class Inner {
        void foo() {
            Outer o = Outer.this;
    }
  }
}

5
thisце те, що я шукав! ;)
forresthopkinsa

3
Ось тількиsuper
вбийте

18

Він посилається на поточний екземпляр певного об'єкта, тому ви можете написати щось подібне

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 ()
Justin K

8

У Swing досить поширене написання класу, який реалізує ActionListenerта додає поточний екземпляр (тобто "цей") як 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!");
    }

}

7

Це ефективно "посилання на об'єкт у поточному контексті". Наприклад, щоб роздрукувати "цей об'єкт", ви можете написати:

System.out.println(this);

Зауважте, що ваше використання "глобальної змінної" дещо вимкнено ... якщо ви використовуєте this.variableNameто за визначенням, це не глобальна змінна - це змінна, специфічна для цього конкретного примірника.


7

Цитування статті в програмі.guide:


thisмає дві програми в програмі Java.

1. В якості посилання на поточний об'єкт

Синтаксис у цьому випадку зазвичай виглядає приблизно так

this.someVariable = someVariable;

Такий тип використання описаний тут: Посилання "це" (із прикладами)

2. Викликати іншого конструктора

Синтаксис у цьому випадку зазвичай виглядає приблизно так

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

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

Тут описаний такий тип використання: цей (…) виклик конструктора (із прикладами)


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". Якщо ми не використали це ключове слово, то вихід буде: 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зарезервоване ключове слово. наприклад, для змінних, наприклад, використання цього параметра в методі вказує на те, що змінна екземпляра, в нашому випадку "резервуар", є змінною екземпляра неявного параметра.

Компілятор java автоматично додає thisзарезервоване слово, тому вам не доведеться додавати його, це питання переваги. Не можна використовувати thisбез крапки (.), Оскільки це правила java (синтаксис).

Підводячи підсумок

  • Об'єкти визначаються класами і мають методи та змінні
  • Використання thisна змінної примірника в методі вказує на те, що змінна екземпляра належить неявного параметра, або що він є змінною екземпляра неявного параметра.
  • Неявний параметр є об'єктом, з якого в цьому випадку викликається метод "audi".
  • Компілятор java автоматично додає це зарезервоване слово, додавши, що це питання переваги
  • this не можна використовувати без крапки (.), це синтаксично недійсно
  • this також можна використовувати для розмежування локальних змінних та глобальних змінних, що мають однакову назву
  • thisзарезервоване слово також відноситься до способів, щоб вказати спосіб відноситься до конкретного об'єкта.

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.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, яку ви намагаєтеся призначити, є частиною класу, а не частиною методу, і призначає її правильно, тобто означає, що вона призначає поле Ім'я тому, що ви вкладаєте в конструктор.

Підсумовуючи це, воно по суті посилається на поле об'єктного примірника класу, над яким ви працюєте, отже, це ключове слово "цей", що означає його цей об'єкт або цей екземпляр. Це хороша практика використовувати це під час виклику поля вашого класу, а не просто використовувати ім'я, щоб уникнути можливих помилок, які важко знайти, оскільки компілятор працює над ними.




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 посилається на поточний клас, який є змінними Point class x та y, де (double x, double y) - подвійні значення, передані від іншого класу для присвоєння значень поточному класу.


0

Я також шукав ту саму відповідь, і якось не міг зрозуміти поняття чітко. Але нарешті я зрозумів це за цим посиланням

це ключове слово на Java. Який може бути використаний всередині методу чи конструктора класу. Це (це) працює як посилання на поточний об'єкт, метод чи конструктор якого викликається. це ключове слово можна використовувати для посилання будь-якого члена поточного об'єкта з методу екземпляра або конструктора.

Перевірте приклади за посиланням для чіткого розуміння


ідеальний приклад
сатья

0

Якщо змінні екземпляра такі самі, як змінні, задекларовані в конструкторі, тоді ми використовуємо "це" для призначення даних.

class Example{
     int assign;// instance variable

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

Сподіваюся, це допомагає.


0

У Java "це" є заздалегідь визначеною змінною. Якщо ми використовуємо "це" в методі, це означає, що ми отримуємо посилання (адресу) поточно запущеного об'єкта. Для прикладу.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.