Qual è il significato di "questo" in Java?


140

Normalmente, uso thissolo nei costruttori.

Comprendo che viene utilizzato per identificare la variabile del parametro (utilizzando this.something), se ha lo stesso nome con una variabile globale.

Tuttavia, non so che il vero significato di thissia in Java e cosa accadrà se uso thissenza punto ( .).



2
Yakshemash! Così amici. Potresti voler fare riferimento anche alla mia domanda qui : stackoverflow.com/questions/23334336/… Chenqui.
Erran Morad,

Risposte:


157

this si riferisce all'oggetto corrente.

Ogni metodo non statico viene eseguito nel contesto di un oggetto. Quindi se hai una lezione come questa:

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

Quindi chiamando frobnicate()il new MyThisTest()stamperà

1
42
MyThisTest a = 42

Così efficacemente lo usi per più cose:

  • chiarisci che stai parlando di un campo, quando c'è anche qualcos'altro con lo stesso nome di un campo
  • si riferisce all'oggetto corrente nel suo insieme
  • invoca altri costruttori della classe corrente nel tuo costruttore

Questo non funziona. mainViene visualizzato un errore che dice che è richiesto un metodo. Se aggiungo il metodo principale, devo chiamare da lì. E qualsiasi tentativo di chiamare frobnicate () all'interno di main dice che non è possibile chiamare un riferimento non statico dall'interno di uno statico. E la rimozione di static da mainrestituisce nuovamente l'errore che non è stato trovato alcun metodo principale. Spiega per favore.
dbconfession,

7
@dbconfession: il codice qui non è inteso come un programma autonomo autonomo. Dovresti leggere il codice e il testo, non eseguirlo! È un codice valido, ma è destinato solo a scopo dimostrativo (ecco perché non ha un main adeguato). Per assistenza con il metodo principale, consultare stackoverflow.com/questions/146576/… .
Joachim Sauer,

@Joachim Grazie! Mi manca qualcosa di fondamentale su ciò che significa rendere statico un metodo e su come this.funziona. La mia comprensione è che this.consente di chiamare un metodo o una variabile che è unico per la versione istanziato della classe, consentendo ad un'altra versione del metodo o variabile di esistere che si chiama senza invocare this. In un semplice chiamato Test.classho due metodi: public static void main()e public Test() io impossibile passare informazioni tra i metodi perché mainè statico e i costruttori non possono essere resi statici. Devo pubblicare una nuova domanda?
dbconfession,

@dbconfession: ho la sensazione che la tua domanda abbia già risposto altrove, ma non capisco esattamente quale sia esattamente la tua domanda, quindi potresti anche pubblicarla (ma essere pronta a chiuderla come duplicato). Tuttavia, a livello fondamentale, creare un metodo staticsignifica fondamentalmente che non è necessaria un'istanza della classe per chiamarla e che non si avrà accesso al suo thisinterno.
Joachim Sauer,

@JoachimSauer Se volessi eseguirlo, come farei? Ho lo stesso problema di dbconfession.
FudgeMuffins,

52

Di seguito è una copia e incolla da qui , ma spiega molto bene tutti i diversi usi della thisparola chiave:

Definizione: la thisparola chiave Java viene utilizzata per fare riferimento all'istanza corrente del metodo su cui viene utilizzata.

Di seguito sono riportati i modi per utilizzare questo:

  1. Indicare specificamente che viene utilizzata la variabile di istanza anziché la variabile statica o locale. Questo è,

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

    Qui si riferisce alla variabile di istanza. Qui la precedenza è alta per la variabile locale. Pertanto l'assenza del thisindica la variabile locale. Se la variabile locale che è il nome del parametro non è uguale alla variabile di istanza, indipendentemente dal fatto che thissia utilizzata o meno, indica la variabile di istanza.

  2. This viene utilizzato per fare riferimento ai costruttori

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

    Questo invoca il costruttore della stessa classe java che ha due parametri.

  3. This viene utilizzato per passare l'istanza java corrente come parametro

    obj.itIsMe(this);
  4. Simile al precedente, questo può anche essere usato per restituire l'istanza corrente

    CurrentClassName startMethod() {
         return this;
    }
    

    Nota: ciò può portare a risultati indesiderati se utilizzato nelle classi interne nei due punti precedenti. Dal momento che questo farà riferimento alla classe interna e non all'istanza esterna.

  5. This può essere utilizzato per ottenere l'handle della classe corrente

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

    Anche se questo può essere fatto da

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

Come sempre, thisè associato alla sua istanza e questo non funzionerà con metodi statici.


44

Per essere completo, thispuò anche essere usato per riferirsi all'oggetto esterno

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

5
thisè quello che stavo cercando! ;)
forresthopkinsa,

3
Questo è solosuper
killjoy

18

Si riferisce all'istanza corrente di un oggetto particolare, quindi potresti scrivere qualcosa del genere

public Object getMe() {
    return this;
}

Un caso d'uso comune thisè quello di prevenire l'ombreggiamento. Prendi il seguente esempio:

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

