1. CLASSES E OBJETOS
1.5. ENCAPSULAMENTO COM PRIVATE, PUBLIC, “PACKAGE” E PROTECTED
1.5.1. ENCAPSULANDO MÉTODOS E ATRIBUTOS
Até agora não nos preocupávamos com o modo de acesso de declarações de uma classe pois,
mesmo sem saber porque, você foi avisado para qualificar todos os atributos e métodos de suas
classes como public o que significa que eles são acessíveis, visíveis, em qualquer local de seu
código. Por visível entenda o seguinte: se o atributo x do objeto UmPonto não é visível por
exemplo fora de sua classe, então não faz sentido escrever emmain:UmPonto.x=0;.
Mas então como controlar o acesso de atributos e métodos em uma classe? Simples, através
das palavras reservadas private, public e protected cujos significados quando qualificando
métodos e atributos (privateepublicpodem também qualificar classes) são descritos abaixo:
public Estes atributos e métodos são sempre acessíveis em todos os métodos de todas as
classes. Este é o nível menos rígido de encapsulamento, que equivale a não
encapsular.
private Estes atributos e métodos são acessíveis somente nos métodos(todos) da própria
classe. Esteé o nível mais rígido de encapsulamento.
protected Estes atributos e métodos são acessíveis nos métodos da própria classe e suas
subclasses, o que será visto em Herança 2.
Nada especificado,
equivale“package”
ou“friendly”
Estes atributos e métodos são acessíveis somente nos métodos das classes que
pertencem ao “package” em que foram criados. Este modo de acesso é também
chamado de“friendly”.
(existem outros qualificadores, não relacionados com encapsulamento que serão explicados depois)
Package e friendly: Aparecem entre aspas porque não são palavras reservadas da linguagem, são apenas nomes dados para o tipo de encapsulamento padrão (default), que ocorre quando não existe um especificador. São nomes fáceis de memorizar. Friendly significa amigável, no sentido de que as classes que permitem este tipo de acesso possuem um encapsulamento mais relaxado com relação as classes do mesmo package (amigas). Package é um grupo de classes relacionadas.
Protectedserá explicada em 2.1 pois está relacionada com herança, por hora vamos focalizar
nossa atenção emprivateepublic que qualificam os atributos e métodos de uma classe quanto ao
tipo de acesso (onde eles são visíveis) . Public, private e protected podem ser vistos como
Para facilitar a explicação suponha a seguinte declaração de uma classe: 1)
class Ponto { private float x private float y
public void inicializa(float a,float b) {x=a; y=b;}; public void move (float dx,float dy);
}
Fica fácil entender essas declarações se você pensar no seguinte: esses qualificadores se
aplicam aos métodos e atributos que vem imediatamente após eles. Os elementos da classe
qualificados como private aparecem com fundo cinza escuro indicando que sua “visibilidade” é
mais limitada que os atributos qualificados comopublic(cinza claro).
Agora vamos entender o queé private e o queé public. Vamos supor que você instanciou
(criou) um objeto do tipoPonto em seu programa:
Ponto meu; //instanciacao meu=new Ponto();
Segundo o uso da definição da classe Ponto dada acima você não pode escrever no seu
programa:
meu.x=(float)5.0; //erro !
,como fazíamos nos exemplos anteriores, a não ser quexfosse declarado comopublicna definição
da classe o que não ocorre aqui. Mas você pode escrever x=5.0;na implementação (dentro) de um
método porque enquanto não for feito uso de herança, pode-se dizer que um método tem acesso a
tudo queé de sua classe, veja o programa seguinte.
Você pode escrever: meu.move(5.0,5.0); ,porque sua declaração (move)está comopublic
na classe, em qualquer lugar se pode escrevermeu.move(5.0,5.0);.
Visibilidade das declarações de uma classe, fora dela ,de sua hierarquia e de seu PUBLIC
package. Veja que só a parte public é visível neste caso: PRIVATE
PROTECTED
“PACKAGE”
Visibilidade das declarações de uma classe, dentro dela mesma: PUBLIC
PRIVATE PROTECTED
“PACKAGE” 1.5.1.1.ATRIBUTOS PRIVATE, MÉTODOS PUBLIC
Aplicando encapsulamento a classe ponto definida anteriormente, deixando os atributos
encapsulados e definindo a interface publica da classe somente através de métodos.
//Classe ponto public class Ponto {
privatefloat x,y; //atributos private
publicPonto(float ax,float ay) //omita o valor de retorno! //garante o estado do objeto
{
this.x=ax; this.y=ay; }
publicvoid move(float dx,float dy) {
this.x+=dx; this.y+=dy; }
publicfloat retorna_x() {
return x; }
publicvoid mostra() {
System.out.println( "(" + this.x + "," + this.y + ")" ); }
}
//Classe principal, Arquivo Principal.java class Principal {
public static void main(String args[]) { Ponto ap; ap=new Ponto((float)0.0,(float)0.0); ap.mostra(); } } (0,0) //COMENTARIOS:
Este programa não deixa você tirar o ponto de (0,0)a não ser que seja chamada inicializa
novamente. Fica claro que agora, encapsulando x e y precisamos de mais métodos para que a
classe não tenha sua funcionalidade limitada. Novamente: escrever ap.x=10;emmain é um erro!
Poisxestá qualificada comoprivate. Sempre leia os exercícios, mesmo que não vá faze-los. O que
ocorre em classes mais complicadas,é que ao definir mais métodos na interface da classe, estamos
permitindo que a representação interna possa ser mudada sem que os usuários tomem
Exercícios: 1-
Implemente os métodospublic void altera_x(float a) , public float retorna_x(void), public
void move (float dx,float dy ); .Implemente outros métodos que achar importantes exemplo
public void distancia(ponto a) { return dist(X,Y,a.X,a.Y); },onde dist representa o conjunto de
operações matemáticas necessárias para obter a distância entre (X,Y) (a.X,a.Y). Você
provavelmente usará a funçãoMath.sqrt()que define a raiz quadrada de umdouble, não é preciso
fazer nenhum import para usarMath.sqrt(), masé preciso converter os argumentos de float para
doublee o valor de retorno dedoubleparafloat.
Veja que no método distancia, podemos obter acesso aos atributos private X e Y do
argumentoa, istoé permitido porquedistanciaé um método da mesma classe dea, embora não do
mesmo objeto, uma maneira de prover este tipo de acesso para outras classes (distancia de reta a
ponto)é dotar a classePontode métodos do tipofloat retorna_x(void);.
2-
Escolha um programa implementado anteriormente e aplique encapsulamento, analise a
funcionalidade de sua classe. Você teve que implementar mais métodos? Quais?
1.5.1.2. UM ATRIBUTO É PUBLIC
Neste tópico pedimos que o leitor faça uma variante do programa anterior, a única diferença é
que Ydeve ser colocado na partepublic da definição da classe podendo ser acessado diretamente.
Para escrever a variante, tome o código do programa anterior e substitua
privatefloat x,y;
por
privatefloat x;
publicfloat y; //y pode ser acessado
Comentários:
Observe que agora nada impede que você acesse diretamente y: ap.y=100.0, porém
ap.x=10.00 é um erro. Observe em que parte (área) da classe cada um desses atributos foi
declarado.
Exercícios: 1-
Crie os métodos float retorna_x(void), void altera_x(float a); que devem servir para
retornar o valor armazenado em x e para alterar o valor armazenado em x respectivamente. Crie
também os respectivos métodosretornaealterapara o atributoy.
2-
Qual das seguintes declarações permite que se acesse emmainsomente os métodos movee
inicializa, encapsulando todos os outros elementos da classe? Obs.: A ordem das declarações
privateepublicpode estar invertida com relação aos exemplos anteriores. a)
publicfloat x;
publicfloat y;
publicvoid inicializa(float a, float b) {x=a; y=b;};
publicvoid move(float dx, float dy) ; {x+=dx; y+=dy; };
};
b)
public class Ponto{
publicvoid inicializa(float a, float b) {x=a; y=b;};
publicvoid move(float dx, float dy) ; {x+=dx; y+=dy; };
privatefloat x;
privatefloat y;
};
c)
public class Ponto{
publicvoid inicializa(float a, float b) {x=a; y=b;};
privatevoid move(float dx, float dy) ; {x+=dx; y+=dy; };
publicfloat x;
privatefloat y;
};