Jakie jest znaczenie „tego” w Javie?


140

Zwykle używam thistylko w konstruktorach.

Rozumiem, że służy do identyfikacji zmiennej parametru (przy użyciu this.something), jeśli ma taką samą nazwę ze zmienną globalną.

Jednak nie wiem, jakie jest prawdziwe znaczenie thisw Javie i co się stanie, jeśli thisużyję bez kropki ( .).



2
Yakshemash! Więc przyjaciele. Możesz również odnieść się do mojego pytania - stackoverflow.com/questions/23334336/… Chenqui.
Erran Morad

Odpowiedzi:


157

this odnosi się do bieżącego obiektu.

Każda metoda niestatyczna działa w kontekście obiektu. Więc jeśli masz taką klasę:

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

Potem dzwoni frobnicate()na new MyThisTest()wypisze

1
42
MyThisTest a = 42

Tak efektywnie używasz go do wielu rzeczy:

  • wyjaśnij, że mówisz o polu, gdy istnieje również coś innego o takiej samej nazwie jak pole
  • odnoszą się do bieżącego obiektu jako całości
  • wywołaj inne konstruktory bieżącej klasy w twoim konstruktorze

To nie działa. Pojawia się błąd z informacją, że mainmetoda jest wymagana. Jeśli dodam główną metodę, muszę zadzwonić stamtąd. Każda próba wywołania frobnicate () wewnątrz main mówi, że nie można wywołać niestatycznej referencji z wewnątrz statycznej. Usunięcie wartości static z mainzwraca ponownie błąd, że nie znaleziono żadnej metody głównej. Proszę wytłumacz.
dbconfession,

7
@dbconfession: kod tutaj nie jest pomyślany jako samodzielny, samoczynnie działający program. Masz na myśli, aby przeczytać ten kod i tekst, a nie go uruchomić! Jest to prawidłowy kod, ale jest przeznaczony tylko do celów demonstracyjnych (dlatego nie ma odpowiedniego pliku main). Aby uzyskać pomoc dotyczącą głównej metody, zobacz stackoverflow.com/questions/146576/… .
Joachim Sauer

@Joachim Thanks! Brakuje mi czegoś podstawowego na temat tego, co to znaczy uczynić metodę statyczną i jak this.działa. Rozumiem, że this.pozwala na wywołanie metody lub zmiennej, która jest unikalna dla utworzonej wersji klasy, pozwalając na istnienie innej wersji metody lub zmiennej, która jest wywoływana bez wywoływania. this. W prostym wywołaniu Test.classmam dwie metody: public static void main()i public Test() ja nie można przekazać informacji między metodami, ponieważ mainjest statyczny, a konstruktory nie mogą być statyczne. Czy powinienem opublikować nowe pytanie?
dbconfession

@dbconfession: Wydaje mi się, że gdzie indziej odpowiedź na Twoje pytanie została już udzielona, ​​ale nie do końca rozumiem, jakie jest Twoje pytanie, więc równie dobrze możesz je opublikować (ale przygotuj się na zamknięcie jako duplikat). Jednak na najbardziej podstawowym poziomie tworzenie metody staticoznacza w zasadzie, że nie potrzebujesz instancji klasy, aby ją wywołać i nie będziesz mieć dostępu do thisjej wnętrza.
Joachim Sauer

@JoachimSauer Gdybym chciał go uruchomić, jak bym to zrobił? Mam ten sam problem co z dbconfession.
FudgeMuffins

52

Poniżej znajduje się kopia i wklej z tego miejsca , ale bardzo dobrze wyjaśnia różne zastosowania thissłowa kluczowego:

Definicja: Słowo thiskluczowe języka Java jest używane do odwoływania się do bieżącego wystąpienia metody, w której jest używane.