Nell'esempio sopra, vogliamo assegnare il membro del campo usando il valore del parametro. Poiché condividono lo stesso nome, abbiamo bisogno di un modo per distinguere tra il campo e il parametro. thisci consente di accedere ai membri di questa istanza, incluso il campo.

public class Person {
    private final String name;

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

4
Fai attenzione a usare lo stile corretto quando lo chiami: o.getMe (). GetMe (). OutOfHere ()
Justin K,

8

In Swing è abbastanza comune scrivere una classe che implementa ActionListenere aggiunge l'istanza corrente (cioè 'this') come ActionListener per i componenti.

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

È "un riferimento all'oggetto nel contesto attuale" in modo efficace. Ad esempio, per stampare "questo oggetto" potresti scrivere:

System.out.println(this);

Nota che il tuo uso di "variabile globale" è in qualche modo spento ... se lo stai usando, this.variableNameper definizione non è una variabile globale - è una variabile specifica per questa particolare istanza.


7

Citando un articolo su Programming.guide:


thisha due usi in un programma Java.

1. Come riferimento all'oggetto corrente

La sintassi in questo caso di solito sembra qualcosa di simile

this.someVariable = someVariable;

Questo tipo di utilizzo è descritto qui: il riferimento 'this' (con esempi)

2. Per chiamare un costruttore diverso

La sintassi in questo caso in genere sembra qualcosa del genere

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

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

Questo tipo di utilizzo è descritto qui: questa (...) chiamata del costruttore (con esempi)


4

Si riferisce all'istanza su cui viene chiamato il metodo

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

Il questa parola chiave viene utilizzata per indicare la variabile corrente di un blocco, ad esempio considerare la sottostante Codice (Solo un exampple, quindi non aspettatevi il codice Java standard):

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

Questo è tutto. l'uscita sarà "2". Se non abbiamo usato questa parola chiave, l'output sarà: 0


3

Gli oggetti hanno metodi e attributi (variabili) derivati ​​dalle classi, al fine di specificare quali metodi e variabili appartengono a un oggetto particolare thische viene utilizzata la parola riservata. nel caso delle variabili di istanza, è importante comprendere la differenza tra parametri impliciti ed espliciti. Dai un'occhiata alla fillTankchiamata per l' audioggetto.

Car audi= new Car();

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

Il valore tra parentesi è il parametro implicito e l'oggetto stesso è il parametro esplicito, i metodi che non hanno parametri espliciti, usano parametri impliciti, il fillTankmetodo ha sia un parametro esplicito che un parametro implicito.

Diamo un'occhiata più da vicino al fillTankmetodo nella Carclasse

public class Car()
{
   private double tank;

   public Car()
   {
      tank = 0;
   }

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

}

In questa classe abbiamo una variabile di istanza "tank". Potrebbero esserci molti oggetti che utilizzano la variabile di istanza del serbatoio, al fine di specificare che la variabile di istanza "serbatoio" viene utilizzata per un oggetto particolare, nel nostro caso l'oggetto "audi" che abbiamo costruito in precedenza, utilizziamo la thisparola chiave riservata. per esempio, le variabili l'uso di 'this' in un metodo indica che la variabile di istanza, nel nostro caso "tank", è una variabile di istanza del parametro implicito.

Il compilatore java aggiunge automaticamente la thisparola riservata in modo da non doverla aggiungere, è una questione di preferenza. Non puoi usare thissenza un punto (.) Perché quelle sono le regole di java (la sintassi).

In sintesi.

  • Gli oggetti sono definiti da classi e hanno metodi e variabili
  • L'uso di thisuna variabile di istanza in un metodo indica che la variabile di istanza appartiene al parametro implicito o che è una variabile di istanza del parametro implicito.
  • Il parametro implicito è l'oggetto da cui viene chiamato il metodo in questo caso "audi".
  • Il compilatore java aggiunge automaticamente questa parola riservata, aggiungendola è una questione di preferenza
  • this non può essere utilizzato senza un punto (.) non è sintatticamente valido
  • this può anche essere usato per distinguere tra variabili locali e variabili globali che hanno lo stesso nome
  • la thisparola di riserva si applica anche ai metodi, per indicare che un metodo appartiene a un oggetto particolare.

2

Le variabili di istanza sono comuni a ogni oggetto che si sta creando. diciamo, ci sono due variabili di istanza

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



}
}

se hai notato sopra il codice, abbiamo avviato tre oggetti e tre oggetti stanno chiamando il metodo SetMyInstanceValues. Come pensi che JVM assegni correttamente i valori per ogni oggetto? c'è il trucco, JVM non vedrà questo codice come è mostrato sopra. invece, vedrà come sotto il codice;

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

(So ​​che sono in ritardo, ma shh sono il subdolo boi che non mi hai mai visto)

Il questo parola chiave nella maggior parte dei linguaggi di programmazione Object Oriented, se non tutti i mezzi che il suo un riferimento verso l'attuale istanza dell'oggetto di tale classe. È essenzialmente la stessa cosa che chiamare quell'oggetto dall'esterno del metodo per nome. Questo probabilmente non aveva senso, così elaborato:

