poo - 06 - encapsulamento

28
Encapsulamento Programação Orientada a Objetos Ludimila Monjardim Casagrande 2012 Pacotes e Modificadores de Acesso

Upload: ludimila-monjardim-casagrande

Post on 22-Jan-2018

13.196 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: POO - 06 - Encapsulamento

Encapsulamento

Programação Orientada a Objetos

Ludimila Monjardim Casagrande 2012

Pacotes e Modificadores de Acesso

Page 2: POO - 06 - Encapsulamento

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

Page 3: POO - 06 - Encapsulamento

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.

Page 4: POO - 06 - Encapsulamento

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

Page 5: POO - 06 - Encapsulamento

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.

Page 6: POO - 06 - Encapsulamento

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.

Page 7: POO - 06 - Encapsulamento

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.

Page 8: POO - 06 - Encapsulamento

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

Page 9: POO - 06 - Encapsulamento

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.

Page 10: POO - 06 - Encapsulamento

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.

Page 11: POO - 06 - Encapsulamento

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.

Page 12: POO - 06 - Encapsulamento

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

Page 13: POO - 06 - Encapsulamento

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

Page 14: POO - 06 - Encapsulamento

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

Page 15: POO - 06 - Encapsulamento

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.

Page 16: POO - 06 - Encapsulamento

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.

Page 17: POO - 06 - Encapsulamento

Encapsulamento ©2012 Ludimila Monjardim Casagrande 17

Possível Distribuição de Classes

Packages:

Page 18: POO - 06 - Encapsulamento

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

Page 19: POO - 06 - Encapsulamento

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.

Page 20: POO - 06 - Encapsulamento

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.

Page 21: POO - 06 - Encapsulamento

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.

Page 22: POO - 06 - Encapsulamento

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

Page 23: POO - 06 - Encapsulamento

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

Page 24: POO - 06 - Encapsulamento

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;

}

Page 25: POO - 06 - Encapsulamento

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.

Page 26: POO - 06 - Encapsulamento

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

Page 27: POO - 06 - Encapsulamento

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.