AULA TEÓRICA 10. Tema 9. Interface. Tema 10. Recursividade

Documentos relacionados
Tema 7. Colecções AULA TEÓRICA 6. Listas: ArrayList, LinkedList, Vector Ø Criação Ø Manipulação

AULA TEÓRICA 7 Tema 7. Colecções (cont.) Vector Ø Criação Ø Manipulação

Aula teórica 11. Tema 11. Repetição. Ciclo while Ciclo do-while Ciclo for

Aula teórica 4. Tema 3. Linguagem de Programação Java. Manipulação de informação simples (cont.)

Aula teórica 14. Tema 12. Subprogramas (cont)

Programação Orientada aos Objectos I

AULA TEÓRICA 9. Tema 8. Herança (continuação) Ø Sobreposição de métodos. Ø Variáveis e métodos estáticos. Ø Hierarquia de classes.

Aula teórica 13. Tema 12. Subprogramas. Subprogramas em Java Chamada de métodos. Área de domínio das variáveis. Preparado por eng.

Array de objectos Array de objectos Criação Exemplo:

Instituto Superior de Ciências e Tecnologia de Moçambique

AULA TEÓRICA 1 Tema 6. Algoritmos e Fluxogramas

Aula teórica 10 Tema 10. Selecção Instruções de selecção:

AULA TEÓRICA 5 Tema 3. Instruções básicas de entrada e saída (continuação)

AULA TEÓRICA 2. Tema 1. Desenho de Algoritmos (continuação)

AULA TEÓRICA 3 Tema 2. Introdução a programação em Java (JVM, JDK)

Instituto Superior de Ciências e Tecnologia de Moçambique

Herança. Caso queira referir-se a um construtor da super classe, a sintaxe é diferente: super.nomedoatributo; super.nomedometodo(<parametros>)

Introdução à Programação LP JAVA

AULA TEÓRICA 3. Tema 4. Excepções Ø Tratamento de excepções

AULA TEÓRICA 3. Tema 2. Introdução a programação em Java (Continuação)

AULA TEÓRICA 4. Tema 2. Introdução a programação em Java (Continuação) Tema 3. Instruções básicas de entrada e saída

Linguagem de Programação III

Recursividade. Prof. Jesus José de Oliveira Neto

Aula Teórica 8. Preparado por eng.tatiana Kovalenko

AULA TEÓRICA 7. Tema 4. Estruturas de controlo (continuação).

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

AULA TEÓRICA 4. Tema 5. Ficheiros. Ficheiro do tipo texto. Ficheiros de Objectos. Ø Classe File Ø Criação. Manipulação. Ø Classe StringTokenizer

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

AULA TEÓRICA 4. Tema 3. Linguagem de programação de alto nível Java

9 Classes Abstractas e Interfaces

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Programação Java (nível intermediário) 4. Polimorfismo

Programação e Algoritmos I 1 o semestre

Classes e Objetos em Java. Algoritmos e Programação I. Classes. Classes. Modificadores de Acesso. Classes. Revisão

Polimorfismo. O que é polimorfismo?

Avançando em Java com Polimorfismo. Prof.: Hugo Barros

Conceitos de Programação Orientada a Objetos

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

Laboratório de programação II

Interfaces POO. Prof. Marcio Delamaro

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Java para Desktop. Programação Orientada à Objetos 2 JSE

Herança e Polimorfismo

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

COMPORTAMENTOS - Observações

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Orientação a Objetos AULA 09

Vetores Unimensionais

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

Linguagem de Programação III

Programação por Objectos. Java

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Linguagem de Programação II Implementação

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Classes e Objetos. Sintaxe de classe em Java

Reinaldo Gomes Análise/projeto estruturado

Conceitos básicos de programação

Universidade Federal de Uberlândia

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

PROGRAMAÇÃO JAVA. Parte 3

Linguagens de Programação Conceitos e Técnicas. Amarrações

Linguagem de Programação II Importando Classes/Pacotes

