paginas.fe.up.ptaed2/acetatos/aula2.pdf · 2005. 3. 3. · paginas.fe.up.pt

26
Revis˜ oes – Java Algoritmos e Estruturas de Dados II – Licenciatura em Engenharia Inform´ atica e Computa¸ ao – www.fe.up.pt/rcamacho/cadeiras/AED2 Rui Camacho LIACC/FEUP Universidade do Porto [email protected] Fevereiro 2005 Rui Camacho Algoritmos e Estruturas de Dados II – LEIC Revis˜ oes – Java Fento-introdu¸ ao ` a POO Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

Transcript of paginas.fe.up.ptaed2/acetatos/aula2.pdf · 2005. 3. 3. · paginas.fe.up.pt

  • Revisões – Java

    Algoritmos e Estruturas de Dados II– Licenciatura em Engenharia Informática e Computação –

    www.fe.up.pt/∼rcamacho/cadeiras/AED2

    Rui CamachoLIACC/FEUP Universidade do Porto

    [email protected]

    Fevereiro 2005

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Fento-introdução àPOO

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Abordagem Orientada a Objectos

    Objectivo:

    I aplicações que resolvem problemas de elevada complexidade

    I facilitar a utilização de equipas de programadores

    I técnicas de desenvolvimento rápido de aplicações

    Abordagem:

    I decompor o problema em partes mais simples e independentes

    I cada equipa trabalha na implementação da solução de uma parte doproblema. Interacção ḿınima com as outras equipas

    I os “módulos” desenvolvidos são reutilizáveis em outras aplicações

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Linguagens de Alto-ńıvel iniciais

    Limitações:

    I falta de estruturação

    I nenhuma espécie de encapsulamento

    I nenhum aspecto de abstracção

    Exemplos: implementações iniciais de Fortran e Basic

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Procedimentos

    Blocos de código com variáveis locais que implementam algoritmosou operações elementares de algoritmos. Acesso através dechamada pelo nome e passagem de parâmetros.Vantagens:

    I estruturação/modularidade

    I certo grau de encapsulamento

    I certo grau de abstracção

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Procedimentos (cont.)

    Limitações:

    I nomes de funções não podem ser duplicados (ex: a função de inserirem estruturas de dados diferentes requer funções com nomesdiferentes)

    I dados manipulados por diferentes funções (ex: stack com operaçõesde pop e push) são declarados globais

    I não existe instanciação. Não se pode replicar dinamicamente umaestrutura de dados com operações de manutenção associadas.

    Exemplos: funções do C ou procedimentos/funções do Pascal

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Módulos

    Blocos que ecapsulam dados e procedimentos. Uma interfaceespecifica o que é viśıvel do exterior.Vantagens:

    I estruturação/modularidade

    I encapsulamento de dados e procedimentos

    I certo grau de abstracção

    Limitações:

    I não há instanciação. Só existe um módulo de cada “espécie”. Nãose pode replicar dinamicamente um módulo

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Tipos Abstractos de Dados

    Conjunto de dados com operações de manipulação associadas.Vantagens:

    I abstracção

    I instanciação

    Limitações:

    I não tem algumas caracteŕısticas importantes de uma linguagemO.O. (ex: herança)

    Exemplos: Stack com operações de pop, push, top etc

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Objectos

    Entidades que contêm dados e procedimentos e estão organizadashierarquicamente. Utilizam um mecanismo de envio de mensagens.Vantagens:

    I abstracção/instanciação

    I herança

    I modularidade

    I encapsulamento

    I polimorfismo

    Limitações:

    I :-)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Exemplo

    Problema:

    quero enviar um ramo de flores à minha mãe que mora numa outracidade

    Solução:

    vou à minha florista (donaFlor) e digo-lhe “envie um ramo de rosasà Sra ... que mora em ...”

    (do livro “An introduction to Object-Oriented Programming” - Tomothy Budd)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Perspectiva O.O. do exemplo

    I para desencadear uma acção transmito uma mensagem a um agente(objecto)

    I a acção é iniciada pela recepção de uma mensagem

    I a mensagem tem um receptor e pode ter argumentos: tipo de flores,nome do destinatário, morada

    I uma vez aceite a mensagem é da responsabilidade do receptor realizar aacção

    I desconheço os pormenores que o receptor usa para realizar a acção(encapsulamento)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Perspectiva O.O. do exemplo (cont.)

    I assumo caracteŕısticas e comportamentos t́ıpicos da categoria (Florista) aque pertence a instância (donaFlor) (instanciação)

    I assumo ainda caracteŕısticas de categorias mais gerais (ex: Vendedores)das quais as Floristas são uma categoria particular. (herança)

    I a realização da tarefa pela donaFlor pode envolver outros agentes(objectos)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Classes e Objectos

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Classes e ObjectosAnalogia

    C Javatypedef struct{ class Pessoa{char nome[80]; int idade;

    definição int idade;} Pessoa; public Pessoa(){

    int = 0;}}

    automática Pessoa pessoa1; int inteiro;criação a pedido pessoa2 = pessoa =

    (Pessoa *) malloc( ... ); new Pessoa();

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Encapsulamento

    Capacidade de isolar dados e/ou porções de código.Vantagens:

    I facilidade de desenvolver programas estruturados

    I não é preciso “memorizar” e/ou verificar utilizações anteriores dosnomes de variáveis e procedimentos

    Desvantagens:

    I Eficiência

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Abstracção

    Capacidade de encapsular e isolar informação de design deinformação de execução.Vantagens:

    I reutilização de software

    I desenvolvimento mais rápido de software

    Desvantagens:

    I Eficiência (alguns compiladores de linguagens imperativas fazem“inline”)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Herança

    Prinćıpio que permite que conhecimento de uma categoria maisgeral que a categoria de um indiv́ıduo seja acesśıvel a esseindiv́ıduo.Vantagens:

    I evita replicação de informação (código e dados)

    I desenvolvimento mais rápido de software

    Desvantagens:

    I Eficiência

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Polimorfismo

    Propriedade de utilizar o mesmo código para processar objectosdiferentes.Vantagens:

    I Tratamento uniforme de entidades de natureza diferente masrelacionada (ex: biblioteca com livros, revistas, jornais ...)

    I mais fácil actualização/manutenção de software

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Fento-introdução

    aoJava

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Bibliografia

    I “Thinking in Java”, Bruce Eckel, 2000http://www.bruceeckel.com

    I “Java How to Program, Deitel & Deitel, Prentice Hall, 2000

    I “Java for Engineers and Scientists”, Stephen J. Chapman, Prentice Hall,1999

    I “Programação Orienteda aos Objectos em Java 2”, F. Mário Martins,FCA, 2000

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Caracteŕısticas do Java

    I linguagem orientada a objectos

    I abstracçãoI herançaI modularidadeI encapsulamentoI polimorfismo

    I permite reutilização de software

    I independente da plataforma

    I facilidades gráficas independentes do dispositivo

    I é do doḿınio público

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Caracteŕısticas do Java (cont.)

    I facilidades para aplicações na Web

    I facilidades para ligação a Bases de Dados

    I facilidades para utilização de concorrência

    I facilidades para computação distribúıda

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Caracteŕısticas menos positivas do Java

    I execução lenta

    I mecanismos de E/S complexos

    I herança múltipla implementada com muitas limitações

    I não é integralmente independente da plataforma(uso de threads depende do Sistema operativo)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Elementos do Java

    I linguagem de programação Java

    I máquina virtual Java (Java Virtual Machine – JVM)máquina virtual executa um código chamado bytecode

    I Java Application Programing Interface (Java API). Define as classespadrão dispońıveis na linguagem

    um programa em Java corre como application ou applet

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Ambiente Java

    (do livro “Java How to Program” - H. Deitel & P. Deitel)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Classes em Java

    Definem tipos abstractos de dados. Organizadas hierarquicamente.Os seus membros podem ser:

    I campos de dados (guardam valores de atributos)

    I variáveis do tipo primitivoI referências (“apontadores” para objectos)

    I métodos (implementam comportamentos)

    I construtoresI atribuição de valores (set methods)I inspecção de valores (get methods)I predicadosI métodos que implementam comportamentosI finalizador

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Tipos Primitivos

    I Tipos primitivos não originam objectos (eficiência)

    I variáveis automáticas

    Tipo Tamanho Mı́nimo Máximo TipoPrimitivo Derivadoboolean 1 bit – – Booleanchar 16 bit Unicode 0 Unicode 216-1 Characterbyte 8 bit -128 127 Byteshort 16 bit -215 215 -1 Shortint 32 bit -231 231 -1 Integerlong 64 bit -263 263 -1 Longfloat 32 bit -3.4E+38 3.4E+38 Floatdouble 64 bit -1.8E+308 1.8E+308 Double

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Programar em Java

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Métodos– sobrecarga –

    Métodos com o mesmo nome mas com número de parâmetros diferentes oumesmo número de parâmetros mas de tipos diferentes.

    public class Complexo{

    double parteReal, parteImaginaria;double modulo, fase;

    public Complexo(){parteReal = parteImaginaria = 0.0;modulo = fase = 0.0;

    }

    public Complexo(double real){parteReal = real;modulo = real > 0.0 ? real : -real;parteImaginaria = fase = 0.0;

    }

    public Complexo(double real, double imag){parteReal = real;parteImaginaria = imag;modulo = Math.sqrt(real * real + imag * imag);fase = Math.atan(imag / real);

    }}

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Métodos– sobreposição –

    Uma subclasse contém um método com o mesmo nome, redefinindo essecomportamento da classe (codificar uma excepção, por exemplo).

    public class Ave{

    /* Dados */boolean voa;String nome;

    /* Métodos */

    public void setVoa(){voa = true;

    }

    public String toString(){return(nome + ” voa”);

    }}

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Métodos– sobreposição –

    public class Avestruz extends Ave{

    /* Métodos */

    public Avestruz(String nomeAve){nome = new String(nomeAve);

    }

    public void setVoa(){voa = false;

    }

    public String toString(){return(nome + ” nao voa.”);

    }}

    public class Pardal extends Ave{/* Método */

    public Pardal(String nomeAve){nome = new String(nomeAve);

    }

    }

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Objectos

    I Todos os objectos são instâncias de uma classe

    I São criados “a pedido” usando a instrução new.Algo semelhante à gestão de memória dinâmica em C.

    I São acedidos através de referências (apontadores)

    I Como argumentos de métodos são passados por referência

    I Espaço libertado por garbage collection quando não há nehuma referênciapara o objecto

    declaração de referências:Pessoa pessoaRef1, pessoaRef2;

    criação de dois objectos do tipo Pessoa:pessoaRef1 = new Pessoa();pessoaRef2 = new Pessoa();

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Instanciação

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Objectos (cont.)

    Inicialmente três objectos são criados automaticamente:

    I System.out → associado ao ecrã (“standard output”)

    I System.in → associado ao teclado (“standard input”)

    I System.err → associado ao ecrã (“standard error”)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Realizar um programa em Java

    I Identificar as entidades envolvidas no problema

    I Cada entidade origina uma classe

    I Sempre que posśıvel usar classes da Java API

    I Codificar cada classe

    I conceber a estrutura da classedadosmétodos

    I ligar a classe na hierarquia de classesI Uma classe com um método public static void main()

    onde o programa inicia a execução

    I Guardar uma classe em cada ficheiro .java

    I Compilar os ficheiros: javac *.java

    I Executar o programa: java ClassePrincipal

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Packages

    Agrupamento de classes relacionadas logicamente.

    I (excepto a package java.lang) usar uma classe de uma package só depoisde importar a package (import)

    I instruções import têm que ser as primeiras linhas (não cometários) doficheiro

    I permite referir facilmente um conjunto de classes relacionadas

    I a importação do java.lang é automática

    I procura das packages determinada pela variável de ambiente CLASSPATH

    I todas as classes encontradas em CLASSPATH sem declaração de packagesão, por omissão, da mesma package

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Modificadores de acesso

    I public – todos os objectos podem aceder a um membro public

    I private – só métodos do próprio objecto podem aceder.Um membro private não é herdado

    I sem qualquer modificador/por omissão – todos os métodos declasses da mesma package podem aceder

    I protected – todos os métodos de classes da mesma package podemaceder e todos os métodos das subclasses

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Variáveis de classe e de instância

    I variável de classe é partilhada por todos os objectos dessa classe. Sóexiste uma cópia da variável. Declarada comstatic int variavel;

    I variável de instância: cada objecto tem uma cópia independente.Não tem modificador static. Por omissão os campos de dados deuma classe são de instância.

    I Variáveis static são usadas para guardar informação global a todosos objectos da classe (número de objectos criados, declaração deconstantes comuns aos objectos da classe, etc)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Métodos de classe (static)

    I Podem ser executados antes da criação de um objecto da classe aque pertencem

    I Só podem aceder a membros de classe (static) da classe mas nãopodem aceder a membros de instância

    I Geralmente utilizados para cálculos utilitários: sqrt(), seno() etc.

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Modificador final

    I em Classes: classe que não pode ter subclasses

    I em Métodos: método que não pode ser sobreposto

    I em Variáveis: variável cujo valor não pode ser alterado apósinicialização.Processo em Java para declarar constantes: final double PI =3.141592;

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Polimorfismo em Java

    Propriedade que permite tratar objectos de subclasses diferentescomo objectos de uma única superclasse seleccionandoautomaticamente os métodos apropiados a cada objecto.Para obter um comportamento polimórfico fazer:

    I definir os métodos polimórficos numa superclasse comum

    I utilizar a sobreposição de métodos para sobrepor os métodos emcada classe que os herda

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Modificador abstract

    I Método abstract não tem corpo.Declaração de funcionalidades que as classes derivadas devem fornecer

    I Classe abstract não tem instâncias

    I uma classe abstract pode implementar alguns dos métodos , especificandooutros como abstract

    I todas as subclasses de uma classe abstract têm que reescrever todos os métodosabstract da superclasse

    public abstract class Forma{public abstract void desenha();

    }public class Circulo extends Forma{

    public void desenha(){..... código aqui ...

    }}

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Excepções

    Uma excepção é um evento que interrompe o normal fluxo deexecução de um programa (geralmente um erro)

    I quando um método não consegue completar o seu processamentonormal atira (throws) uma excepção

    I excepções são objectos da classe Exception ou de suas subclasses

    I são essencialmente usadas para tratar erros que devem ser tratadosa um ńıvel diferente do ńıvel onde o erro ocorreu

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Processamento de Excepções

    exemplo do livro “Java for Engineers and Scientists” , S. J. Chapman (caṕıtulo 8)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Processamento de Excepções

    I Todas as classes Java têm que tratar (catch) qualquerexcepção verificável em tempo-de-compilação que ocorradentro do seu doḿınio ou então explicitamente atirá-la(throw)

    I as excepções são atiradas incluindo a palavra throws nadefinição do métodopublic void setData(int dia, int mes, int ano) throws ExcepcaoDataInvalida{

    I criadas com new (são objectos) e atiradas com throwthrow new ExcepcaoDataInvalida()

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Processamento de Excepções

    I qualquer excepção atirada por um método deve ser apanhada e tratadaou re-atirada por todos os métodos acima na árvore de chamadas

    I se todos os métodos re-atirarem a excepção então o program mostra umamensagem de erro e aborta

    try{... // codigo onde pode ocorrer um erro

    }catch(Excep1 e){

    ... // executado caso ocorra excepcao da class Excep1 ou subclasse}catch(Excep2 e){... // executado caso ocorra excepcao da class Excep2 ou subclasse}....finally{

    ... // sempre executado ocorra ou nao excepcao

    }

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    “Herança múltipla”

    Problema: como definir objectos que se enquadram em mais do que umahierarquia

    public interface Barulhento{String barulho();

    }

    public interface Movimenta se{String locomocao();

    }

    Interface:I abstracta: não pode ser implementada independentemente de uma classe

    I métodos são public abstract

    I atributos são public static final

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Interfaces – exemplo

    public interface Relacao{

    // Devolve true se a > b, em que a e’ o ojecto correntepublic boolean eMaior( Object b );

    Devolve true se a < b, em que a e’ o ojecto correntepublic boolean eMenor( Object b );

    // Devolve true se a == b, em que a e’ o objecto correntepublic boolean eIgual( Object b );

    }

    exemplo traduzido do livro “Java for Engineers and Scientists” , S. J. Chapman (caṕıtulo 9)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Interfaces – exemplo

    public class OrdenaObjectos {

    // Definicao do metodo de ordenacaopublic static Object[] sort(Object[] obj) {

    int i, j; // Indices para os ciclos forint menor; // Aponta o valor mais pequenoObject temp; // para trocar el. vector

    for ( i = 0; i < obj.length-1; i++ ) {

    menor = i;for ( j = i+1; j < obj.length; j++ )if (((Relacao) obj[j]).eMenor((Relacao) obj[menor]))

    menor = j;

    if (i != menor) {temp = obj[i];obj[i] = obj[menor];obj[menor] = temp;

    }}

    // Devolve os objectos ordenadosreturn obj;

    }}

    exemplo traduzido do livro “Java for Engineers and Scientists” , S. J. Chapman (caṕıtulo 9)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

    Revisões – Java

    Interfaces – exemplo

    public class Linha implements Relacao {private double x1; // First x valueprivate double x2; // Second x valueprivate double y1; // First y valueprivate double y2; // Second y value

    public Linha(double x1, double y1, double x2, double y2) {this.x1 = x1;this.x2 = x2;this.y1 = y1;this.y2 = y2;

    }public double length( ) {

    return Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );}// Returns true if current object > bpublic boolean eMaior( Object b ) {

    return length() > ((Linha)b).length();}// Returns true if current object < bpublic boolean eMenor( Object b ) {

    return length() < ((Linha)b).length();}public boolean eIgual( Object b ) {

    return length() == ((Linha)b).length();}public String toString( ) {

    return ”Linha from (” + x1 + ”,” + y1 + ”) to (”+ x2 + ”,” + y2 + ”): Length = ” + length();}

    }

    traduzido de “Java for Engineers and Scientists” , S. J. Chapman (caṕıtulo 9)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC

  • Revisões – Java

    Interfaces – exemplo

    public class TestLinha {

    public static void main(String[] args) {

    Object objecto[] = new Linha[5];

    objecto[0] = new Linha(0,0,2,1);objecto[1] = new Linha(0,0,1,-1);objecto[2] = new Linha(-1,1,1,1);objecto[3] = new Linha(2,0,0,0);objecto[4] = new Linha(0,2,-2,0);

    // Ordena objectvos por ordem crescenteOrdenaObjectos.sort( objecto );

    for(int i = 0; i < objecto.length; i++ ) {System.out.println(objecto[i].toString());

    }}

    }

    exemplo traduzido do livro “Java for Engineers and Scientists” , S. J. Chapman (caṕıtulo 9)

    Rui Camacho Algoritmos e Estruturas de Dados II – LEIC