• Nenhum resultado encontrado

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;

};

Documentos relacionados