2010-09-16 13 views
96

Normalmente, uso this solo en constructores.¿Cuál es el significado de "esto" en Java?

Entiendo que se usa para identificar la variable del parámetro (usando this.something), si tiene el mismo nombre con una variable global.

Sin embargo, no sé cuál es el significado real de this en Java y qué pasará si uso this sin punto (.).

+6

Para quienes responden: http://meta.stackexchange.com/questions/15775/do-you-delete-your-own-owner-when-its-a-duplicate – BalusC

+1

Yakshemash! Tan amigos. También puede consultar mi pregunta aquí: https://stackoverflow.com/questions/23334336/this-in-java-exception-in-thread-main-java-lang-stackoverflowerror Chenqui. –

Respuesta

12

Se refiere a la instancia actual de un objeto particular, por lo que podría escribir algo como

public Object getMe() { 
    return this; 
} 
+4

Tenga cuidado de utilizar el estilo adecuado al llamarlo: o.getMe(). GetMe(). OutOfHere() –

3

Se trata de "una referencia al objeto en el contexto actual" de manera efectiva. Por ejemplo, para imprimir "este objeto" se podría escribir:

System.out.println(this); 

Tenga en cuenta que el uso de "variable global" es algo fuera ... si estás usando this.variableName entonces por definición de no una variable global: es una variable específica de esta instancia particular.

2

esto puede ser usado dentro de algún método o constructor.

Devuelve la referencia al objeto actual.

4

Se refiere a la instancia en la que se llama al método

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 
133

this se refiere al objeto actual.

Cada método no estático se ejecuta en el contexto de un objeto. Así que si usted tiene una clase como esta:

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

Entonces llamando frobnicate() en new MyThisTest() imprimirá

 
1 
42 
MyThisTest a=42 

de manera efectiva que lo utilizan para múltiples cosas:

  • aclarar que se está hablando sobre un campo, cuando también hay algo más con el mismo nombre que un campo
  • consulte el obj actual ect en su conjunto
  • invocar otros constructores de la clase actual en su constructor
+0

Esto no está funcionando. Me sale un error al decir que se requiere un método 'main'. Si agrego el método principal, entonces tengo que llamar desde allí. Y cualquier intento de llamar a frobnicate() dentro de main dice que no se puede llamar a una referencia no estática desde dentro de una estática. Y eliminar estática de 'main' devuelve el error de nuevo de que no se encontró ningún método principal. Por favor explique. – dbconfession

+4

@dbconfession: el código aquí no se entiende como un programa autónomo y autoejecutable. Debes * leer * el * código * ** y ** el texto, ¡no ejecutarlo! Es un código válido, pero solo tiene fines de demostración (es por eso que no tiene un main apropiado). Para obtener ayuda con el método principal, consulte http://stackoverflow.com/questions/146576/why-is-the-java-main-method-static. –

+0

@Joachim ¡Gracias! Me falta algo fundamental sobre lo que significa hacer que un método sea estático y cómo funciona esto. Mi comprensión es que 'this' le permite llamar a un método o variable que es único para la versión instanciada de la clase, lo que permite que exista otra versión del método o variable que se invoca sin invocar' this'. En un simple llamado 'Test.class' tengo dos métodos:' public static void main() 'y' public Test() 'No puedo pasar información entre los métodos porque' main' es estático y los constructores no pueden estar estáticos. ¿Debo publicar como una nueva pregunta? – dbconfession

7

en el columpio está bastante común escribir una clase que implementa ActionListener y añadir la instancia actual (es decir, 'esto') como un ActionListener para componentes.

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

} 
47

La siguiente es una copia & pasta de here, pero explica muy bien todos los usos diferentes de la this palabra clave:

Definición: this palabra clave de Java se utiliza para hacer referencia la instancia actual del método de cual es usado

Los siguientes son los maneras de utilizar esta:

  1. para denotar específicamente que la variable de instancia se utiliza en lugar de la variable estática o local. Es decir,

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

    Aquí se hace referencia a la variable de instancia. Aquí la prioridad es alta para la variable local. Por lo tanto, la ausencia del this denota la variable local. Si la variable local que es el nombre del parámetro no es la misma que la variable de instancia, independientemente de this se usa o no, denota la variable de instancia.

  2. This se usa para referirse a los constructores

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

    Esto invoca el constructor de la misma clase java que tiene dos parámetros.

  3. This se utiliza para pasar la instancia java actual como parámetro

    obj.itIsMe(this); 
    
  4. similar a la anterior que esto también puede ser utilizado para devolver la instancia actual

    CurrentClassName startMethod() { 
        return this; 
    } 
    

    Nota: Esto puede conducir a resultados no deseados mientras se usa en clases internas en los dos puntos anteriores. Dado que esto se referirá a la clase interna y no a la instancia externa.

  5. This se puede utilizar para obtener el identificador de la clase actual

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

    Aunque esto se puede hacer por

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