Oto sposoby korzystania z tego:

  1. Aby konkretnie zaznaczyć, że zmienna instancji jest używana zamiast zmiennej statycznej lub lokalnej. To jest,

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

    Tutaj odnosi się to do zmiennej instancji. Tutaj pierwszeństwo jest wysokie dla zmiennej lokalnej. Dlatego brak thisznaku oznacza zmienną lokalną. Jeśli zmienna lokalna będąca nazwą parametru nie jest taka sama jak zmienna instancji, to niezależnie od tego, czy thisjest używana, czy nie, oznacza zmienną instancji.

  2. This służy do odwoływania się do konstruktorów

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

    Powoduje to wywołanie konstruktora tej samej klasy Java, która ma dwa parametry.

  3. This służy do przekazywania bieżącej instancji Java jako parametru

    obj.itIsMe(this);
  4. Podobnie jak powyżej, można to również użyć do zwrócenia bieżącej instancji

    CurrentClassName startMethod() {
         return this;
    }
    

    Uwaga: Może to prowadzić do niepożądanych rezultatów, gdy jest używane w klasach wewnętrznych w powyższych dwóch punktach. Ponieważ będzie to odnosić się do klasy wewnętrznej, a nie do wystąpienia zewnętrznego.

  5. This można użyć do uzyskania uchwytu bieżącej klasy

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

    Chociaż można to zrobić

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

Jak zawsze, thisjest powiązany ze swoją instancją i nie zadziała w metodach statycznych.



18

Odnosi się do bieżącej instancji określonego obiektu, więc możesz napisać coś takiego

public Object getMe() {
    return this;
}

Typowym przypadkiem użycia thisjest zapobieganie zacienianiu. Weźmy następujący przykład:

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

W powyższym przykładzie chcemy przypisać element członkowski pola za pomocą wartości parametru. Ponieważ mają tę samą nazwę, potrzebujemy sposobu, aby odróżnić pole od parametru. thisumożliwia nam dostęp do członków tej instancji, w tym pola.

public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }
}

4
Uważaj, aby użyć odpowiedniego stylu podczas wywoływania go: o.getMe (). GetMe (). OutOfHere ()
Justin K

8

W Swingu dość powszechne jest pisanie klasy, która implementuje ActionListeneri dodaje bieżącą instancję (tj. „This”) jako element ActionListener dla komponentów.

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

W rzeczywistości jest to „odniesienie do obiektu w aktualnym kontekście”. Na przykład, aby wydrukować „ten obiekt”, możesz napisać:

System.out.println(this);

Zwróć uwagę, że użycie „zmiennej globalnej” jest nieco nieprawidłowe ... jeśli używasz, this.variableNameto z definicji nie jest to zmienna globalna - jest to zmienna specyficzna dla tej konkretnej instancji.


7

Cytując artykuł na stronieming.guide:


thisma dwa zastosowania w programie Java.

1. Jako odniesienie do aktualnego obiektu

Składnia w tym przypadku zwykle wygląda mniej więcej tak

this.someVariable = someVariable;

Ten rodzaj zastosowania jest opisany tutaj: Odniesienie „to” (z przykładami)

2. Aby wywołać innego konstruktora

Składnia w tym przypadku zazwyczaj wygląda mniej więcej tak

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

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

Ten typ użycia jest opisany tutaj: to (…) wywołanie konstruktora (z przykładami)


4

Odnosi się do wystąpienia, w którym wywoływana jest metoda

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

To słowo jest używane w odniesieniu do aktualnej zmiennej bloku, na przykład rozważyć poniżej kod (choć exampple, więc nie należy się spodziewać standardowego kodu 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();
 }
}

Otóż ​​to. na wyjściu będzie „2”. Jeśli nie użyliśmy słowa kluczowego this , wynik będzie następujący: 0


3

Obiekty mają metody i atrybuty (zmienne), które wywodzą się z klas, w celu określenia, które metody i zmienne należą do danego obiektu, thisużywane jest słowo zastrzeżone. w przypadku zmiennych instancji ważne jest zrozumienie różnicy między parametrami niejawnymi i jawnymi. Spójrz na fillTankwezwanie do audiobiektu.

Car audi= new Car();

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

Wartość w nawiasach jest niejawnym parametrem, a sam obiekt jest jawnym parametrem, metody, które nie mają jawnych parametrów, używają niejawnych parametrów, fillTankmetoda ma zarówno jawny, jak i niejawny parametr.

