89
Programação Orientada a Objetos com Java 19/09/2014

Programação Orientada a Objetos com Java

Embed Size (px)

DESCRIPTION

Segunda parte do curso introdutório ao Java, onde são apresentados conceitos de objetos, classes, atributos, métodos, coesão, acoplamento, interfaces, elementos estáticos e abstratos, exceções, tratamento excepcional, estruturas básicas como lista (List), conjunto (Set) e mapa (Map).

Citation preview

Page 1: Programação Orientada a Objetos com Java

Programação

Orientada a Objetos

com Java

19/09/2014

Page 2: Programação Orientada a Objetos com Java

Direitos Autorais

Você está autorizado e incentivado a distribuir este material.

Copie, compartilhe e modifique, apenas cite a fonte.

Page 3: Programação Orientada a Objetos com Java

Direitos Autorais

Luiz Ricardo

luizricardo.org

facebook.com/StateOfTheArtBlog

Page 4: Programação Orientada a Objetos com Java

Objetos

• Estado

• Atributos e Características

• Comportamento

• Ações

Page 5: Programação Orientada a Objetos com Java

Classe

• Tipo base para objetos, um “Molde”

class Classe {

}

objeto = new Classe()

Page 6: Programação Orientada a Objetos com Java

Classe

class Carro {

}

Carro meuCarro = new Carro();

Page 7: Programação Orientada a Objetos com Java

Estrutura da Classe

Classe

Atributos

Métodos

Page 8: Programação Orientada a Objetos com Java

Atributos

class Carro {

String marca;

String cor;

int ano;

int velocidade = 0;

}

Page 9: Programação Orientada a Objetos com Java

Acesso a Atributos

carro.velocidade = 1;

int velocidade = carro.velocidade;

Page 10: Programação Orientada a Objetos com Java

Métodos

class Carro {

void acelerar() {

velocidade++;

}

}

Page 11: Programação Orientada a Objetos com Java

Parâmetros

class Carro {

void quadrado(double numero){

return numero * numero;

}

}

Page 12: Programação Orientada a Objetos com Java

Parâmetros

class Carro {

int velocidade = 0;

void mudarVelocidade(int velocidade){

???

}

}

Page 13: Programação Orientada a Objetos com Java

Parâmetros

class Carro {

int velocidade = 0;

void mudarVelocidade(int velocidade){

this.velocidade = velocidade;

}

}

Page 14: Programação Orientada a Objetos com Java

Retorno

class Carro {

int lerVelocidade() {

return velocidade;

}

}

Page 15: Programação Orientada a Objetos com Java

Execução de Métodos

carro.aumentarVelocidade(2);

int v = carro.lerVelocidade();

Page 16: Programação Orientada a Objetos com Java

Exercícios

1. Implemente uma classe chamada Cliente que tenha um

código, nome, idade, CPF e e-mail.

2. Implemente um método que:

– Receba dois clientes; e

– Retorne os seus respectivos e-mails separados por vírgula.

Page 17: Programação Orientada a Objetos com Java

Sobrecarga

class Carro {

void aumentarVelocidade(int quantidade) {

this.velocidade += quantidade;

}

void aumentarVelocidade() {

this.velocidade++;

}

}

Page 18: Programação Orientada a Objetos com Java

Sobrecarga

carro.aumentarVelocidade(10);

carro.aumentarVelocidade();

Page 19: Programação Orientada a Objetos com Java

Exercícios

3. Continue do exercício 2, mas agora implemente um

método que receba três clientes e retorna seus e-mails.

4. Faça o mesmo para um array de clientes

Page 20: Programação Orientada a Objetos com Java

Encapsulamento

Você não quer outras pessoas fuxicando nos

atributos da sua classe, não é?

Page 21: Programação Orientada a Objetos com Java

Encapsulamento

public class Carro {

int velocidade = 0;

}

meuCarro.velocidade = 1000000000;

meuCarro.velocidade = -7;

Page 22: Programação Orientada a Objetos com Java

Métodos de Acesso