Como siempre, this se asocia con su instancia y esto no funcionará en métodos estáticos.

+2

Ojalá pudiera votar 10 veces, especialmente para el 1er y 5to punto. Estuve luchando por comprender el significado de "esto" durante casi una hora hasta que encontré esto. ¡Simplemente exquisito! –

6

Si llama a myObject.method(), entonces this se referirá a myObject dentro de method.

35

Para ser completo, this también puede usarse para referirse al objeto exterior

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

'this' es lo que estaba buscando! ;) – forresthopkinsa

3

Los objetos tienen métodos y atributos (variables) que se derivan de las clases, con el fin de especificar qué métodos y variables pertenecen a un objeto particular se usa la palabra reservada this.en el caso de las variables de instancia, es importante entender la diferencia entre los parámetros implícitos y explícitos. Eche un vistazo a la llamada fillTank para el objeto audi.

Car audi= new Car(); 

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

El valor en el paréntesis es el parámetro implícito y el objeto en sí es el parámetro explícito, los métodos que no tienen parámetros explícitos, utilizan parámetros implícitos, el método fillTank tiene tanto un explícito y un parámetro implícito.

permite echar un vistazo más de cerca el método fillTank en la clase

public class Car() 
{ 
    private double tank; 

    public Car() 
    { 
     tank = 0; 
    } 

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

} 

Car En esta clase tenemos una variable de instancia "tanque". Podría haber muchos objetos que usan la variable de instancia del tanque, para especificar que la variable de instancia "tanque" se usa para un objeto particular, en nuestro caso el objeto "audi" que construimos anteriormente, usamos la palabra reservada this reservada. para variables de instancia el uso de 'esto' en un método indica que la variable de instancia, en nuestro caso "tanque", es una variable de instancia del parámetro implícito.

El compilador de Java agrega automáticamente la palabra reservada this para que no tenga que agregarla, es una cuestión de preferencia. No puede usar this sin un punto (.) Porque esas son las reglas de java (la sintaxis).

En resumen.

  • objetos se definen por clases y tienen métodos y variables
  • El uso de this en una instancia de variable en un métodoindica que, la variable de instancia pertenece al parámetro implícito, o que es una variable de instancia del parámetro implícito.
  • El parámetro implícito es el objeto desde el que se llama al método en este caso "audi".
  • El compilador Java añade automáticamente la palabra reservada, y agregó que es una cuestión de preferencia
  • this no se pueden utilizar sin un punto (.) Esto es sintácticamente inválida
  • this también se puede utilizar para distinguir entre las variables locales y las variables globales que tienen el mismo nombre
  • la palabra de reserva this también se aplica a los métodos, para indicar que un método pertenece a un objeto en particular.
2

El este palabra clave se utiliza para hacer referencia la variable actual de un bloque, por ejemplo, tener en cuenta el código de abajo (Sólo un exampple, así que no esperes el código Java estándar):

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

Eso es eso. la Salida será "2". Si no usamos la palabra clave este, entonces la salida será: 0

0

Yo también estaba buscando la misma respuesta, y de alguna manera no podía entender claramente el concepto.Pero finalmente lo entendí desde este link

esta es una palabra clave en Java. Que se puede usar dentro del método o constructor de clase. Esto (esto) funciona como una referencia a un objeto actual cuyo método o constructor se está invocando. esta palabra clave se puede usar para referir cualquier miembro de un objeto actual desde un método de instancia o un constructor.

Comprobar los ejemplos en el link para una comprensión clara

1

Si las variables de instancia son las mismas que las variables que se declaran en el constructor A continuación, utilizamos "esto" para asignar los datos.

class Example{ 
    int assign;// instance variable 

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

Espero que esto ayude.

0

En Java, "this" es una variable predefinida. Si usamos "this" en el método que significa que estamos obteniendo la referencia (dirección) del objeto que se está ejecutando actualmente. Para un ejemplo.

this.age ---> edad del objeto que se está ejecutando actualmente.

Cuestiones relacionadas