Fiquei com duvida referente ao uso da palavra this no contexto estático. Posso referenciar os membros estáticos com o uso do this?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.