Pergunta

Em Java, há três níveis de acesso:

  • Público - Aberta ao mundo
  • Privada - Aberto apenas para a classe
  • Protegido - Aberto apenas para a classe e suas subclasses (herança)
  • .

Então, por que o compilador java permitir que isso aconteça?

TestBlah.java:

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}

Blah.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
Foi útil?

Solução

Na verdade ele deve ser:

Open apenas para os aulas sobre o mesmo pacote a classe e suas subclasses (herança)

É por isso

Outras dicas

Por meio protegidas subclasse ou outras classes no mesmo pacote.

E não há, na verdade, um quarto nível "default" de acesso, quando o modificador for omitido, que fornece acesso a outras classes no mesmo pacote.

Assim protected é entre o acesso padrão e public.

Para ser mais específico, você está esperando protected ao trabalho como faz em C ++.

No entanto, em Java, que tem um significado diferente. Em Java, um método protegido está disponível para a classe (obviamente), todas as outras classes no mesmo pacote e quaisquer subclasses desta classe. Classes em outros pacotes não terá acesso, a menos que subclasse desta classe original.

Veja esta questão semelhante para obter mais informações específicas sobre os marcadores de herança.

Pessoalmente, eu quase nunca uso protected. I desenvolver aplicações em vez de quadros assim que eu sou muito mais provável para definir métodos public, dados private e, muitas vezes, marcam toda a minha classe como final.

Na verdade, existem quatro níveis de acesso: "público", "protegido", "private" e padrão também conhecido como pacote confidencial ou pacote protegido. limites padrão acessibilidade ao pacote. O padrão é bastante útil e eu usá-lo com frequência.

Você é capaz de chamar b.getMessage() porque b é do tipo Bloo, que se estende Blah e getMessage() está protegida. Protegido, como você mencionou, permite que subclasses para acesso o método.

Você tem os seguintes erros, no entanto:

  • Chamando super() sem argumentos no construtor Bloo é um erro. O compilador não consegue encontrar o construtor Blah sem parâmetro porque você definiu um com um parâmetro de cadeia.
  • Chamando new Blah() no método TestBlah main é um erro, pela mesma razão que acima.
  • Referindo-se a.testing e b.testing é um erro porque você não definiu o testing variável para qualquer classe.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top