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
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