java 02

81
Curso Superior de Tecnologia em Telemática Programação Orientada a Objetos Programação Orientada a Objetos Copyright©2010 Prof. César Rocha – [email protected]

Upload: samuelthiago

Post on 06-Jun-2015

1.194 views

Category:

Education


0 download

DESCRIPTION

Conceitos iniciais de Programação Orientada à Objetos.

TRANSCRIPT

Page 1: Java 02

Curso Superior de Tecnologia em TelemáticaProgramação Orientada a Objetos

Programação Orientada a Objetos

Copyright©2010Prof. César Rocha – [email protected]

Page 2: Java 02

2

Roteiro

• Em poucos slides, apresentar alguns fundamentosfundamentos importantes relacionados à ProgramaçãoProgramação Orientada a ObjetosOrientada a Objetos– Características OO em Java: classes, atributos, métodos, herança, abstração,

encapsulamento, polimorfismo, etc...

• Sintaxe Java para construção de entidades complexas–– Componentes de uma classeComponentes de uma classe e sua divisão interna

• Mostrar um exemplo para levantar as vantagens da programação OO– Exercícios iniciais e exemplos de códigoscódigos que você deve testar e solidificar

seus conhecimentos (mas você deve ler um livro!)

Page 3: Java 02

3

Programação estruturada vs. POO

• Programação estruturadaestruturada– Ênfase dada aos procedimentosprocedimentos e funçõesfunções

– Modela-se a solução de um problema tomando como base as funçõesfunções a serem executadas (os verbosverbos!)

• Programação orientadaorientada aa objetosobjetos– Modela-se um sistema decidindo-se sobre os objetosobjetos

– Estes, então, são caracterizados através de propriedadespropriedades (que informações cada objeto deve armazenar?) e comportamentocomportamento (que tarefas cada objeto deverá desempenhar?)

Page 4: Java 02

4

Abstração de casos de uso emanálise OO (I) e análise procedural (II)

Referência da figura: [1]

Page 5: Java 02

5

Programação estruturada vs. POO

• Algumas considerações importantes:– desenvolvedor vê seu sistema como uma coleçãocoleção dede objetosobjetos cooperantes, que

se comunicam entre si através do envio e recebimento de mensagensmensagens

• “Programação orientada a objetos é um método de implementação noqual programas são organizadosprogramas são organizados como coleções cooperativas de objetosobjetos, cada um representando uma instânciainstância de alguma classeclasse, e estas classes são todas membros de uma hierarquiahierarquia de classes unidas via relacionamentos de herançaherança...”[2]

Page 6: Java 02

6

Como fazer a modelagem inicial?

• Deve-se descobrir quais objetos fazem parte do domínio do problema

• Na POO, cada objeto terá uma estrutura formada por um estado e um comportamento definidos através de classes– Definem-se as propriedades (variáveis) e o comportamento (métodos) que

uma categoria de objetos deve possuir

• Uma classe é o modelomodelo ou a fôrmafôrma (um template) utilizada para criar objetos similares (que compartilham as mesmas características).– Ela também define um novo tipo de dados na linguagem Java.

– Lembre-se: queremos mapear “coisas” do mundo real -> computacional

Page 7: Java 02

7

Uma boa analogia...

• Uma classe define um novo tipoum novo tipo de dados complexo• Valores de um tipo definido por uma classe recebem o nome de

objetosobjetos

Referência da figura: [4]

Page 8: Java 02

8

Sintaxe de uma classe

• Estrutura fundamental de programação em Java!– Todo e qualquer programa Java deve definir pelo menos uma classe.

•• Sintaxe básica:Sintaxe básica:

<modificador> class <nomeDaClasse> {

}

<modificador> class <nomeDaClasse> {

}

ATRIBUTO(S)

CONSTRUTOR(ES)

MÉTODO(S)

Código em Java(CdPlayer.java)