Al di fuori della classe, per chiamare qualcosa all'interno di quell'istanza dell'oggetto, ad esempio dire che hai un oggetto chiamato oggetto e vuoi ottenere un campo che dovresti usare

object.field

Supponiamo ad esempio che stai tentando di accedere a object.field dall'interno della tua classe, ad esempio il tuo costruttore, che potresti usare

this.field

Il questa parola chiave sostituisce essenzialmente la parola nome dell'oggetto quando viene chiamato all'interno della classe. Di solito non c'è molto motivo per farlo al di fuori di se hai due variabili con lo stesso nome, una delle quali è un campo della classe e l'altra è solo una variabile all'interno di un metodo, aiuta a decifrare tra le due . Per esempio se hai questo: (Hah, capito? Questo ? Hehe .... solo io? Okay :( Lascerò ora)

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

Ciò causerebbe alcuni problemi, il compilatore non sarebbe in grado di conoscere la differenza tra la variabile Name definita nei parametri per il costruttore e la variabile Name all'interno delle dichiarazioni di campo della propria classe, quindi assegnerebbe invece il parametro Name a .. .. il valore del parametro Name che non fa nulla di benefico e letteralmente non ha scopo. Questo è un problema comune che fa la maggior parte dei programmi più recenti e anch'io ne sono stato vittima. Ad ogni modo, il modo corretto di definire questo parametro sarebbe usare:

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

In questo modo, il compilatore sa che la variabile Name che stai tentando di assegnare è una parte della classe e non una parte del metodo e la assegna correttamente, il che significa che assegna il campo Name a qualunque cosa tu abbia inserito nel costruttore.

Per riassumere, fa essenzialmente riferimento a un campo dell'istanza dell'oggetto della classe su cui stai lavorando, quindi è la parola chiave "this", che significa che è questo oggetto o questa istanza. È una buona pratica usarlo quando si chiama un campo della propria classe piuttosto che usare semplicemente il nome per evitare possibili bug che sono difficili da trovare mentre il compilatore scorre proprio su di essi.




1

questo può essere usato all'interno di qualche metodo o costruttore.

Restituisce il riferimento all'oggetto corrente.


1

Questo si riferisce all'oggetto in cui ti trovi in ​​questo momento. In altre parole, questo si riferisce all'oggetto ricevente. Lo usi per chiarire a quale variabile ti riferisci. Pagina 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;
    }
}

Nel codice di esempio sopra this.x / this.y si riferisce alla classe corrente che è la classe Point variabili xey in cui (double x, double y) sono valori doppi passati da una classe diversa per assegnare valori alla classe corrente.


0

Stavo anche cercando la stessa risposta e in qualche modo non riuscivo a capire chiaramente il concetto. Ma finalmente l'ho capito da questo link

questa è una parola chiave in Java. Quale può essere utilizzato all'interno del metodo o del costruttore della classe. Funziona come un riferimento a un oggetto corrente il cui metodo o costruttore viene invocato. questa parola chiave può essere utilizzata per fare riferimento a qualsiasi membro dell'oggetto corrente all'interno di un metodo di istanza o di un costruttore.

Controlla gli esempi nel link per una chiara comprensione


esempio perfetto
sathya,

0

Se le variabili di istanza sono uguali alle variabili dichiarate nel costruttore, utilizziamo "this" per assegnare i dati.

class Example{
     int assign;// instance variable

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

Spero che questo ti aiuti.


0

In Java "questo" è una variabile predefinita. Se usiamo "questo" nel metodo, ciò significa che stiamo ottenendo il riferimento (indirizzo) dell'oggetto attualmente in esecuzione. Per un esempio

this.age ---> age dell'oggetto attualmente in esecuzione.


0

Vorrei condividere ciò che ho capito da questa parola chiave. Questa parola chiave ha 6 usi in java come segue: -

1. Può essere utilizzato per fare riferimento alla variabile di classe corrente. Cerchiamo di capire con un codice. *

Comprendiamo il problema se non utilizziamo questa parola chiave nell'esempio riportato di seguito:

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

Produzione:-

0 null 0.0
0 null 0.0

Nell'esempio sopra, i parametri (argomenti formali) e le variabili di istanza sono uguali. Quindi, stiamo usando questa parola chiave per distinguere la variabile locale e la variabile di istanza.

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

produzione:

111 ankit 5000
112 sumit 6000

2. Richiamare il metodo di classe corrente.

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

Produzione:

hello Natasha
hello Mandy

3. per invocare l'attuale costruttore di classi. Viene utilizzato per concatenare il costruttore.

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

Produzione:

hello ABCD
10

4. passare come argomento nel metodo.

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

Produzione:

The method is invoked

5. passare come argomento nella chiamata del costruttore

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

Produzione:-

10

6. per restituire l'istanza di classe corrente

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

Produzione:-

Hello

Inoltre, questa parola chiave non può essere utilizzata senza. (Punto) poiché la sua sintassi non è valida.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.