2012-07-26 16 views
26
class Sub { 
    static int y; 
    public static void foo() { 
     this.y = 10; 
    } 
} 

entiendo que this representa el objeto de invocar el método y que los métodos estáticos no están vinculados a ningún objeto. Pero en el caso mencionado anteriormente, la variable y también es estática.Por qué no podemos utilizar 'esto' palabra clave en un método estático

Si podemos invocar el método estático en el objeto de clase, ¿por qué no podemos permitir que los métodos estáticos establezcan las variables estáticas de la clase?

¿Cuál es el propósito de esta restricción adicional?

+0

Me doy cuenta de que esta es una pregunta antigua, pero quiero +1 como un punto bastante válido. Aunque para los campos, la respuesta es simple (deje el calificador fuera), para las clases internas estáticas se vuelve relevante, y también es relevante cuando lo que quiere es una referencia a la instancia de tiempo de ejecución de la clase misma. Por ejemplo, puedo escribir 'MyClass.class' para obtener la clase singleton , pero solo 'clase' por sí sola no es válida y no hay una solución similar. Esto lleva a que el nombre de clase se repita potencialmente a través de la unidad que no es muy SECA. –

Respuesta

71

Porque this hace referencia a la instancia del objeto. No hay instancia de objeto en una llamada de un método estático. Pero, por supuesto, puedes acceder a tu campo estático (¡solo los estáticos!). Sólo tiene que utilizar

class Sub { 
    static int y; 
    public static void foo() { 
     y = 10; 
    } 
} 

Si desea asegurarse de obtener el campo estático y y no una variable local con el mismo nombre, utilice el nombre de clase para especificar:

class Sub { 
    static int y; 
    public static void foo(int y) { 
     Sub.y = y; 
    } 
} 
+0

Los downvoters pueden haber pensado que esto realmente no responde la pregunta, porque básicamente repitieron lo que el OP ya sabía y solo proporcionaron un solución detallada. Si la clase se llama 'ThisClassHasAQuiteLongName', ¿no sería mejor referir la clase como' this' en métodos estáticos? – xehpuk

+0

Sin embargo, eso no es realmente cierto, he proporcionado una explicación de por qué 'this' no se puede usar en métodos estáticos (porque no hay ninguna instancia de la clase que se llamará' this') y se muestran dos formas de acceder a los campos. Ser capaz de usar 'this' en un contexto estático como reemplazo del nombre de la clase sería engañoso e inconsistente (al menos imho). Sin embargo, gracias por sus comentarios, esa podría haber sido la razón de los votos a favor. – brimborium

+1

La pregunta, tal como lo entendí y que también quiero saber, es por qué Java no sobrecarga el significado de 'this' en un contexto estático para significar la clase, entonces en lugar de' Sub.y' se podría escribir 'this .y'. Parecería una opción de diseño obvio, porque elimina la necesidad de mencionar explícitamente el nombre de la clase, lo que podría cambiar. En general, cuando alguien pregunta "¿por qué x se define como y pero no también z en un contexto diferente?" No es satisfactorio, y de hecho es un poco tóxico y condescendiente para responder "porque se define como y". Me hizo sentir tonto por preguntarme lo mismo, como todavía estoy. –

2

Para hacer su trabajo de escribir código de esta manera:

class Sub { 
    static int y; 
    public static void foo() { 
     Sub.y = 10; 
    } 
} 

Puede configurar los campos estáticos en los métodos estáticos, pero no tienen acceso a this en el método estático porque this representa la instancia actual de la objeto, y en un método estático no tiene instancia.

+0

¿te importaría explicar cuál es el problema de mi respuesta, o de la respuesta de @ Peter? – tibtof

+0

No hay nada de malo en tu respuesta. Upvoted a 0 de nuevo. (lo que le deja con +8 rep general debido al sistema repulsivo de representantes de votación ^^) – brimborium

2

Esto significa "este" objeto pero no hay ninguno. En su caso, puede usar el nombre de la clase como lo sugiere @tibtof.

5

this hace referencia a esta instancia del objeto Sub. Como el método es static, no hay una instancia de Sub.

0

palabra clave "este" se refiere al objeto con el que se opera. En su caso esto dentro de cualquier método o constructor no estático (si tiene uno y si usa "this" dentro de eso), entonces "this" se refiere a esa instancia particular de la clase Sub.So solo es aplicable cuando el el objeto es creado Pero cualquier cosa en el contexto estático de una clase, puede usar sin siquiera crear un objeto para eso, ya que se resuelve durante la carga de la clase. "esto" se resuelve solo cuando se crea el objeto (incluso se puede decir dinámicamente para qué objeto). Entonces, "esto" tiene sentido en un contexto estático. Espero eso ayude. Dios bendiga.

4

La razón principal por la que no podemos utilizar "este" en el contexto método estático: -

esto: - "este" se refiere a la clase Object actual, por lo que es claro que "esto" sólo vienen en la imagen una vez intentamos crear un Objeto de esa clase.

método estático: - no hay necesidad de crear un objeto para usar el método estático. significa "instancia" u objeto de creación no tiene ningún sentido con "estática" según la regla de Java.

Así que habría una contradicción, si usamos ambos juntos (estáticos y esto). Esa es la razón por la que no podemos usar "esto" en el método estático.

0

"this" palabra clave solo se aplica cuando se crea una instancia de un objeto. Y en el método estático, no se crea ninguna instancia porque el método estático pertenece al área de clase.

0

Estoy de acuerdo con todas las demás personas que respondieron antes que yo. Permítanme intentarlo de otra manera para responder esto:

Supongo que el método de instancia/método no estático pertenece a la instancia de una clase (lo que significa que tarde o temprano necesitamos ref de objeto para acceder a él) por lo que esta palabra clave tiene sentido dentro bloque o método de instancia. Pero la palabra clave estática para cualquier miembro de una clase se interpreta como un activo directo para la clase que un objeto si existió y luego tiene acceso a él. Entonces, en un contexto estático, no es seguro que el objeto exista en algún lugar. Es por eso que usar este área estática interna no está permitido en Java.

Cuestiones relacionadas