Post on 22-Jan-2018
Encapsulamento
Programação Orientada a Objetos
Ludimila Monjardim Casagrande 2012
Pacotes e Modificadores de Acesso
Aplicação de Modificadores de Acesso
Esse exemplo apresenta uma classe modelada
em UML na qual existe um atributo privado e
dois métodos públicos:
Encapsulamento ©2012 Ludimila Monjardim Casagrande 2
- private
+ public
# protected
~ default
Encapsulamento ©2012 Ludimila Monjardim Casagrande 3
O Conceito de Pacote
Em Java, a visibilidade ou grau de acesso a um
atributo ou método está intimamente ligado ao
conceito de pacote ou simplesmente package.
A identificação de uma package corresponde à
hierarquia de diretórios na qual a classe está
inserida.
Exemplo de declaração de package:
package br.com.salesiano; Raiz do projeto.
O Conceito de Pacote
Em um código-fonte escrito em Java, a declaração da
package deve sempre anteceder a declaração da
classe.
Normalmente a declaração da package é a primeira
informação contida no arquivo.
Na composição do nome da package os nomes dos
diretórios devem ser separados por “.”.
Deve-se ter cuidado para que os nomes dos diretórios
que compõem uma package sejam nomes válidos para
todas as plataformas.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 4
Encapsulamento ©2012 Ludimila Monjardim Casagrande 5
O Conceito de Pacote
package br.com.salesiano;
public class Conta {
private double saldo;
public void creditar (double valor) {
saldo = saldo + valor;
}
public void debitar (double valor) {
saldo = saldo - valor;
}
}
Classe contida
no subdiretório
salesiano.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 6
Importações
Para fazer uso de uma package em uma classe
é necessário importá-la.
A sintaxe para importação é:
import <pkg_name>[.<sub_pkg_name>].<class_name>;
import <pkg_name>[.<sub_pkg_name>].*;
É possível importar uma única classe, usando o nome da
package seguido do nome da classe, ou importar toda
uma package, usando o nome da package com um
asterisco no final.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 7
Pacotes e Importações nas Classes
A estrutura básica de um arquivo-fonte em Java
deve ser:
Declaração da package
Importações (imports)
Definição da(s) classe(s)
Essa ordem é relevante, portanto, deve ser
respeitada.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 8
Exemplo: Entrada.java
package br.com;
import java.util.Scanner;
//import java.util.*; //também poderia ser usado
public class Entrada{
public static void main(String[] args){
Scanner entrada = new Scanner(System.in);
String nome;
System.out.println("Informe seu nome: ");
nome = entrada.next();
System.out.println("Seu nome é: " + nome);
}
}
* Requer J2SDK 1.5 ou
superior
Encapsulamento ©2012 Ludimila Monjardim Casagrande 9
Modificadores de Acesso
Os modificadores de acesso definem quais
classes podem usar ou ter acesso a um
determinado elemento.
Esses elementos podem ser:
Uma classe;
As variáveis de uma classe (atributos);
Os métodos e os construtores de uma classe.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 10
Modificadores de Acesso
Em Java, os modificadores de acesso são:
public
protected
private
O modificador de acesso considerado “default”
corresponde à ausência de qualquer um dos
modificadores citados.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 11
O Modificador: Public
O modificador de acesso public é aquele que
permite o maior grau de visibilidade e de acesso
aos diferentes elementos.
Classes, variáveis de classes, construtores e
métodos declarados como públicos podem ser
usados sem restrições.
Public pode ser aplicado a qualquer um dos
elementos citados.
O Modificador: Private
O modificador private é o mais restritivo de
todos.
Variáveis ou métodos declarados como private
só podem ser acessados diretamente por
instâncias da classe a qual pertencem.
Nem mesmo subclasses possuem acesso direto
a elementos declarados como private na sua
superclasse.
O modificador private não se aplica a classes.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 12
O Modificador: Protected
Os elementos declarados como protected podem ser acessados por classes da mesma package ou pelas subclasses da classe na qual estão contidos.
Esse modificador não se aplica a classes.
É aplicado normalmente a variáveis e métodos.
Elementos declarados como protegidos possuem um grau de acesso maior do que os declarados como “default”.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 13
Ausência de Modificador de Acesso
A ausência de um modificador de acesso na declaração
de um elemento indica um grau de acessibilidade
considerado “default”.
Esse grau de acessibilidade é mais restritivo do que o
protected uma vez que torna os elementos visíveis
somente para a própria classe e para as outras classes
contidas na mesma package.
Os elementos declarados com “default” não podem ser
usados pelas subclasses da classe na qual estão
contidos, caso essas pertençam a outras packages.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 14
A tabela indica a quais elementos da classe os
vários modificadores de acesso podem ser
aplicados:
Modificadores e Membros da Classe
Classe Atributos Construtores Métodos
public sim sim sim sim
protected não sim sim* sim
default sim sim sim sim
private não sim sim* sim
Encapsulamento ©2012 Ludimila Monjardim Casagrande 15
* Pouco utilizado nesses casos.
A tabela indica os níveis de acesso (ou graus de
visibilidade) definidos por cada modificador de
acesso:
Níveis de Acesso
Classe Package Subclasse* Global**
public sim sim sim sim
protected sim sim sim não
default sim sim não não
private sim não não não
Encapsulamento ©2012 Ludimila Monjardim Casagrande 16
* Subclasse contida em outra package.
** Acesso por classes de outros projetos ou sistemas.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 17
Possível Distribuição de Classes
Packages:
Encapsulamento
Encapsulamento é um dos conceitos
fundamentais da programação orientada a
objetos.
O encapsulamento, também referido como
ocultamento de informações, consiste em
separar os aspectos externos de um objeto, os
quais são acessíveis a outros objetos, dos
detalhes internos de sua implementação, os
quais permanecem ocultos para os outros
objetos.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 18
Encapsulamento ©2012 Ludimila Monjardim Casagrande 19
Principais Vantagens
O uso de encapsulamento permite que a
implementação de um objeto possa ser
modificada sem afetar as aplicações que usam
este objeto, ou seja, o encapsulamento evita
que um programa se torne tão interdependente
que uma pequena mudança tenha grandes
efeitos colaterais.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 20
Principais Vantagens
O encapsulamento também evita que dados
específicos de uma classe possam ser
acessados ou usados diretamente e faz com
que isso aconteça somente por meio das
operações cuja responsabilidade é a
manipulação desses dados.
Tais operações são consideradas a interface
dos objetos, que permite a comunicação entre
os mesmos.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 21
Exemplo
public class Hora {
public int hora;
public int minuto;
public int segundo;
public Hora() {
}
public Hora(int h, int m, int s) {
this.hora = h;
this.minuto = m;
this.segundo = s;
}
public String toString( ) {
String str = hora + ":" + minuto + ":" + segundo;
return str;
}
}
Atributos declarados como
públicos
Falha no construtor!
A classe é
responsável por
manter a
consistência e
correção das suas
instâncias.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 22
Exemplo
public class Principal {
public static void main (String[] args) {
Hora h = new Hora();
h.hora = 30;
h.minuto = 80;
h.segundo = -40;
System.out.println(h);
}
}
Resultado: 30:80:-40 Não é uma hora válida!
Como os atributos são públicos, eles
podem ser acessados e alterados
diretamente em outra classe
Solução para o Problema
Usar encapsulamento para controlar os valores
atribuídos às variáveis da classe, de forma que
a todo momento os dados mantidos pela classe
sejam válidos e consistentes.
Uma classe deve conhecer quais são os valores
válidos para os seus atributos. As demais
classes não são obrigadas a saber esses
detalhes.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 23
Encapsulamento ©2012 Ludimila Monjardim Casagrande 24
Solução para o Problema
public void setHora(int hora) {
if(hora >= 0 && hora <= 23) {
this.hora = hora;
}
}
public void setMinuto(int minuto) {
if(minuto >= 0 && minuto <= 59) {
this.minuto = minuto;
}
}
public void setSegundo(int segundo) {
if(segundo >= 0 && segundo <= 59) {
this.segundo = segundo;
}
}
…
}
public class Hora {
private int hora;
private int minuto;
private int segundo;
public Hora(){
}
public Hora(int h, int m, int s) {
if((h >= 0 && h <= 23) &&
(m >= 0 && m <= 59) &&
(s >= 0 && s <= 59)) {
this.hora = h;
this.minuto = m;
this.segundo = s;
}
}
public String toString( ) {
String str = hora + ":" + minuto + ":" + segundo;
return str;
}
…
Encapsulamento ©2012 Ludimila Monjardim Casagrande 25
Solução para o Problema
public class Principal {
public static void main (String[] args) {
Hora h = new Hora();
h.setHora(30);
h.setMinuto(80);
h.setSegundo(-40);
System.out.println(h);
}
}
Resultado: 0:0:0 Tentativas de alterações inválidas não são aceitas.
Ocultamento de Implementação
Encapsulamento ©2012 Ludimila Monjardim Casagrande 26
public class Principal {
public static void main (String[ ] args) {
Incrementa5 inc = new Incrementa5();
int resultado = inc.incrementa5(10);
System.out.println(resultado);
}
}
Resultado: 15
Encapsulamento ©2012 Ludimila Monjardim Casagrande 27
Ocultamento de Implementação
public class Incrementa5 { /*public int incrementa5 (int numero) { int i = 0; while (i < 5) { numero++; i++; } return numero; }*/ public int incrementa5 (int numero) { return numero + 5; } }
As implementações podem
ser substituídas sem efeitos
colaterais para as classes
que utilizam o método.
Encapsulamento ©2012 Ludimila Monjardim Casagrande 28
Leituras Recomendadas
FJ-11: Java e Orientação a Objetos.
Caelum Ensino e Soluções em Java. http://www.caelum.com.br/curso/fj-11-java-orientacao-objetos/
Java: Como Programar.
Autores: H. M. Deitel e P. J. Deitel.
Editora: Pearson – 6ª Edição.