Ir ao conteúdo

Posts recomendados

Postado

E aí pessoal, tudo bem?

public abstract class Teste {
    public static final Teste IMPLEMENTACAO_1 = new Teste() {
        @Override
        public void funcao() {
            // Non-static method 'falarPrivado()' cannot be referenced from a static context
            falarPrivado();
        }
    };

    public static final Teste IMPLEMENTACAO_2 = new Teste() {
        @Override
        public void funcao() {
            falarPublico();
        }
    };

    public abstract void funcao();

    private String falarPrivado() {
        return "Falando privado";
    }

    public String falarPublico() {
        return "Falando publico";
    }
}

A classe acima está acusando o famoso erro de compilação sobre "um elemento não estático não poder ser referenciado por um estático". Mas analisando as duas funções "falar", vemos que elas possuem exatamente o mesmo código, mudando apenas o modificador de acesso. A questão é que apenas a função privada lança o erro.

 

Alguém poderia me explicar como o modificador de acesso influencia nisso? Tipo, por que só a função privada dá problema? No meu ponto de vista, ambas as funções deveriam lançar esse erro.

 

Desde já agradeço.

  • Curtir 1
Postado

classes abstracts sao classes que nao podem ser instanciadas, garante a herança total, somente subclasses nao abstratas podem ser instanciadas(notação UML nome em italico)

metodos abstracts nao possuem implementacao é generico para as subclasses, se uma classe possui pelo menos 1 metodo abstract entao a classe tambem é abstract
 

  • Curtir 1
Postado

Opa, beleza? Valeu pela resposta, mas eu já conheço o conceito de classes abstratas. O meu problema é com a referência de elementos não estáticos. Vou postar um código levemente diferente:

package code;

public abstract class Teste {
    public static final Teste IMPLEMENTACAO_1 = new Teste() {
        @Override
        public void executar() {
            teste1();
        }
    };

    public static final Teste IMPLEMENTACAO_2 = new Teste() {
        @Override
        public void executar() {
            teste2();
        }
    };

    public static final Teste IMPLEMENTACAO_3 = new Teste() {
        @Override
        public void executar() {
            // Non-static method 'teste3()' cannot be referenced from a static context
            teste3();
        }
    };

    public abstract void executar();

    public void teste1() {}

    protected void teste2() {}

    private void teste3() {}
}

Na classe acima, a IMPLEMENTACAO_3 não irá compilar devido ao problema de referência estática. Porém todas as implementações possuem essencialmente o mesmo código, com a única diferença ficando por conta do modificador de acesso da função chamada. Nesse caso, apenas a função privada gera o erro de compilação.

 

E eu queria saber por que.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...