Vejamos o seguinte exemplo public class Exemplo private int testada = 20; public void testapalavra(int testada) JOptionPane.showMessageDialog(null,"Pa

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Orientada a Objetos

Linguagens de Programação Aula 12

Linguagem de Programação. Diagrama de classes

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Recursividade. Objetivos do módulo. O que é recursividade


Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Programação por Objectos. Java

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos

Programação Orientada a Objetos II

Computação II Orientação a Objetos

Sobrecarga, Sobreposição e Polimorfismo

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Interfaces e Classes Internas

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Interfaces e Classes Abstratas

Lição 11 Herança, polimorfismo e interfaces

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Transcrição:

AULA TEÓRICA 10 Tema 9. Interface Tema 10. Recursividade 1

Interface Uma interface é como uma classe que não pode ser instanciada. Seu objectivo é espicificar um conjunto de métodos que uma classe deverá implementar. Uma classe pode implementar várias interfaces e uma interface pode ser implementada por várias classes (Polimorfismo). Métodos em uma interface são sempre public e abstract Dados em uma interface são sempre constantes públicas declarados como static e final (devem ser inicializados na declaração) Portanto, uma interface é, essencialmente, uma colecção de constantes e métodos abstratos, não fornecendo nenhuma implementação. Interfaces são bastante úteis para especificar o que uma classe deve estar apta a fazer, além disso podem ser úteis para implementar bibliotecas de constantes. Mas, em alguns casos, interfaces são demasiado restrictivas. Elas não permitem a definição de variáveis (excepto constantes) ou comandos executáveis. Nestes casos classes abstractas devem ser usadas. 2

public interface Salario { public static final float SALARIO_MINIMO = 1412.0f; public abstract float getsalarioliquido(); public abstract float getquantidadesalariosminimo(); public class Professor implements Salario { private String nome; private int cargahoraria; private float valorhora; public Professor(String n,int c,float v){ nome = n; cargahoraria = c; valorhora = v; public String getnome() { return(nome); public int getchsemanal() { return cargahoraria; public float getvalorhora() { return valorhora; public float getsalarioliquido(){ float salbruto = valorhora*cargahoraria*(float)4.5; return (salbruto-(salbruto*(float)0.08)); public float getquantidadesalariosminimo(){ return ( getsalarioliquido()/salario_minimo); 3

public class MotoristaTaxi implements Salario{ private String nome; private int numcarteira; private int numerotaxi; private float totkmrodados,valorkm; public MotoristaTaxi(String n,int nc,int num,float t,float v){ nome = n; numcarteira = nc; numerotaxi = num; totkmrodados = t; valorkm = v; public String getnome(){ return nome; public int getnumcarteira() { return numcarteira; public float gettotkmrodados(){ return totkmrodados; public float getvalorkm() { return valorkm; public float getsalarioliquido(){ float salbruto = totkmrodados * valorkm; return (salbruto - (salbruto*(float)0.05)); public float getquantidadesalariosminimo(){ return (getsalarioliquido() / SALARIO_MINIMO); 4

public class TesteSalario { public static void main(string[] args){ Salario a = new Professor("Joao Paulo",12,500); System.out.println("PROFESSOR:\nSalario Liquido: "+ a.getsalarioliquido()+"\nqde de Sal.minimo:"+ a.getquantidadesalariosminimo()); Salario b = new MotoristaTaxi("Jose Bata",112233,32,300,50); System.out.println("MOTORISTA\nSalario Liquido: "+ b.getsalarioliquido()+"\nqde de Sal.minimo:"+ b.getquantidadesalariosminimo()); Usando Interfaces se pode trabalhar com polimorfismo Uma referência do tipo da Interface pode apontar para qualquer objecto que implementa aquela Interface. Entretanto, nunca se pode criar um objetco da interface! Criando uma referência da interface, é possível invocar os métodos definidos na interface. Considerando o exemplo anterior Salario s; O objecto ao qual s se refere não tem um tipo Salario (nenhum objecto tem um tipo Salario). O tipo do objecto é uma classe que implementa a interface Salario, como Professor ou MotoristaTaxi. 5

public class TesteInterfacePolimorfismo { public static void main(string args[]) { Salario ref1, ref2; ref1 = new Professor("Jose",20,(float)20.5); ref2 = new MotoristaTaxi("Luis",123456,8745,25f,0.5f); System.out.println("Motorista "+((MotoristaTaxi)ref2).getNome()+ " andou "+((MotoristaTaxi)ref2).getTotKmRodados()+ " km no mês de julho."); System.out.println("Salario líquido do motorista = "+ ref2.getsalarioliquido()); System.out.println("O professor "+((Professor)ref1).getNome()+ " tem "+((Professor)ref1).getChsemanal()+" h/a por semana."); System.out.println("Salario líquido do professor = " + ref1.getsalarioliquido()); A referência é polimórfica. A linha de código pode executar diferentes métodos em diferentes momentos se o objecto para o qual a referência aponta for diferente. Note que referências polimórficas podem ser resolvidas em tempo de execução. Isto é chamado ligação dinâmica (dynamic binding). Como saber se ref1 é um objecto Professor ou MotoristaTaxi? 6

Resumindo Uma interface define um conjunto de métodos que outras classes devem implementar, mas não define como esses métodos devem ser implementados Uma classe que implementa uma interface deve implementar TODOS os métodos listados Em Java, classes só podem ter um ancestral direto, ou seja, só podem ser derivadas de uma única classe (embora esta possa ser derivada de outra e assim por diante) Existem situações, porém, onde pode ser necessário que uma classe herde características de mais de uma superclasse simultaneamente Como a herança múltipla não é permitida em Java, a linguagem oferece o conceito de interface como opção Uma classe só poder herdar de uma única superclasse, mas pode implementar diversas interfaces public class Exemplo implements Interf1, Interf2, Interf3 7

Recursividade A recursividade é uma técnica de programação que consiste no seguinte: um método chama a si mesmo para a execução. A habilidade de pensar recursivamente é essencial para programar com uso de recursividade como uma técnica. Algumas LP proíbem a recursividade (Basic, Fortran). É importante que a recursividade seja finita, para isso é necessário que haja uma parte não recursiva, chamada base (ou ponto terminal). Características de um problema que pode ser resolvido utilizando a recursividade: Um ou mais pontos terminais possuem uma solução simples, não recursiva; Outros passos do problema podem ser reduzidos (usando a recursividade) a problemas que são próximos aos pontos terminais. Eventualmente o problema pode ser reduzido ao caso de só tiver o ponto terminal. O algoritmo recursivo em geral consiste em utilização da instrução if. 8

Por exemplo, a soma de números de 1 a 20 é igual a 20 mais a soma de números de 1 a 19, continuando, a soma de números de 1 a 19 é igual a 19 mais a soma de números de 1 a 18, etc. Exemplo: achar a soma de números naturais de 1 a N A solução recursiva para este caso: public static long soma (int n){ if (n==1) //ponto terminal return 1; else return n + soma(n-1); //definição recursiva Sabemos, que podemos resolver este problema sem uso de recursividade: soma = 0; for (int k = 1; k <= n; k ++) soma += k; Neste caso da soma a solução iterativa é mais simples. Cabe ao programador decidir quando vai usar a recursividade. Há casos quando o problema pode ser 9 resolvido usando a recursividade mais curto e com maior elegância.

Funções matemáticas recursivas Várias funções matemáticas são recursivas. Um exemplo é o factorial de um número n é o produto desse número por todos os números inteiros menores que ele e maiores que zero. 0! = 1 (para n = 0) 1! = 1 x 0! = 1 2! = 2 x 1 = 2 x 1! = 2 3! = 3 x 2 x 1 = 3 x 2!= 6 4! = 4 x 3 x 2 x 1 = 4 x 3! = 24 5! = 5 x 4 x 3 x 2 x 1 = 5 x 4! = 120 Definição de n! pode ser expressa recursivamente: n! = n x (n-1)!, somente para n>0 A base desta recursividade é 0! que é igual a 1. Para determinar 50! = 50x49!, 49! = 49x48!... Este processo vai continuar até encontrar a base (ponto terminal) que é 0! = 1. 10

//Pré-condicao: um inteiro n>=0 public static long factorial(int n){ if (n == 0) return 1; else return n*factorial(n-1); Sobretudo podemos calcular o factorial iterativamente sem utilizar a recursividade: public static long factorial (int n){ long fact = 1; for (int i=1; i < n; i++) fact = fact * i; return fact; Exemplo serie Fibonacci (versão recursiva) É uma série que possui os seguintes valores: 1 1 2 3 5 8 13 21... //Pré-condição: um inteiro k>=1. Retorna o valor do k-ésimo // número fibonacci public static long fibonacci(int k){ if (k==1 k==2) return 1; else return (fibonacci(k-1)+fibonacci(k-2)); 11

Recursividade com arrays Exemplo: Escrever um método recursivo que permita calcular a soma de valores armazenados num array de qde elementos. Algoritmo: se qde=1 então soma = x[0], senão adicionar x[qde-1] à soma de valores de sub array com indexes de 0 à qde-1 public static int somar(int x[], int qde){ if (qde == 1) return x[0]; else return x[qde -1] + somar(x, qde -1); Podemos testar manualmente este algoritmo: Para um array: x[0]=5, x[1] =8, x[2]=7 somar (x,3) somar (x,2) somar (x,1) qde=3 qde =2 qde=1 qde ==1 é false qde==1 é false qde==1 é true return 7+somar(x,2) return 8+somar(x,1) return 5 20 13 5 12

Referência bibliográfica: António José Mendes; Maria José Marcelino. Fundamentos de programação em Java 2. FCA. 2002. Elliot Koffman; Ursula Wolz. Problem Solving with Java. 1999. F. Mário Martins; Programação Orientada aos objectos em Java 2, FCA, 2000, John Lewis, William Loftus; Java Software Solutions: foundation of program design, 2nd edition, Addision-Wesley John R. Hubbard. Theory and problems of programming with Java. Schaum s Outline series. McGraw-Hill. H. Deitel; P. Deitel. Java, como programar. 4 edição. 2003. Bookman. Rui Rossi dos Santos. Programando em Java 2 Teoria e aplicações. Axcel Books. 2004 13