Você está na página 1de 27

Encapsulamento

Programação em Java

Prof. Maurício Braga


Pilares da programação OO

 Encapsulamento

 Herança (Generalização/Especialização)

 Polimorfismo

2/27
Encapsulamento

Separa a
interface de um
objeto dos
detalhes de seu
funcionamento
interno

3/27
Encapsulamento

 Permite que uma aplicação seja construída a partir de um conjunto


de componentes que realizam seu trabalho de forma independente.

 Cada componente contém tudo que precisa para realizar seu


trabalho independentemente dos outros componentes.

 Estimula a divisão de responsabilidades: cada objeto faz apenas o


que deve fazer, não realizando tarefas extras.

4/27
Encapsulamento

 A independência entre os objetos é obtida escondendo detalhes


internos do funcionamento de cada componente, tornando o uso do
componente acessível apenas através de uma interface
externa.

 Facilita o controle ao acesso de informações do estado interno do


objeto.

 Você não precisa saber como um telefone realmente funciona, para


poder usá-lo. Só precisamos saber para que ele serve, e conhecer
sua interface, ou seja a forma de nos comunicarmos com ele.

5/27
Encapsulamento

 Se a companhia telefônica mudar seus processos, você


vai continuar usando o aparelho normalmente

 A implementação de uma classe, pode ser alterada sem


afetar a sua interface. Se um novo telefone for criado,
como um telefone digital, a implementação foi alterada,
mas a interface permanece a mesma

6/27
Interface

 Lista de serviços oferecidos por um componente

 Funciona como um “contrato” que o componente


estabelece com o mundo exterior que define exatamente
como este pode fazer uso do componente

 Funciona como um “painel de controle” do componente.

7/27
Interface

 Formada por métodos e atributos públicos.

 Ausência de informações sobre como o trabalho é


realizado.

 Liberdade para modificar o funcionamento do


componente sem “quebra de contrato” com o mundo
exterior.

8/27
Exemplo Encapsulamento

 Telefone
 interface pública- botões utilizados para interagir com
o objeto
 implementação - as operações internas, o propósito
do objeto

 Carro
 interfaces
públicas - pedais, direção, câmbio
 implementação - o funcionamento do carro

9/27
Encapsulamento em Java - Métodos
de acesso

 Junto com os métodos modificadores, viabilizam o


encapsulamento.

 Métodos de acesso permitem acessar os atributos do


objeto.

10/27
Métodos de acesso

Tipo de retorno Nome do método Lista de


Modificador de parâmetros
visibilidade (vazia)

public String getNome()


{
return nome; Instrução de retorno
}
Início e fim do corpo do método (bloco)

11/27
Encapsulamento em Java - Métodos
modificadores

 Utilizados para modificar o estado de um objeto.

 Alcançados por meio da modificação do valor de um ou


mais atributos do objeto.
 Geralmente contêm instruções de atribuição.
 Geralmente recebem parâmetros.

12/27
Métodos modificadores

Modificador de
Tipo de retorno (void)
visibilidade
Nome do método Parâmetro

public void setNome(String nome_produto)


{
nome = nome_produto; Atribuição
}
Atributo sendo alterado

13/27
Exemplo Encapsulamento
class Cliente {
private double credito;
private String nome;

public String getNome() {


return nome;
}
public void setNome(String nome_cliente) {
nome = nome_cliente;
}
public void imprimaDadosCliente(Cliente c) {
imprimir(c.nome, c.credito);
}
private void imprimir(String nome, double credito) {
System.out.println(“Cliente: “ + nome + “ Crédito: R$ “ + credito);
}
}
14/27
Interface da classe Cliente

public String getNome()

public void setNome(String nomeCliente)

public void imprimaDadosCliente(Cliente c)

Note que o método privado imprimir


não faz parte da interface!

15/27
Vantagens do encapsulamento
 Reutilização – Uma vez que o componente é independente, ele
pode ser utilizado em diferentes programas com facilidade.

 Divisão de responsabilidades – Cada objeto faz apenas o que lhe é


devido, não assumindo funções extras.

 Facilidade de modificação – Uma vez que o mundo exterior não


conhece a implementação do componente, esta pode ser alterada
sem problemas.

 Ausência de efeitos colaterais – Uma vez que o componente não


depende de partes do seu programa para funcionar, não há risco
dele modificar o funcionamento do programa.

16/27
Exemplo
class ProdutoSemEncapsulamento {
public int codigo;
public String nome;
public double preco;
public double desconto_a_vista;

17/27
Exemplo
public static void main(String[] args) {

ProdutoSemEncapsulamento p = new
ProdutoSemEncapsulamento();

p.codigo = 1;
p.nome = "Samsung 17 polegadas";
p.preco = 500;
p.desconto_a_vista = 10;

System.out.println("Preço à prazo: " + p.preco);


System.out.println("Preço à vista: " + (p.preco –
p.preco*p.desconto_a_vista/100));
}

18/27
Exemplo

O que aconteceria se o programador


tivesse digitado um desconto de 200?

19/27
Exemplo

20/27
Encapsulamento

 Exercício
 Corrija a classe do exemplo anterior (vista abaixo). Esta classe
deverá usar encapsulamento, possuir um construtor, um método
que calcula o preço a vista bem como um método setDesconto,
que recebe o valor do desconto, e se o mesmo for superior a
100 ou menor que zero, configurar o desconto como zero.

class ProdutoSemEncapsulamento {
public int codigo;
public String nome;
public double preco;
public double desconto_a_vista;
}
21/27
Solução
class Produto {
private int codigo;
private String nome;
private double preco;
private double desconto_a_vista;

public Produto(int cod_prod, String nome_prod, double


preco_prod, double desc) {
codigo = cod_prod;
nome = nome_prod;
preco = preco_prod;
desconto_a_vista = desc;
}

22/27
Solução
public double getPreco() {
return preco;
}
public double getPrecoAVista() {
double preco_a_vista;
preco_a_vista = preco - preco*desconto_a_vista/100;
return preco_a_vista;
}
public void setDesconto(double desc) {
if ((desc > 100) || (desc < 0))
desconto_a_vista = 0;
else
desconto_a_vista = desc;
}
} 23/27
Exercício
 Crie uma classe para representar uma conta bancária.
Esta classe deverá:
 Usar encapsulamento;
 Possuir dois atributos, código e saldo;
 Possuir um construtor que receba o número da conta e o saldo
inicial. Se for passado um valor negativo para o saldo,utilizar
zero como saldo inicial;
 Possuir métodos para creditar um valor, sacar um valor e
imprimir o saldo.
 Se o valor a ser sacado for maior do que o saldo, sacar apenas
o valor correspondente ao saldo (saldo será igual a zero),
retornando o valor sacado em seguida.

24/27
Solução
class Conta {

private double saldo;


private long numero;

public Conta(long num, double val) {


numero = num;
if (val > 0)
saldo = val;
}
public void creditar(double val) {
saldo = saldo + val;
}

25/27
Solução
public double debitar(double val) {
if (val > saldo)
val = saldo;
saldo = saldo - val;
return val;
}
public void imprimaSaldo() {
System.out.println(“Conta: “ + numero + “Saldo: R$ “ +
saldo);
}
}

26/27
Encapsulamento

Programação em Java

Prof. Maurício Braga