Fiquei com duvida referente ao uso da palavra this no contexto estático. Posso referenciar os membros estáticos com o uso do this?
Fiquei com duvida referente ao uso da palavra this no contexto estático. Posso referenciar os membros estáticos com o uso do this?
Oi Tiago, tudo bem?
Bem, como você já deve imaginar, não é possível acessar atributos e métodos de um objeto em um método estático, pois os métodos e atibutos estáticos pertecem a classe e não aos objetos dela.
Não faria sentido, pois nem mesmo é preciso criar objetos de uma classe para acessar métodos e campos estáticos. O código a seguir não compila:
class A {
void foo() {
}
static void bar() {
foo();
}
}
Mas tem o seguinte: atributos e métodos estáticos, podem ser referenciados tanto utilizando o o nome da classe, como através de um objeto da classe. Aqui faz sentido, pois os métodos e atributos pertecem a classe como um todo e serão compartilhados entre as chamadas. Serão criados mesmo que não criemos objetos daquela classe.
O código a seguir compila e imprime 10 duas vezes:
class B {
static void z() {
System.out.println("10");
}
}
class A {
public static void main(String[] args) {
B.z(); // chamada através da classe
new B().z(); // chamada ao método estático através de um objeto
}
}
O this representa a referência atual.
É por esse motivo, que o código apresentado no exercício funciona. quando é feito this.z() em:
class B {
void y() {
this.z();
}
static void z() {
System.out.println("z");
}
}
perceba que eu estou dizendo: "chama o método z() no objeto atual", e isso como vimos é possível, já que posso chamar métodos estáticos em a partir de uma referencia. faz o mesmo sentido que em: new B().z(). Estamos chamando um método estático partir de uma referência.
mas respondendo a pergunta: é possível referenciar membros estáticos através do this.
mas observe que o this está sendo usado em um método não estático. qualquer tentativa de chamar o this em um contexto estático (ex.: método estático) resulta em erro de compilação:
class A {
void foo() {
}
static void bar() {
this.foo(); // erro.
}
void bla() {
this.bar(); // ok, chama na referencia atual
}
}
Consegui ser claro? Caso não, pode dizer que continuamos a conversa.
Abs.
Lucas, a sua resposta sanou todas as minhas dúvidas qto a este assunto.
Muito obrigado!!
Perfeita a resposta.