Controles de acesso em métodos e variáveis
Um pouco diferente das classes, os métodos e variáveis podem ser declarados como:
- public
- private
- default (lembrando que default é oculto)
- protected
Segue abaixo um pouco de cada controlador de acesso.
public
Quando um método ou variável é declarado como public, significa que todas as classes que a enxergam (independente do caminho do pacote) podem acessar. Vejamos 3 diferentes formas de acessar:
- A partir de um método declarado na mesma classe.
- A partir de um método usando uma referência da classe.
- A partir de um método herdado.
private
Quando um método ou variável é declarado como private, significa que apenas a classe que a declarou pode acessar. Más, é importante lembrar que as variáveis podem ser alteradas por outros métodos public (ex: setters).
Brincando um pouco com private 🙂
Dentro de uma classe “A” existe um método private com o nome de fazAlgumaCoisa(), e uma outra classe “B” estende (extends) a classe “A”, e essa classe também tem um método fazAlgumaCoisa().
– A classe “B” vai compilar?
– Esse método sobrescreveu o método da classe “A”? (resposta no final)
default
Quando declaramos os métodos ou as variáveis como default, significa que apenas a classe que a declarou + as classes do mesmo pacote podem acessar.
protected
Esse controle de acesso… esse sim (muahahahahaha)… esse tem muitas pegadinhas.
A primeira vista é simples =) Só acessam os métodos e variáveis protected as classes que estão no mesmo pacote ou através de herança.
Brincando um pouco mais =)
Agora com alguns exemplos:
package certificacao; // A super classe (Generelização) public class Fruta { private String nome; protected String getNome() { return nome; } protected void setNome(String nome) { this.nome = nome; } }
package certificacao.citrica; import certificacao.Fruta; // Classe específica public class FrutaCitrica extends Fruta { private String vitaminaC; String getVitaminaC() { return vitaminaC; } @Override public String toString() { // Acessando um método protected return super.getNome(); } }
package certificacao.citrica.plus; import certificacao.citrica.FrutaCitrica; // Classe mais específica public class FrutaCitricaPlus extends FrutaCitrica { private String[] arrayVitaminaC; public String[] getArrayVitaminaC() { return arrayVitaminaC; } public String getFirstVitaminaC() { // NÃO COMPILA, o método getVitaminaC() tem um // controlador default e está em um pacote diferente. return super.getVitaminaC(); } }
Um plus no assunto =)
Será que podemos modificar o nível do controle de acesso de um método em herança, sobrescrevendo-o?
– Sim, mas apenas pode aumentando o nível do controle de acesso.
E agora a resposta da brincadeirinha com private =)
– Sim, o código irá compilar!
– É possível criar um método com o mesmo nome do método private da classe “A” que não irá sobrescrever, porque a classe “B” nem sabe que existe o método fazAlgumaCoisa() da classe “A”.
Comentem, estendam o assunto… Compartilhem =)