• Padrão Java Bean

– Getters, para recuperar valores

– Setters, para definir ou alterar valores

Page 23: Programação Orientada a Objetos com Java

Getter e Setter

public class Carro {

int velocidade = 0;

void setVelocidade(int velocidade) {

this.velocidade = velocidade;

}

int getVelocidade() {

return velocidade;

}

}

Page 24: Programação Orientada a Objetos com Java

Modificadores de Acesso

public class Carro {

private int velocidade = 0;

public void setVelocidade(int velocidade) {

this.velocidade = velocidade;

}

public int getVelocidade() {

return velocidade;

}

}

Page 25: Programação Orientada a Objetos com Java

Modificadores de Acesso

public class Carro {

private int velocidade = 0;

public void setVelocidade(int velocidade) {

if (velocidade >= 0 && velocidade < 160)

this.velocidade = velocidade;

}

}

Page 26: Programação Orientada a Objetos com Java

Acoplamento

É a interdependência entre as classes

Page 27: Programação Orientada a Objetos com Java

Coesão

Envolve a divisão de responsabilidades entre as

classes

Page 28: Programação Orientada a Objetos com Java

Acoplamento e Coesão

• Acoplamento forte, baixa coesão

– Ruim

• Acoplamento fraco, alta coesão

– Bom

Page 29: Programação Orientada a Objetos com Java

Exercícios

5. Altere a classe Cliente e as demais classes dos exercícios

anteriores aplicando os conceitos de encapsulamento,

acoplamento e coesão.

Dica: crie uma outra classe MailUtil com os respectivos

métodos.

6. Implemente uma classe Bicicleta, crie duas instância de

cores e marcas diferentes, faça elas correrem a 20 e

30km/hora.

Page 30: Programação Orientada a Objetos com Java

Instanciação

Carro carro = new Carro();

Page 31: Programação Orientada a Objetos com Java

Construtores

public class Carro {

private int velocidade;

public Carro(int velocidadeInicial) {

this.velocidade = velocidadeInicial;

}

}

Page 32: Programação Orientada a Objetos com Java

Instanciação

Carro carro = new Carro(10);

Page 33: Programação Orientada a Objetos com Java

Exercício 7

Modifique o Cliente criado anteriormente de

forma que os valores dos atributos sejam

definidos através de um construtor.

Page 34: Programação Orientada a Objetos com Java

Atributos estáticos

public class Carro {

private String marca;

public Carro(String marca) {

this.marca = marca;

}

public void imprimeMarca() {

System.out.println(marca);

}

}

Atributo “comum” de instância

Page 35: Programação Orientada a Objetos com Java

Atributos estáticos

Carro gol = new Carro("Gol");

Carro palio = new Carro("Palio");

gol.imprimeMarca();

palio.imprimeMarca();

Qual o resultado?

Page 36: Programação Orientada a Objetos com Java

Atributos estáticos

public class Carro {

private static String marca;

public Carro(String marca) {

Carro.marca = marca;

}

public void imprimeMarca() {

System.out.println(marca);

}

}

Atributo estático

Page 37: Programação Orientada a Objetos com Java

Atributos estáticos

Carro gol = new Carro("Gol");

Carro palio = new Carro("Palio");

gol.imprimeMarca();

palio.imprimeMarca();

Qual o resultado?

Page 38: Programação Orientada a Objetos com Java

Métodos estáticos

public class ConexaoComBanco {

public static Conexao abrirConexao() {

return new Conexao(

servidor, usuario, senha);

}

}

Page 39: Programação Orientada a Objetos com Java

Exercícios

8. Crie um método estático que calcule a raiz quadrada de um

número. Utilize o método estático sqrt da classe Math.

9. Altera a classe MailUtil do exercício 5 para que os métodos

sejam estáticos

10. Crie uma classe que conte o número de instâncias criadas

dela mesma.

Page 40: Programação Orientada a Objetos com Java

Herança

Veiculo

Carro Motocicleta

Variação