class CdPlayer {int faixaAtual;String marca;

…CdPlayer() {…}

void tocar() {…}void parar() {…}

class CdPlayer {int faixaAtual;String marca;

…CdPlayer() {…}

void tocar() {…}void parar() {…}

Comportamento

Estado

Page 9: Java 02

9

Atributos

• Definição formal:– “... o estado de um objeto consiste de todas as propriedades do objeto mais

os valores atuais destas propriedades...”[2]

– cada atributo tem um tipo e armazena um valor que pode variar ao longo do tempo (é dinâmico!)

/* CdPlayer.java */class CdPlayer {

int faixaAtual;String marca;double preco;…

};

/* CdPlayer.java */class CdPlayer {

int faixaAtual;String marca;double preco;…

};Objeto

CdPlayer

- a quantidade de propriedades não muda!Importante:

- os valores guardados são dinâmicos!

05

“Gradiente”

172.69

... criação

Page 10: Java 02

10

Tipos de dados

figura: [1]

Page 11: Java 02

11

Métodos

• O comportamento de um objeto é dado pelo conjunto de conjunto de operaçõesoperações que o mesmo é capaz de realizar– Entenda isso como sua “interface de uso”– Um método é um procedimentoprocedimento ou funçãofunção que permite aos objetos de uma

classe executarem serviços (é a parte da programação imperativa em OO)

• É como o objeto implementa suas funcionalidades• O envio de uma mensagem para um objeto faz o método

correspondente (de mesmo nome) ser executado• A mensagemmensagem, então, é a ativaçãoativação de um métodode um método sobre o objeto

Page 12: Java 02

12

Classe, estado e comportamento

• Portanto, classesclasses descrevem:– os dados que compõem os objetos (variáveis)– procedimentos que o objeto poderá executar (métodos)

CdPlayer

faixaAtual:int;marca:String;preço:double;

tocar():voidparar():void;mudarFaixa(f:int):void;repetirCd():void;ejetarCd():void;

variáveis instância

métodos

(...)CdPlayer cp;cp = new CdPlayer();

cp.tocar();cp.mudarFaixa(12);cp.ejetarCd();(...)

(...)CdPlayer cp;cp = new CdPlayer();

cp.tocar();cp.mudarFaixa(12);cp.ejetarCd();(...)

Código em Java

Classe Java (tipo)

Referência

Envio de mensagem

(sabe)

(faz)

Criação do objeto

- não é preciso saber os detalhes de implementação!Importante:- o tipo determina a interface de um objeto.- a interface indica que mensagens podem ser enviadas.

Fase de análise e projeto

Fase de implementação

UMLUML

Page 13: Java 02

13

Boas práticas ao escrever classes

• Use e abuse dos espaços– Endente com um tab (4 espaços) os membros (métodos, atributos, construtores, etc.) de uma

classe

• A ordem dos membros não é importante, mas melhora a legibilidade do código– Mantenha os membros do mesmo tipo juntos (não misture métodos com atributos, por exemplo)– Declare os atributos antes ou depois dos métodos – Mantenha os construtores juntos, de preferência, bem no início da classe (após os atributos)– Mantenha os métodos depois dos construtores

Page 14: Java 02

14

Abstração

• Deve-se abstrairabstrair os objetos – Para entender uma entidade escrita por terceiros, abstraímos a sua abstraímos a sua

implementação e nos concentramos na sua interface de utilizaçãoimplementação e nos concentramos na sua interface de utilização

• Foca o lado externo de uma entidade ou objeto

• Destaca o comportamentocomportamento (ou serviços disponíveis) do objeto• O comportamento essencial do objeto é caracterizado por meio das

operações que ele é capaz de realizaroperações que ele é capaz de realizar sobre ele mesmo ou sobre outros objetos

Page 15: Java 02

15

Abstração

Referência da figura: [2]

Page 16: Java 02

16

Abstração

• Conceito de abstração:– “Processo mental que consiste em escolher ou isolarisolar um aspecto

determinado de um estado de coisas relativamente complexo, a fim de simplificar a sua avaliaçãosimplificar a sua avaliação, classificação ou para permitir a comunicação do mesmo [Dicionário Houassis]”

– “Uma abstração denota as características essenciais de um objeto que o distinguem de outros tipos de objetos e assim provê uma fronteirafronteiraconceitual firmemente definida, de acordo com a perspectiva do observador [Booch]”

Page 17: Java 02

17

Abstração

• Na programação de computadores:– Abstrair um conceito é limitar-se a representar este conceito numa

linguagem de programação apenas em seus detalhes necessários à aplicaçãoapenas em seus detalhes necessários à aplicação• Por exemplo, um sistema bancário abstrai a entidade real Banco em apenas alguns

dados que são importantes (endereço, num. funcionários, nome do banco, etc)

– Não é necessário guardar/conhecer nestes tipos de sistemas como todos os serviços de um dado banco foram realmente implementados

• Onde são guardadas as contas, como elas foram representadas, etc.• Estamos interessados em apenas utilizar os serviços de um banco.

Page 18: Java 02

18

Abstração

• Abstração é um conceito amplo– Abstração de procedimentos (você já percebeu isto?)

• Dividimos um programa em subprogramas menores e mais fáceis de escrever e compreender (dividir para conquistar)

• Para usar uma função escrita por terceiros, abstraímos a sua implementação e nos concentramos na sua interface

– Abstração de dados• Serve para representarmos entidades reais numa linguagem de computador,

identificando as propriedades destas entidades que realmente interessam no sistema• Ex.: um cliente poderia ter um nome, idade, salário, etc.

Page 19: Java 02

19

Abstração

• Em síntese, a ABSTRAÇÃO:– Uma abstração possui tanto propriedades estáticas quanto dinâmicas

• Atributos que guardam o estado atual da abstração• As dinâmicas (operações)

• Foca o lado externo de uma entidade ou objeto– Destaca o comportamentocomportamento (ou serviços disponíveis) nativo do objeto

• O comportamento essencial do objeto é caracterizado por meio dasoperações que ele é capaz de realizaroperações que ele é capaz de realizar sobre ele mesmo ou sobre outros objetos

Page 20: Java 02

20

Encapsulamento

• Foi visto que objetos são formados de duas partes:� interface: métodos declarados (visão externa)�implementação: a funcionalidade interna (oculta) do objeto

• Geralmente, é interessante proibir acessoacesso aos atributos de dados (e até de alguns métodos)– Utilizando-se de modificadores de níveis de acesso extremos, tais como: public

e private (e outros níveis intermediários, fornecidos pela linguagem Java)– Impacto será menor para quem está usando a classe

• O papel do usuário de classes– Apenas saber quais os métodos,parâmetros e o que é retornado(a interface pública da classe). figura: [2]

Page 21: Java 02

21

public class Livro {private String titulo;private double preco;public double getPreco(){

return preco;}public void setPreco(double p){preco = (p >=0)? p : preco;

}

public class Livro {private String titulo;private double preco;public double getPreco(){

return preco;}public void setPreco(double p){preco = (p >=0)? p : preco;

}

públ

ico

inte

rno

Cenário de utilização• Visibilidade do encapsulamento em livro:

public class Livraria {private int numFuncionarios;public void cadastrarLivro(String isbn){

...}public void aplicarDesconto(Livro l){

l.preco = -10;...

}

public class Livraria {private int numFuncionarios;public void cadastrarLivro(String isbn){...

}public void aplicarDesconto(Livro l){

l.preco = -10;...

}

O acesso irrestrito às O acesso irrestrito às propriedades do Livro propriedades do Livro pode levar o mesmo a pode levar o mesmo a um estado um estado inconsistente. Veja.inconsistente. Veja.

* E se amanhã preco mudasse para precoDoLivro?

Acesso proibido!Acesso proibido!

C

Page 22: Java 02

22

Encapsulamento

• Conceitos complementares:– A abstração representa um conceito

– O encapsulamento, por sua vez, impede os clientes de verem/conhecerem como este conceito foi implementado internamente

• Para uma abstração realmente funcionar, sua implementação deve estar encapsulada

• Os objetos são formados de duas partes:– Uma interface (visão externa)

– Uma implementação (a funcionalidade interna e oculta)

Page 23: Java 02

23

Encapsulamento (cont.)

• A implementaçãoimplementação não interessanão interessa à quem usausa os objetos• Papel do usuário de classes

– Não precisa saber como a classe foi escrita, apenas quais seus métodos, quais os parâmetros (quantidade, ordem e tipo) e os valores que são retornados

– Usa apenas a interface pública da classe

• Papel do desenvolvedor de classes– Define novos tipos de dados– Expõe, através dos métodos, todas as funções necessárias aos usuários das classes e

oculta o resto da implementação– Tem a liberdade de mudar a implementação das classes que cria sem que isto

comprometa as aplicações desenvolvidas pelos usuários das classes

Page 24: Java 02

24

Métodos de acesso

• Uma vez que o encapsulamento favorece a evolução do sistema, geralmente, faz-se necessário definir métodos de acesso em atributos:– acessar/ler get<XXX>( ) ou alterar set<XXX>() os valores das

propriedades de objetos

public class Livro {private String titulo;private double preco;public double getPreco(){

return preco;}public void setPreco(double p){

preco = (p >=0)? p : preco;}

public class Livro {private String titulo;private double preco;public double getPreco(){return preco;

}public void setPreco(double p){preco = (p >=0)? p : preco;

}

Implementação foi Implementação foi encapsulada com o encapsulada com o

uso de uso de privateprivate

Método que retorna Método que retorna um valor (um valor (doubledouble))

* Há casos de métodos private e atributos públicos

públ

ico

inte

rno

Previne valores Previne valores inconsistentesinconsistentes

Page 25: Java 02

25

Criação de objetos

• Para criar objetos, algumas linguagens implementam certos “métodos especiais”, ou construtoresconstrutores– Utilizados para criar e/ou inicializar novos objetos

• Em Java, os construtores têm o mesmo nome da classe

• A alocação de todo o objeto em memória é feita com o uso do operador newnew– Aloca o objeto na memória do tipo de uma classe e devolve o endereço para

ser usado numa variável Livro l = new Livro();l.setPreco(126.80);double valor = l.getPreco();

Livro l = new Livro();l.setPreco(126.80);double valor = l.getPreco();Lembre-se: objetos precisam ser objetos precisam ser

criados antes de serem usadoscriados antes de serem usados

C

Page 26: Java 02

26

Construtores

•• LembreLembre--se:se: para a criação de objetos, Java garante que cada classe tenha ao menos um construtor– O construtorconstrutor defaultdefault recebe zero argumentos

– Faz apenas a inicialização da superclasse

• Construtor default (sem argumentos) só existe (é fornecido) quando não há nenhum outro construtor definido explicitamente no código– A criação de um construtor explícito substitui o construtor fornecido

implicitamente pelo sistema

– Mas a inicialização da superclasse continua garantida

Page 27: Java 02

27

Graficamentepublic class Livro {private String titulo;private double preco;public Livro(){

super();}public double getPreco(){…}public void setPreco(double p){…}

public class Livro {private String titulo;private double preco;public Livro(){

super();}public double getPreco(){…}public void setPreco(double p){…}

públ

ico

inte

rno

public class Livro {private String titulo;private double preco;// construtor explícitopublic Livro(String t, double p){

titulo = t; // setTitulo(t);preco = p; // setPreco(p);

}public double getPreco(){…}public void setPreco(double p){…}public String getTitulo(){…}public void setTitulo(String t){…}

}

public class Livro {private String titulo;private double preco;// construtor explícitopublic Livro(String t, double p){

titulo = t; // setTitulo(t);preco = p; // setPreco(p);

}public double getPreco(){…}public void setPreco(double p){…}public String getTitulo(){…}public void setTitulo(String t){…}

}

públ

ico

inte

rno

Dica:Dica: Construtor já estaria “em Construtor já estaria “em dia”com as regras de validação dia”com as regras de validação

definidas em métodos de acesso.definidas em métodos de acesso.

Construtor Construtor defaultdefault faz faz apenas a apenas a inicializaçãoinicializaçãoda superclasse da superclasse (construtor de (construtor de ObjectObject))

Poderia ter outros Poderia ter outros construtores*construtores*

C

* Distinção é feita pelo número e tipo de argumentos (ou seja, pela assinatura do construtor)

Page 28: Java 02

28

Ciclo de vida de um Objeto

• A linha da vida de um objeto:

1)1) Instanciação:Instanciação: o objeto é criado e passa a ser referenciado por um nome (sua referência);

2)2) Uso:Uso: o objeto recebe mensagens de outros objetos e, com isso, executa parte da funcionalidade do sistema;

3)3) Destruição:Destruição: a área de memória ocupada pelo objeto é reclamada...todas as referências para o objetos ficam nulas.

• A destruição de um objeto é realizada automaticamente pelo coletor de lixo!• Minimiza o trabalho do programador.

Page 29: Java 02

29

Exemplo – Ciclo de vida de um Objeto

Quadrado q;

q = new Quadrado();

q.moverDireita(20);q.mudarTamanho(5); q.ficarVisivel(false);q.mudarCor(“red”);

q = null;

Page 30: Java 02

30

Exemplo – Ciclo de vida de um Objeto

• Esquematicamente:q

visivel: false

tamanho: 5

cor: “red”

new

Referência da figura: [4]

Page 31: Java 02

31

Instanciação de Objetos

• Definição– Operação através da qual um objeto é criado e passa a existir na memória

do computador. A classe é o modelomodelo ou a fôrmafôrma utilizada para criar o objeto.

• Objeto versus referências– Os objetos são manipulados através de referências ou ponteiros que indicam

onde o objeto está localizado na memória do computador

– Não há outra forma de chegar ao objeto sem que seja via uma referência.• Lembre de Bruce Eckel e sua analogia do controle da televisão!

Page 32: Java 02

32

Referências para objetos

• A maioria dos objetos em um programa Java são acessados por variáveis chamadas de referênciasreferências

• Como Java é uma linguagem fortementefortemente tipadatipada, estas variáveis devem ser declaradas e tipificadas em tempo de compilação

• Exemplos:

String s; // s é do tipo StringQuadrado q1; // q1 é do tipo QuadradoCliente c; // c é um cliente

Page 33: Java 02

33

Referências para objetos

• Referências são ponteiros para o objetoQuadrado q; // declaraçãoq = new Quadrado(); // instanciaçãoq.mudeTamanho(50); // usoq = null; // desprezo

q

Page 34: Java 02

34

Referências para objetos

• Referências são ponteiros para o objetoQuadrado q; // declaraçãoq = new Quadrado(); // instanciaçãoq.mudeTamanho(50); // usoq = null; // desprezo

qtamanho: 30

Page 35: Java 02

35

Referências para objetos

• Referências são ponteiros para o objetoQuadrado q; // declaraçãoq = new Quadrado(); // instanciaçãoq.mudeTamanho(50); // usoq = null; // desprezo

qtamanho: 50

Page 36: Java 02

36

Referências para objetos

• Referências são ponteiros para o objetoQuadrado q; // declaraçãoq = new Quadrado(); // instanciaçãoq.mudeTamanho(50); // usoq = null; // desprezo

qtamanho: 50

Objeto sem referência!

Page 37: Java 02

37

Variáveis de classe

• Foi visto que as variáveis de instância residem dentro de objetos e possuem valores (geralmente) individuais– Cada vez que um objeto é criado, novas propriedades são alocadas para uso daquele

objeto em particular

• Às vezes, um sistema pode ter variáveis contendo informações úteis, como:– Número de objetos instanciados pela classe até certo instante

– Valor médio, mínimo..

•• Pense um pouco:Pense um pouco:sdfdsfsdfsdfsdfdsfdsfdsfdsfdsfdsdsfdssdfsdfada um dos objetos?

public class Agencia {private String endereco;private int numFuncionarios;private double juros;

public String getEndereco(){…}public void ligarAlarme(){…}

}

public class Agencia {private String endereco;private int numFuncionarios;private double juros;

public String getEndereco(){…}public void ligarAlarme(){…}

}

públ

ico

inte

rno

Imagine um sistema bancário onde o juros é Imagine um sistema bancário onde o juros é compartilhado pelas agências de uma rede compartilhado pelas agências de uma rede de bancos.de bancos.

Seria interessante armazenar este dado em Seria interessante armazenar este dado em cada instância?cada instância?

Page 38: Java 02

38

Graficamente

a1

Classes

Pilha

Sistema Operacional

0xFF29

1ª tentativa1ª tentativaTornar esta variável como Tornar esta variável como

propriedades das instâncias propriedades das instâncias

2ª tentativa2ª tentativaA única cópia residindo apenas na classe A única cópia residindo apenas na classe

(alterações apenas em um local)(alterações apenas em um local)

objAgManaíra

objAgTambaú

objAgVaradouro

0x32940x5549

a2

a3

a1

Classes

Pilha

Sistema Operacional

0xFF29

Heap

objAgManaíra

objAgTambaú

objAgVaradouro

0x32940x5549

a2

a3

Page 39: Java 02

39

Resumo

• Os objetos instanciados pela classe podem acessar as variáveis de classe (para modificar ou ler o valor)

• A modificação numa variável de classe é percebida por todos os objetos

• A variável de classe fica armazenada na classena classe e não nas instâncias geradas

• É comum o uso em destas para definir constantes– PI, MAX_IDADE,...

public class Agencia {private String endereco;private int numFuncionarios;public static final double juros;

public String getEndereco(){…}public void ligarAlarme(){…}

}

public class Agencia {private String endereco;private int numFuncionarios;public static final double juros;

public String getEndereco(){…}public void ligarAlarme(){…}

} públ

ico

inte

rno

C

Page 40: Java 02

40

Strings

• Você deve ter percebido no curso de Java básico que não existe o tipo primitivo String em Java– Em verdade, string’s em Java são objetos!

– A API Java possui uma classe chamada String

– Esta, apresenta um rico conjunto de métodos utilitários que permitem extrair o tamanho, buscar caracteres, sub-strings, comparações…

public class UsaString {public static void main(String[] args){

String s1 = “Maria”;String s2 = new String(“Maria”);if( s1 == s2 ) //falsoif( s1.equals(s2) ) // verdadeiroSystem.out.print( s1 + “ da Silva” );

}

public class UsaString {public static void main(String[] args){String s1 = “Maria”;String s2 = new String(“Maria”);if( s1 == s2 ) //falsoif( s1.equals(s2) ) // verdadeiroSystem.out.print( s1 + “ da Silva” );

}

Page 41: Java 02

41

Arrays

• Arrays em Java também são objetos e armazenam elementos de um determinado tipo em particular

• Porém, como temos duas categorias de tipos em Java, é possível declarar arrays:� Primitivos: armazenam tipos primitivos nas células� Referência: armazenam referências (nunca objetos inteirosnunca objetos inteiros) em cada

célulapublic class ArrayPrimitivo {public static void main(…){

int[] vi = {55,66,77};double[] vd = new double[7];vd[6] = 99.5; vi[2] = 88;

}

public class ArrayPrimitivo {public static void main(…){int[] vi = {55,66,77};double[] vd = new double[7];vd[6] = 99.5; vi[2] = 88;

}

public class ArrayReferencia {public static void main(…){

Livro[] vl = new Livro[3];vl[0] = new Livro();vl[0].setTitulo(“O Sol”);

}

public class ArrayReferencia {public static void main(…){

Livro[] vl = new Livro[3];vl[0] = new Livro();vl[0].setTitulo(“O Sol”);

}

Page 42: Java 02

42

Herança

• Permite reutilizar as características de uma classe (base) na definição de uma outra classe derivada e mais específica

– Reutilização direta de código previamente definido por alguém em uma superclasse

• Terminologias relacionadas à Herança– Classes mais generalizadas: superclasses– Mais especializadas: subclasses– Na herança, classes estão ligadas à uma hierarquia– É a contribuição original do paradigma OO

• Linguagens como Java, C++, Object Pascal, …

Page 43: Java 02

43

Árvore de herança

• Imagine a modelagem de um sistema para um jogo de luta infantil para computador (com personagens)

Personagem

arma();falar();saltar();

Soldadoarma();

Generalarma();

public class Personagem {public void saltar(){

System.out.println(“Pular”);}public void falar(){

System.out.println(“Avançar!”);}public void arma(){

System.out.println(“Desarmado”);}

}public class Soldado

extends Personagem{public void arma(){System.out.println(“Tiro”);

}}

public class Soldadoextends Personagem{

public void arma(){System.out.println(“Tiro”);

}}

public class General extends Personagem {

public void arma(){System.out.println(“Rajada”);

}}

public class General extends Personagem {

public void arma(){System.out.println(“Rajada”);

}}

Subclasses redefinem comportamentos específicos

Implementações de falar e saltar serão usadas da superclasse

Implementações de falar e saltar serão usadas da superclasse

Classe que define uma interface comum a todos os personagens

Page 44: Java 02

44

Árvore de herança

• União das classes que herdam entre si gera uma árvore de herança(ou uma hierarquia de classes relacionadas)– Todos os objetos herdamherdam características (gerais) definidas em Personagem– Soldado e General são especializaçõesespecializações de Personagem (são tipos de

Personagem)

• Em todos os casos, cada subclasse possui uma única superclasse– A isso, chamamos de herança simplesherança simples

• Em algumas linguagens, é possível herdar a partir de diversas superclasses (e.g., C++)

Page 45: Java 02

45

Benefícios da herança

• Quando relacionamos duas classes via herança, podemos ter polimorfismo com ligação dinâmica– Se um fragmento de código usa uma referência de uma superclasse

(Personagem), esta pode manipular novos tipos concretos futuros• Por exemplo: um novo tipo de personagem (Tenente)

– Isso porque a ligação dinâmica irá garantir que os métodos certos (saltar(), arma(), ...) sejam chamados corretamente

Tenente

...void jogar(Personagem p){p.arma();

}...j1.jogar(new Tenente());

...void jogar(Personagem p){p.arma();

}...j1.jogar(new Tenente());

Novo tipo

Jogo.java

Page 46: Java 02

46

Polimorfismo

•• Polimorfismo Polimorfismo (poli=muitos, morfo=forma) é uma característica essencial de linguagens OO

• Como funciona?– Uma referência que faz papel de interface serve de intermediária fixa entre o

programa-cliente e os objetos que, na verdade, irão executar as mensagens daquele tipo em particular

– O programa-cliente não precisa (e não quer) saber da existência dos outros (ou futuros) objetos

– Objetos podem ser substituídos sem que os programas-cliente (que usam os métodos desta interface) sejam afetados negativamente

Page 47: Java 02

47

Interface vs. implementação

• Polimorfismo permite separar a interface da implementação

• A classe base define a interface comum– Não precisa dizer como isto vai ser feito

Não diz: um General ou um Soldado pode saltar ou falar ou ter uma arma

– Diz apenas que os métodos existem, que eles retornam determinados tipos de dados e que requerem certos parâmetros

Diz: um Personagem pode saltar, falar, e ter uma arma

Estabelece uma interface comum

Implementações da interface (dizem como fazer)

...void jogar(Personagem p){p.saltar();p.falar();p.arma();

}

...void jogar(Personagem p){

p.saltar();p.falar();p.arma();

}

Page 48: Java 02

48

Importante!

• No exemplo anterior, utilizamos o extendsextends (estamos utilizando a herança de classes)– Ao fazer herança, subclasses de Personagem (Soldado, etc.) vão herdar todos os

métodos (não-private) da superclasse – Isto significa que, com herança, vou herdar o tipo da superclasse e também sua

implementação (herança de implementação)– Ao herdar, a subclasse pode fazer override (substituir) de alguns métodos (foi isso

que Soldado fez: ele decidiu poder usar a arma de forma diferente de General, por exemplo)

– Isso significa que objetos da classe Soldado ou da classe General terão formas diferentes de implementar o método arma()arma()

– Portanto, haverá polimorfismo ao chamar p.arma()p.arma()

Page 49: Java 02

49

Ligação dinâmica

• No exemplo anterior, temos um programa com objetos das classes Soldado e General (e outros)

– Portanto, temos duas implementações diferentes do método arma()arma() em cada uma das (sub)classes.

– Quando chamamos p.arma()p.arma(), através da interface, um desses três métodos será chamado (isso vai depender do objeto que receberá a mensagem)

– Achar qual método certo a ser chamado para um objeto em particular chama-se dynamicbinding (ou amarração dinâmica)

– Ora, temos que amarrar a chamada p.arma()p.arma() a uma das implementações de arma()arma()em tempo de execução

Page 50: Java 02

50

public class Personagem {public void saltar(){

System.out.println(“Pular”);};public void falar(){System.out.println(“Avançar!”);

}public void arma(){System.out.println(“Desarmado”);

}}

inte

rno

Exemplo

• Executando os códigos:

Note a presença do Note a presença do supertiposupertipo

C

Ligação dinâmica Ligação dinâmica

public class Tenenteextends Personagem{

public void arma(){System.out.println(“Tiro”);

}}

public class Tenenteextends Personagem{

public void arma(){System.out.println(“Tiro”);

}}

public class Soldado extends Personagem {

public void arma(){System.out.println(“Rajada”);

}}

public class Soldado extends Personagem {

public void arma(){System.out.println(“Rajada”);

}}

public class General extends Personagem {

public void arma(){System.out.println(“Rajada”);

}}

public class General extends Personagem {

public void arma(){System.out.println(“Rajada”);

}}

public class UsaPersonagem {public static void main(String[] args){

Personagem p;p = new Soldado();p.arma(); // imprime “Tiro”p = new General();p.arma(); // imprime “Rajada”p = new Tenente();p.arma(); // imprime “Desarmado”}

public class UsaPersonagem {public static void main(String[] args){Personagem p;p = new Soldado();p.arma(); // imprime “Tiro”p = new General();p.arma(); // imprime “Rajada”p = new Tenente();p.arma(); // imprime “Desarmado”}

Page 51: Java 02

51

Considerações finais

• Usa objetos, e não procedimentos como bloco lógico fundamental para a construção de programas

• Cada objeto é uma instância de uma classe• Objetos possuem estado e comportamento e comunicam-se

através de mensagens• Classes são relacionadas com as outras via mecanismos de herança,

formando uma hierarquia de classes• Polimorfismo e ligação tardia

Page 52: Java 02

52

Programação Imperativa vs. POO

Resumo dos conceitos: um estudo de caso simples…ResumoResumo dosdos conceitosconceitos: um : um estudo estudo de de casocaso simples…simples…

Page 53: Java 02

53

O que você deve ter em mente?

• Características da Prog. Imperativa– Ênfase muito grande dada aos procedimentosprocedimentos ee funçõesfunções

• Modela-se a solução de um problema tomando-se como base as funções a serem executadas (retira-se os verbosverbos!)

– Dados são tratados de forma secundária•• Variáveis globaisVariáveis globais são criadas com o objetivo de atender a todos os módulos• Estes dados estão acessíveis e podem ser corrompidos

– Paradoxo• Dados são importantes!• Sem os dados ,os procedimentos não teriam utilidade prática

Page 54: Java 02

54

Programação Orientada a Objetos

• Características da Prog. Orientada a Objetos– A ênfase aqui é dada às estruturas de dados, adicionando-se funcionalidades

a elas (serviços que irão operar sobre esta camada de dados)

– Modela-se um sistema decidindo os objetosobjetos necessários• Estes, então, são caracterizados através de propriedadespropriedades (que informações cada

objeto deve armazenar?) e comportamentocomportamento (que tarefas cada objeto deverá desempenhar?)

• A ênfase, aqui, é dada aos substantivos (bons indicadores na geração dos futuros objetos que irão compor o sistemasistema)

• Modela-se estas entidades utilizando-se, geralmente, da linguagem UML

Page 55: Java 02

55

Exemplo de uma aplicação:OO versus Procedural

• Estudo de caso breve e simples– Implementando um sistema de caixasistema de caixa numa linguagem procedural e

numa orientada a objetos

• O que é um sistema de caixa?– É um sistema que cadastra produtosprodutos e clientesclientes e relaciona-os numa vendavenda

– Operações básicas deste tipo de sistema (resumidamente...)• Incluir produto numa venda, cadastrar um novo cliente, calcular total de uma

venda, fechar venda, etc.

Page 56: Java 02

56

Exemplo de uma aplicação:OO versus Procedural

• Primeira pergunta:– Que estrutura básica da linguagem será utilizada para armazenar os dados?

• Resposta: depende das estruturas construtoras de tipo existentes na linguagem• Como modelar isso utilizando a linguagem C?

• Segunda questão:– Como fazer para que o acesso a estas estruturas de informações seja feito e

que possamos materializar as operações descritas anteriormente?• Resposta: utilizando subprogramas

Page 57: Java 02

57

Exemplo de uma aplicação:OO versus Procedural

• O sistema em C:

struct tvenda {int cliente;char data[8];int itens[MAX_ITENS];

} vendas[MAX_VENDAS];

struct tvenda {int cliente;char data[8];int itens[MAX_ITENS];

} vendas[MAX_VENDAS];

Nome do novo tipo que define a estrutura de uma venda

Indica quem é o cliente da venda

A data da venda

Os itens da venda

Variável que guarda as vendas

Page 58: Java 02

58

Exemplo de uma aplicação:OO versus Procedural

• Outras estruturas do sistema:struct tcliente {

char nome[50];char endereco[50];

} clientes[MAX_CLI];

struct tcliente {char nome[50];char endereco[50];

} clientes[MAX_CLI];

Estrutura para produtos

struct tproduto {int codigo;char descricao[50];float preco;

} produtos[MAX_PROD];

struct tproduto {int codigo;char descricao[50];float preco;

} produtos[MAX_PROD];

Estrutura para clientes

Page 59: Java 02

59

Exemplo de uma aplicação:OO versus Procedural

• Operações do sistema (um arquivo de funções):float total_venda(struct tvenda *v, int cliente);

int abrir_venda(struct tvenda *v, int cli, char *data);

float fecha_venda(struct tvenda *v, int cliente);

int procura_produto(struct tproduto *p, char *nome);

void insere_cliente(struct tcliente *c, struct tclientencliente);

float valor_produto(struct tproduto *p, int codprod);

int adicione_item(struct tvenda *v, int codprod);

float total_venda(struct tvenda *v, int cliente);

int abrir_venda(struct tvenda *v, int cli, char *data);

float fecha_venda(struct tvenda *v, int cliente);

int procura_produto(struct tproduto *p, char *nome);

void insere_cliente(struct tcliente *c, struct tclientencliente);

float valor_produto(struct tproduto *p, int codprod);

int adicione_item(struct tvenda *v, int codprod);

Page 60: Java 02

60

Exemplo de uma aplicação:OO versus Procedural

• Após a finalização das estruturas e funções:

Page 61: Java 02

61

Exemplo de uma aplicação:OO versus Procedural

• Usando as funções numa aplicação:Void realiza_venda( int cliente ){

vendas[i] = cliente;

vendas[i].data = hoje();

while (true) {

p = leia_produtoGUI();

if (p == FIM) break;

vendas[i].itens[j] = p;

}

}

Void realiza_venda( int cliente ){

vendas[i] = cliente;

vendas[i].data = hoje();

while (true) {

p = leia_produtoGUI();

if (p == FIM) break;

vendas[i].itens[j] = p;

}

}

Acesso direto as estruturas do tipo

E se a implementação mudasse para uma lista encadeada?

Page 62: Java 02

62

Exemplo de uma aplicação:OO versus Procedural

• Problemas com a estratégia mostrada– Relacionamento tênue entre os dados

– Fraco acoplamento entre os dados e as funções que os manipulam• Um dado incorreto neste sistema pode influenciar QUALQUER função que o manipule• Todas as funções são pares entre si (não há uma hierarquia ou qualquer

agrupamento lógico entre elas... apenas físico

– Não há encapsulamentoencapsulamento das abstrações (tipos) que foram definidas pelo usuário

– Uma estrutura conhece muito sobre a outra...

Page 63: Java 02

63

Exemplo de uma aplicação:OO versus Procedural

• O sistema em Javapublic class Venda{

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p );

}

public class Venda{

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p );

}

Novo tipo

Dados

As operações

Page 64: Java 02

64

Exemplo de uma aplicação:OO versus Procedural

• O sistema em Java

public class Cliente {

private String nome;private String endereco;

public Cliente( String n, String e );void mudaNome( String novoNome );void mudaEndereco( String novoEnd );

}

public class Cliente {

private String nome;private String endereco;

public Cliente( String n, String e );void mudaNome( String novoNome );void mudaEndereco( String novoEnd );

}

Page 65: Java 02

65

Exemplo de uma aplicação:OO versus Procedural

• O sistema em Javapublic class Produto {

private String nome;private String descricao;private float preco;

public Produto( String n, String d, float p );void mudaPreco( float novoPreco );String pegueDescricao();

}

public class Produto {

private String nome;private String descricao;private float preco;

public Produto( String n, String d, float p );void mudaPreco( float novoPreco );String pegueDescricao();

}

Page 66: Java 02

66

Exemplo de uma aplicação:OO versus Procedural

• Após a finalização das estruturas e funções:

Page 67: Java 02

67

Exemplo de uma aplicação:OO versus Procedural

• O sistema em Javapublic class Loja {

... // código da classe loja...Venda realizaVenda( Cliente c ){

Venda v = new Venda( c, hoje() );Produto p;while (true) {

p = GUI.leiaProduto();v.addItem( p );

}return v;

}}

public class Loja {... // código da classe loja...Venda realizaVenda( Cliente c ){

Venda v = new Venda( c, hoje() );Produto p;while (true) {

p = GUI.leiaProduto();v.addItem( p );

}return v;

}}

Não há possibilidade de acessar o interior dos objetos Cliente, Venda e Produto a partir deste código !

Page 68: Java 02

68

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema imperativo– Diferenciar vendas a prazo de vendas feitas à vista

struct tvendavista {int cliente;char data[8];int itens[MAX_ITENS];float desconto;

} vendas_vista[MAX_VENDAS_VISTA];

struct tvendavista {int cliente;char data[8];int itens[MAX_ITENS];float desconto;

} vendas_vista[MAX_VENDAS_VISTA];

Page 69: Java 02

69

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema imperativo– Diferenciar vendas a prazo de vendas feitas à vista

struct tvendaprazo {int cliente;char data[8];int itens[MAX_ITENS];int parcelas;float juros;

} vendas_prazo[MAX_VENDAS_PRAZO];

struct tvendaprazo {int cliente;char data[8];int itens[MAX_ITENS];int parcelas;float juros;

} vendas_prazo[MAX_VENDAS_PRAZO];

Page 70: Java 02

70

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema imperativo– Agora... mudanças nas funções

float total_vendasV(struct tvendavista *va, int i);

float total_vendasP(struct tvendaprazo *vp, int i);

float total_vendasV(struct tvendavista *va, int i);

float total_vendasP(struct tvendaprazo *vp, int i);

int add_itemv(struct tvendavista *va, int cli, char *data)

int add_itemv(struct tvendavista *va, int cli, char *data)

int add_itemv(struct tvendavista *va, int cli, char *data)

int add_itemv(struct tvendavista *va, int cli, char *data) Código difícil de manter!

Duplicação desnecessária!

Page 71: Java 02

71

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema imperativo– Acabou? Ainda não! Isso implica uma função print para cada tipo de venda

void print_vendaV(struct tvendavista *va);

float print_vendaP(struct tvendaprazo *vp);

void print_vendaV(struct tvendavista *va);

float print_vendaP(struct tvendaprazo *vp);

Page 72: Java 02

72

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema em Java

public class VendaVista extends Venda {

...private float desconto;

}

public class VendaVista extends Venda {

...private float desconto;

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p );

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p );

}

Page 73: Java 02

73

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema em Java

public class VendaPrazo extends Venda {

...private int parcelas;private float juros;

}

public class VendaPrazo extends Venda {

...private int parcelas;private float juros;

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p );

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p );

}

Page 74: Java 02

74

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema em Java

public class VendaVista extends Venda {

...public float total() {...};

}

public class VendaVista extends Venda {

...public float total() {...};

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p ) {...} ;

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p ) {...} ;

}

Função comum aos dois tipos de venda!

Função específica!

Page 75: Java 02

75

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema em Java

public class VendaPrazo extends Venda {

...public float total() {...};

}

public class VendaPrazo extends Venda {

...public float total() {...};

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p ) {...} ;

}

public class Venda {

private Cliente cliente;private Date data;private ArrayList itens;

public Venda( Cliente c, Date d );float total();int addItem( Produto p ) {...} ;

}

Função específica!

Page 76: Java 02

76

Exemplo de uma aplicação:OO versus Procedural

• Reutilização no sistema em Java– Polimorfismo!

public class Loja {

...

public void printVenda( Venda v ) {...} ;}

public class Loja {

...

public void printVenda( Venda v ) {...} ;}

Esta função aceita os dois tipos de venda! Podemos passar como parâmetro tanto um objeto VendaVista como VendaPrazo.

Page 77: Java 02

77

Exemplo de uma aplicação:OO versus Procedural

• Conclusões– Na OO, os dados não estão disponíveis globalmente, mas modularizados e

confinados (encapsulados) sob a parte do sistema (funções) que sabe tratá-los e tem alguma relação com eles (coesão)

– Entretanto, na programação imperativa, todas as funções estão no mesmo nível hierárquico e podem, potencialmente, acessar qualquer dado da aplicação

• A manutenção tanto corretiva quanto expansiva são muito difíceis de serem realizadas

Page 78: Java 02

78

Exemplo de uma aplicação:OO versus Procedural

• Conclusões– Uma classe em Java permite que vários objetos daquela classe possam ser

criados e passem a existir independentemente uns dos outros

– O polimorfismo e a herança permitem que o processamento comum a tipos equivalentes seja realizado de uma vez só

• Isso evita a criação de diversas funções com assinaturas diferentes, mas que, semanticamente, são muito semelhantes.

Page 79: Java 02

79

Para um melhor aproveitamento…

• Ao codificar exemplos mostrados em sala, procure verificar pontos de dúvidas com o professor.

• Não estude apenas por slides (são apenas tópicos)!• Mantenha em dia todas as questões das listas de listas de exercíciosexercícios e práticas e práticas

de laboratóriode laboratório..• Não se acanhe! Procure-me (ou monitor da disciplina, quando houver

algum) e questione conceitos, listas, etc.• Não deixe para começar a estudar em cima da hora.

Page 80: Java 02

80

Créditos para geração desta nota de aula

• [1] ROCHA, Helder da. Desenvolvimento de Aplicações com Java. Disponível em: <http://www.argonavis.com.br/cursos/java/j100/index.html>

• [2] Booch, G.; Maksimchuk, R. A.; Engel, M. W.; Young, B.J. Object-Oriented-Analysis-Design-Applications. 3rd.Ed. Addison Wesley, 2007

• [3] The Java Tutorial. Disponível em: http://java.sun.com/docs/books/tutorial/

• [4] PEREIRA, Frederico C. G.; Slides do Curso de Java. Disponível por WWW emhttp://asterix.coinfo.cefetpb.edu.br/~fred

Page 81: Java 02

81

Bibliografia Complementar

• Bibliografia principal:– (1) SIERRA, K.; BATES, B. Use a Cabeça JAVA. Editora Alta Books, 2ª ed. Rio de Janeiro 2007.

– (1)DEITEL, H. M. ; DEITEL, P. Java - Como programar. 6ª Edição, Prentice-Hall, 2005.– FLANAGAN, D., Java in a Nutshell : A Desktop Quick Reference, O'Reilly & Associates,

1999 (bom para consultar a documentação)

• Bibliografia disponível para download (grátis):– CAMPIONE, M. e WALRATH, K. The Java Tutorial: Object-Oriented Programming for

the Internet. Addison-Wesley (http://java.sun.com/docs/books/)

– (2) ECKEL, B., Thinking in Java. Prentice Hall. (http://www.mindview.net/Books/TIJ/)