Java Protected Access não funciona
-
22-07-2019 - |
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);
}
}
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 construtorBloo
é um erro. O compilador não consegue encontrar o construtorBlah
sem parâmetro porque você definiu um com um parâmetro de cadeia. - Chamando
new Blah()
no métodoTestBlah
main
é um erro, pela mesma razão que acima. - Referindo-se
a.testing
eb.testing
é um erro porque você não definiu otesting
variável para qualquer classe.