Page 41: Programação Orientada a Objetos com Java

Herança

Carro

CarroDePasseio CarroDeCorrida

Especialização

Page 42: Programação Orientada a Objetos com Java

Herança

class Veiculo {

private int velocidade = 0;

void acelerar() {

velocidade++;

}

void frear() {

velocidade--;

}

}

Superclasse

Page 43: Programação Orientada a Objetos com Java

Herança

class Carro extends Veiculo {

private boolean vidrosAbertos;

void abaixarVidros() {

vidrosAbertos = true;

}

void levantarVidros() {

vidrosAbertos = false;

}

}

Subclasse (1)

Page 44: Programação Orientada a Objetos com Java

Herança

class Motocicleta extends Veiculo {

boolean cavaleteAbaixado = false;

void apoiarCavelete() {

cavaleteAbaixado = true;

}

}

Subclasse (2)

Page 45: Programação Orientada a Objetos com Java

Herança

Carro c = new Carro();

c.abaixarVidros();

c.acelerar();

Carro é um Veículo

Page 46: Programação Orientada a Objetos com Java

Herança

Motocicleta m = new Motocicleta();

m.acelerar();

m.frear();

m.apoiarCavalete();

Motocicleta é um Veículo

Page 47: Programação Orientada a Objetos com Java

Herança

class Veiculo {

public int velocidade;

protected int velocidade;

private int velocidade;

}

class Carro extends Veiculo {

void acelerar() {

velocidade++;

}

}

Visibilidade nas Subclasses

Page 48: Programação Orientada a Objetos com Java

Herança

class Carro{

protected int velocidade;

public void acelerar() {

velocidade++;

}

}

class CarroDeCorrida extends Veiculo {

@Override

public void acelerar() {

velocidade += 10;

}

}

Sobrescrita de Métodos

Page 49: Programação Orientada a Objetos com Java

Herança

class Carro{

private int velocidade;

public void acelerar() {

velocidade++;

}

}

class CarroDeCorrida extends Veiculo {

@Override

public void acelerar() {

super.acelerar();

}

}

Executando um Método Sobrescrito

Page 50: Programação Orientada a Objetos com Java

Herança

Veiculo

Carro

Gol

Vários Níveis de Herança

Page 51: Programação Orientada a Objetos com Java

Herança

class Veiculo {

}

class Carro extends Veiculo {

}

class Gol extends Carro {

}

Vários Níveis de Herança

Page 52: Programação Orientada a Objetos com Java

Herança

class Carro

extends Veiculo, MeioDeTransporte {

}

Herança Múltipla Não Existe

Page 53: Programação Orientada a Objetos com Java

Exercício 11

• Crie uma hierarquia de pessoas.

• A superclasse deve chamar-se Pessoa.

• Crie algumas subclasses para diferentes

tipos de pessoas (PF, PJ?).

• Defina atributos e comportamentos gerais

e especializados para cada tipo de

pessoa.

Page 54: Programação Orientada a Objetos com Java

Classes e Métodos Abstratos

abstract class Veiculo {

abstract void acelerar();

}

class Carro extends Veiculo {

private int velocidade;

void acelerar() {

velocidade++;

}

}

Page 55: Programação Orientada a Objetos com Java

Exercício 12

• Altere a classe Pessoa do exercício 11 de

forma que ela seja abstrata.

Page 56: Programação Orientada a Objetos com Java

Classes e Métodos Abstratos

abstract class Ordenacao {

abstract int comparar(

Object a, Object b);

void ordenar(Object[] v) {

//bubble sort

}

}

Strategy Pattern

Page 57: Programação Orientada a Objetos com Java

Exercício 13

• Use o método de ordenação Bolha e

implemente uma classe concreta usando

o Strategy Pattern, conforme proposto no

slide anterior.

for (int i = 0; i < v.length; i++) { for (int x = 1; x < v.length - i; x++) {

if (comparar(v[x - 1], v[x]) > 0) { Object aux = v[x - 1]; v[x - 1] = v[x]; v[x] = aux;

} }

}

