Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no Ex. 3 da Aula 2 - Aplique a palavra chave static a métodos e campos

Fiquei com duvida referente ao uso da palavra this no contexto estático. Posso referenciar os membros estáticos com o uso do this?

3 respostas
solução!

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.