Visibilidade
Em Java, utilizamos alguns modificadores que nos permitem “proteger” o acesso a um atributo, método ou até mesmo uma classe, de outras classes. Basicamente Java possui quatro modificadores básicos de acesso: private, protected, default e public.
No vídeo a seguir mostramos passo a passo como funciona os modificadores de visibilidade:
Modificador de acesso: private
private é um modificador de acesso que restringe totalmente o acesso aquele recurso da classe de todas as demais classes, sejam elas do mesmo pacote, de outros pacotes ou até subclasses. Este modificador pode ser aplicado a atributos e métodos.
Exemplo:
Neste exemplo, temos a classe Email, a partir de outras classes podemos chamar apenas o método enviarEmail(…), os outros métodos e atributos da classe não podem ser usados por outras classes pois tem o modificador private.
Neste exemplo conseguimos criar um objeto a partir da classe Email e enviar o email utilizando o método enviarEmail(…), mas não conseguimos acessar o atributo remetente e o método enviar(), pois são privados e o compilador gera dois erros de compilação:
Modificador de acesso: default (ou package)
default é um modificador um pouco menos restritivo que o private. Este tipo de modificador é aplicado a todas as classes, atributos ou métodos, os quais, não tiveram o seu modificador explicitamente declarado.
Este modificador permite que apenas classes do mesmo pacote tenham acesso as propriedades que possuem este modificador.
Neste exemplo, temos uma classe Pessoa que não declarou o modificador, portanto o modificador é o default.
Se criarmos outra classe dentro do mesmo pacote br.visibilidade da classe Pessoa, então está classe tem acesso à classe Pessoa também.
Agora se tentarmos utilizar a classe Pessoa, a partir de outro pacote, terá erro de compilação, pois não tem acesso.
Quando tentamos compilar essa classe, temos a seguinte mensagem do compilador:
Modificador de acesso: protected
protected é um modificador um pouco menos restritivo que o default. Com este tipo modificador, podemos declarar que um atributo ou método é visível apenas para as classes do mesmo pacote ou para as subclasses daquela classe.
Neste exemplo, temos a classe Produto, e está classe tem o atributo nomeProduto e os métodos getNomeProduto() e setNomeProduto() que possuem o modificador protected.
Se criarmos outra classe no pacote br.visibilidade, podemos utilizar os atributos e métodos protected declarados na classe Produto.
Se criarmos uma classe em um pacote diferente, não conseguiremos utilizar os atributos e métodos da classe Produto, pois não temos acesso ao método.
Se a classe que está em outro pacote for uma subclasse da classe Produto, então está classe recebe através da herança os atributos e métodos protected. (Veremos o conceito de herança mais adiante.)
Modificador de acesso: public
public é o modificador menos restritivo de todos os demais. Declarando classes, atributos ou métodos com este modificador, automaticamente dizemos que aquela propriedade é acessível a partir de qualquer outra classe.
Dentro de um arquivo .java, só pode existir uma classe do tipo public, e está classe precisa obrigatoriamente ter o mesmo nome que o nome do arquivo .java.
Além dos modificadores de acesso, temos vários outros modificadores que serão abordados futuramente. A seguir, temos uma relação de todos os modificadores e os seus respectivos impactos quando aplicados a Classes, Métodos e Atributos.
Modificador | Em uma classe | Em um método | Em um atributo |
---|---|---|---|
private | Não aplicável | Acesso pela classe | Acesso pela classe |
protected | Não aplicável | Acesso pelo pacote e subclasses | Acesso pelo pacote e subclasses |
default | Somente pacote | Acesso pelo pacote | Acesso pelo pacote |
public | Acesso total | Acesso total | Acesso total |
abstract | Não instância | Deve ser sobrescrito | Não aplicável |
final | Sem herança | Não pode ser sobrescrito | Constante |
static | Não aplicável | Acesso pela classe | Acesso pela classe |
native | Não aplicável | Indica código nativo | Não aplicável |
transient | Não aplicável | Não aplicável | Não serializavel |
synchonized | Não aplicável | Sem acesso simultâneo | Não aplicável |