Page 58: Programação Orientada a Objetos com Java

Herança?

Tem algo podre no reino da Dinamarca

Page 59: Programação Orientada a Objetos com Java

Herança?

Ave

Beija-flor Pardal

void voar()

Page 60: Programação Orientada a Objetos com Java

Herança?

Ave

Beija-flor Pardal

void voar()

Avestruz

???

Page 61: Programação Orientada a Objetos com Java

Herança?

???

Page 62: Programação Orientada a Objetos com Java

Interfaces

• Contrato de comportamento

• Todos os métodos abstratos

• É uma classe 100% abstrata

Ao resgate!

Page 63: Programação Orientada a Objetos com Java

Interfaces

interface Veiculo {

void acelerar();

void frear();

}

Declarando

Page 64: Programação Orientada a Objetos com Java

Interfaces

interface Veiculo {

void acelerar();

void frear();

}

public Carro implements Veiculo {

public void acelerar() { }

public void frear() { }

}

Implementando

Page 65: Programação Orientada a Objetos com Java

Interfaces

interface Voador {

void voar();

}

interface Corredor {

void correr();

}

interface Falador {

void falar();

}

Page 66: Programação Orientada a Objetos com Java

Interfaces

class Papagaio implements Voador, Falador {

public void voar() { }

public void falar() {

System.out.printlmn("Loro!");

}

}

class Cachorro implements Corredor, Falador {

public void correr() { }

public void falar() {

System.out.println("Au! Au!");

}

}

Implementando várias Interfaces

Page 67: Programação Orientada a Objetos com Java

Exercício 14

• Crie a interface ContaCliente, com

métodos para consultar o saldo, debitar e

creditar dinheiro.

• Implemente um método transferencia

que receba duas contas e um valor e

execute a transação necessária.

Trabalhando com Abstração

Page 68: Programação Orientada a Objetos com Java

Polimorfismo

• A capacidade de um mesmo objeto de se

apresentar de várias formas

Papagaio papagaio = new Papagaio();

Voador bichoQueVoa = papagaio;

Falador bichoQueFala = new Papagaio();

Page 69: Programação Orientada a Objetos com Java

Polimorfismo

• Um tipo mais específico sempre pode ser

atribuído a uma variável de tipo mais

genérico, nunca o contrário.

Voador bichoQueVoa = papagaio;

Papagaio papagaio = bichoQueVoa;

Page 70: Programação Orientada a Objetos com Java

Polimorfismo

• Força uma “conversão”

• Não afeta o objeto

• Pode resultar em erro se não for do

mesmo tipo

Papagaio papagaio = (Papagaio) bichoQueVoa;

Cast

Page 71: Programação Orientada a Objetos com Java

Polimorfismo

Verificando o Tipo

if (bichoQueVoa instanceof Papagaio) {

System.out.println("Sim, é um papagaio!");

} else {

System.out.println("Não é um papagaio!");

}

Page 72: Programação Orientada a Objetos com Java

Exercício 15

• Usando o exemplo de polimorfismo com

animais, Implemente um método que

receba um Voador e descubra se ele é

um Papagaio.

• Execute o método duas vezes, uma

passando uma instância de Papagaio e

depois outra subclasse de Voador.

Page 73: Programação Orientada a Objetos com Java

Exceções

• Classes que representam erros de

execução

• Criadas pelo Java ou manualmente

• Objeto contém informações do erro

– Descrição, Mensagem, Local

Page 74: Programação Orientada a Objetos com Java

Exceções

Lançando uma Exceção

throw new Exception("Meu próprio erro")

Page 75: Programação Orientada a Objetos com Java

Exceções

Novas Exceções

class ErroPersonalizadoException

extends Exception {

}

Page 76: Programação Orientada a Objetos com Java

Exceções

Hierarquia de Classes

Verificadas e Não Verificadas

Throwable

Error Exception

RuntimeException

NullPointerExceptionNumberFormatExceptionArrayIndexOutOfBoundsException

IOExceptionSQLException

Page 77: Programação Orientada a Objetos com Java

Exceções

• Exception

– Erros esperados pelo programa

• RuntimeException

– Erros inesperados do programa

• Error

– Erros anormais, totalmente inesperados

Categorias

Page 78: Programação Orientada a Objetos com Java

Exceções

Tratar uma Exceção

void verificarNome(String nome) throws Exception {

if (nome == null) {

throw new Exception("Nome não preenchido!");

}

}

void meuMetodo() {

try {

verificarNome(null);

} catch(Exception e) {

e.printStackTrace();

}

}

Page 79: Programação Orientada a Objetos com Java

Exceções

Repassar uma Exceção

void verificarNome(String nome) throws Exception {

if (nome == null) {

throw new Exception("Nome não preenchido!");

}

}

void meuMetodo() throws Exception {

verificarNome(null);

}

Page 80: Programação Orientada a Objetos com Java

Exceções

Ignorar uma Exceção Não Verificada

void verificarNome(String nome) {

if (nome == null) {

throw new RuntimeException(

"Nome não preenchido!");

}

}

void meuMetodo() {

verificarNome(null);

}

Page 81: Programação Orientada a Objetos com Java

Exceções

Exceções “Inesperadas”

• Por que ocorrem?

• Causas frequentes:

– Casos não previstos

– Falta de atenção ao codificar

– Suposições “ingênuas” sobre inputs

Page 82: Programação Orientada a Objetos com Java

Exceções

Exceções “Inesperadas”

void criarVeiculo(char tipo) {

Veiculo veiculo = null;

if (tipo == 'C') {

veiculo = new Carro();

} else (tipo == 'M') {

veiculo = new Motocicleta();

}

veiculo.acelerar();

}

!?

Page 83: Programação Orientada a Objetos com Java

Exercício 16

• Crie duas novas exceções:

– ValidacaoException (verificada)

– ParametroInvalidoException (não verificada)

• Implemente um método validarCPF que receba uma String

e lance a exceção verificada no caso dela não ter 11

caracteres e lance a exceção não-verificada se o parâmetro

for nulo

• Implemente outro método que chame a validação e trate

apenas a exceção verificada

Page 84: Programação Orientada a Objetos com Java

Coleções

Listas

List<String> minhaLista = new ArrayList<String>();

minhaLista.add("Arroz");

minhaLista.add("Feijão");

minhaLista.add("Farinha");

System.out.println( minhaLista.get(0) );

Page 85: Programação Orientada a Objetos com Java

Coleções

Listas

List minhaLista = new ArrayList();

minhaLista.add("Arroz");

minhaLista.add("Feijão");

minhaLista.add("Farinha");

System.out.println( minhaLista.get(0) );

Page 86: Programação Orientada a Objetos com Java

Coleções

Conjuntos

Set<Integer> meuConjunto = new HashSet<Integer>();

meuConjunto.add(1);

meuConjunto.add(2);

meuConjunto.add(3);

meuConjunto.add(1);

System.out.println(meuConjunto);

Page 87: Programação Orientada a Objetos com Java

Coleções

Mapas

Map<Integer, String> alunosPorMatricula =

new HashMap<Integer, String>();

alunosPorMatricula.put(1, "João");

alunosPorMatricula.put(2, "Maria");

alunosPorMatricula.put(3, "José");

System.out.println( alunosPorMatricula.get(1) );

Page 88: Programação Orientada a Objetos com Java

Exercícios

17. Implemente uma classe Carrinho, contendo um carrinho

de compras. Use uma lista e tenha métodos para adicionar

itens no carrinho e contabilizar o total.

18. Implemente uma classe que receba dados estatísticos

contendo a idade de N pessoas e totalize as idades por faixas

etárias (0 a 10 anos, 11 a 20 anos, etc.). A classe deve ter um

método para recuperar o total de pessoas de uma

determinada faixa etária.

Page 89: Programação Orientada a Objetos com Java

Não tenha medo...

Dúvidas?