Przyjrzyjmy się bliżej fillTankmetodzie w Carklasie

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

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

}

W tej klasie mamy zmienną instancji „tank”. Może istnieć wiele obiektów, które używają zmiennej instancji zbiornika, aby określić, że zmienna instancji „tank” jest używana dla konkretnego obiektu, w naszym przypadku wcześniej zbudowanego obiektu „audi” używamy thissłowa kluczowego zastrzeżonego. na przykład zmienne użycie „this” w metodzie wskazuje, że zmienna instancji, w naszym przypadku „zbiornik”, jest zmienną instancji parametru niejawnego.

Kompilator java automatycznie dodaje thiszarezerwowane słowo, więc nie musisz go dodawać, to kwestia preferencji. Nie możesz używać thisbez kropki (.), Ponieważ takie są zasady java (składnia).

W podsumowaniu.

  • Obiekty są definiowane przez klasy i mają metody i zmienne
  • Zastosowanie thisna zmiennej przykład w sposób oznacza, że zmienna przykład należą do parametru utajonego, albo że jest to przykład zmiennego parametru utajonego.
  • Niejawnym parametrem jest obiekt, z którego wywoływana jest metoda, w tym przypadku „audi”.
  • Kompilator java automatycznie dodaje to zarezerwowane słowo, dodając to jest kwestią preferencji
  • this nie można używać bez kropki (.), jest to niepoprawne składniowo
  • this można także użyć do rozróżnienia między zmiennymi lokalnymi a zmiennymi globalnymi, które mają taką samą nazwę
  • thissłowo rezerwa odnosi się także do metod, aby wskazać metodę należy do danego obiektu.

2

Zmienne instancji są wspólne dla każdego tworzonego obiektu. powiedzmy, że istnieją dwie zmienne instancji

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



}
}

jeśli zauważyłeś powyższy kod, zainicjowaliśmy trzy obiekty i trzy obiekty wywołują metodę SetMyInstanceValues. Jak myślisz, w jaki sposób maszyna JVM poprawnie przypisuje wartości do każdego obiektu? jest sztuczka, JVM nie zobaczy tego kodu, jak pokazano powyżej. zamiast tego będzie wyglądał jak poniższy kod;

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

(Wiem, że jestem spóźniony, ale cii, jestem podstępnym boi, którego nigdy mnie nie widziałeś)

To słowo kluczowe w większości języków programowania obiektowego Oriented jeśli nie wszystkie środki, które jego odniesienie do bieżącej instancji obiektu tej klasy. Zasadniczo jest to to samo, co wywołanie tego obiektu spoza metody według nazwy. To prawdopodobnie nie miało sensu, więc będę się rozwijał:

Poza klasą, aby wywołać coś w tej instancji obiektu, na przykład powiedz, że masz obiekt o nazwie object i chcesz uzyskać pole, którego musisz użyć

object.field

Załóżmy na przykład, że próbujesz uzyskać dostęp do obiektu object.field z wnętrza swojej klasy, na przykład konstruktora, którego możesz użyć

this.field

