Java com café: Modificadores de acesso - Java

Modificadores de acesso - Java

Hoje vou mudar de assunto e falar um pouco sobre Java. Assim como outras linguagens de programação, o Java tem níveis de acesso que podemos definir para classes, métodos e variáveis. Existem 3 modificares de acesso: Public, Protected e Private. Mas os níveis de acesso são 4, porque implicitamente se nenhum desdes modificadores forem usados o acesso é definido como Default.
Os níveis de acesso podem dizer se um método por exemplo pode ser acessado somente pela classe, por outras classes dentro do seu pacote ou fora dele:
Classe > Pacote > Global

Public e Private

Primeiramente, se você está começando a aprender agora, entenda estes dois modificadores pois são os mais simples. O Public é o menos restritivo de todos. Ele permite que sua classe, método ou variável possa ser acessada globalmente no projeto.
O Private é o mais restritivo. Ele permite que sua variável ou método só seja visto dentro da classe em que se encontra. Classes e interfaces não podem ser Private (nem Protected).
Private é muito usado para encapsular atributos da classe. Neste caso, o acesso aos atributos é feito por um método Public que poderá validar os dados, por exemplo:
private int x = 0;

A variável não poderia ser acessada diretamente. Somente através do método:
 public void setX(int x){
if (x > 0){
this.x = x;
}
}

Default

Default é o nível de acesso usado quando não colocamos nenhum modificador:
 class Animal{}
Quando não usamos modificadores, estamos dizendo que a classe, método ou variável só é visível dentro do seu pacote. O Default então cria uma restrição de pacote. Por este motivo ele é o meio termo entre o Private e Public.

Protected

O Protected é o mais incompreendido de todos. Ele é parecido com Default (restrição de pacote) mas permite que o membro seja acessado através de herança. Isto gera uma certa confusão mas preste atenção: O método ou variável protected só pode ser acessado de fora do pacote através da herança e nunca diretamente! Vejamos o que estou querendo dizer:

package Superclasse;

public class Animal {

private int x = 1;

protected int getX() {
return x;
}
}
Temos um pacote Superclasse contendo a classe Animal. Animal tem uma variável x private e um método protected para retornar o valor desta variável. Até aí tudo bem, vamos criar uma classe em outro pacote que herde de Animal:

package Subclasse;
import Superclasse.Animal;

public class Homem extends Animal{

public static void main(String[] args) {

Homem homem = new Homem();
System.out.println(homem.getX()); //Ok, homem herda de animal
}
}

Vimos que homem herda o método protected getX de Animal. Mas agora tente fazer o seguinte:
package Subclasse;
import Superclasse.Animal;

public class Homem extends Animal{

public static void main(String[] args) {

Homem homem = new Homem();
System.out.println(homem.getX());


Animal animal = new Animal();
System.out.println(animal.getX()); //Erro, tentou acessar diretamente

}
}
Ao tentar acessar o método getX através da instancia de Animal, fazendo isto diretamente o código não compila e mostra o seguinte erro:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method getX() from the type Animal is not visible

at Subclasse.Homem.main(Homem.java:13)

E se outra classe de outro pacote instanciar Homem, terá acesso ao método? Não, novamente somente através da herança poderá ter acesso.
Para não esquecer como isso funciona eu imaginei a seguinte situação: Temos o pai, o filho e o amigo do filho. O pai tem dinheiro e pode gastá-lo. Ele dá a mesada ao filho. O filho pode gastar a mesada, mas nunca o dinheiro do pai. O filho pode emprestar dinheiro ao amigo. O amigo pode gastar o dinheiro emprestado, mas nunca o do filho e nem o do pai. Resumindo, você pode ter acesso ao que lhe foi dado, mas não pode acessar de quem lhe deu.
Espero ter deixado claro o funcionamento do protected.

Bons estudos!

Um comentário: