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.