To słowo kluczowe w istocie zastępuje słowa kluczowego nazwa obiektu przy nazwie jest wewnątrz klasy. Zwykle nie ma powodu, aby to robić poza dwoma zmiennymi o tej samej nazwie, z których jedna jest polem klasy, a druga jest zmienną wewnątrz metody, pomaga to rozszyfrować między nimi . Na przykład, jeśli masz to: (Hah, rozumiesz? To ? Hehe .... tylko ja? Ok :( Teraz wyjdę)

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

Spowodowałoby to pewne problemy, kompilator nie byłby w stanie poznać różnicy między zmienną Name zdefiniowaną w parametrach konstruktora a zmienną Name wewnątrz deklaracji pól klasy, więc zamiast tego przypisałby parametr Name do ... .. wartość parametru Name, który nie daje nic pożytecznego i dosłownie nie ma celu. Jest to powszechny problem, który występuje w większości nowszych programów, a ja też byłem ofiarą. W każdym razie poprawnym sposobem zdefiniowania tego parametru byłoby użycie:

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

W ten sposób kompilator wie, że zmienna Name, którą próbujesz przypisać, jest częścią klasy, a nie częścią metody, i przypisuje ją poprawnie, co oznacza, że ​​przypisuje pole Name do wszystkiego, co umieścisz w konstruktorze.

Podsumowując, zasadniczo odwołuje się do pola instancji obiektu klasy, nad którą pracujesz, stąd jest to słowo kluczowe „this”, co oznacza, że ​​jest to ten obiekt lub ta instancja. Dobrą praktyką jest używanie tego podczas wywoływania pola swojej klasy, a nie tylko używanie nazwy, aby uniknąć możliwych błędów, które są trudne do znalezienia, ponieważ kompilator działa bezpośrednio nad nimi.




1

może to być użyte wewnątrz jakiejś metody lub konstruktora.

Zwraca odniesienie do bieżącego obiektu.


1

Odnosi się to do obiektu, w którym jesteś teraz. Innymi słowy, odnosi się to do obiektu odbierającego. Używasz tego, aby wyjaśnić, do której zmiennej się odnosisz. Strona 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;
    }
}

W powyższym przykładzie kod this.x / this.y odnosi się do bieżącej klasy, czyli zmiennych klasy Point x i y, gdzie (podwójne x, podwójne y) to podwójne wartości przekazywane z różnych klas w celu przypisania wartości do bieżącej klasy.


0

Szukałem też tej samej odpowiedzi i jakoś nie mogłem jasno zrozumieć koncepcji. Ale w końcu zrozumiałem to z tego linku

to jest słowo kluczowe w Javie. Które mogą być użyte wewnątrz metody lub konstruktora klasy. Działa jako odniesienie do bieżącego obiektu, którego metoda lub konstruktor jest wywoływana. to słowo kluczowe może służyć do odwoływania się do dowolnego elementu członkowskiego bieżącego obiektu z poziomu metody instancji lub konstruktora.

Sprawdź przykłady w linku, aby uzyskać jasne zrozumienie


doskonały przykład
sathya

0

Jeśli zmienne instancji są takie same, jak zmienne zadeklarowane w konstruktorze, używamy „this” do przypisywania danych.

class Example{
     int assign;// instance variable

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

Mam nadzieję że to pomoże.


0

W Javie „this” jest predefiniowaną zmienną. Jeśli użyjemy „this” w metodzie, oznacza to, że pobieramy referencję (adres) aktualnie działającego obiektu. Dla przykładu.

this.age ---> wiek aktualnie działającego obiektu.


0

Chciałbym podzielić się tym, co zrozumiałem z tego słowa kluczowego. To słowo kluczowe ma 6 zastosowań w Javie w następujący sposób: -

1. Może służyć do odwoływania się do bieżącej zmiennej klasy. Pozwól nam zrozumieć za pomocą kodu. *

Zrozummy problem, jeśli nie użyjemy tego słowa kluczowego na przykładzie podanym poniżej:

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

Wynik:-

0 null 0.0
0 null 0.0

W powyższym przykładzie parametry (argumenty formalne) i zmienne instancji są takie same. Tak więc używamy tego słowa kluczowego do rozróżnienia zmiennej lokalnej i zmiennej instancji.

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

wynik:

111 ankit 5000
112 sumit 6000

2. Aby wywołać bieżącą metodę klasy.

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

Wynik:

hello Natasha
hello Mandy

3. wywołać konstruktor bieżącej klasy. Służy do tworzenia łańcuchów konstruktorów.

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

Wynik:

hello ABCD
10

4. przekazać jako argument w metodzie.

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

Wynik:

The method is invoked

5. przekazać jako argument w wywołaniu konstruktora

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

Wynik:-

10

6. aby zwrócić bieżącą instancję klasy

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

Wynik:-

Hello

Ponadto tego słowa kluczowego nie można używać bez. (Kropka), ponieważ jego składnia jest nieprawidłowa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.