Mtodos de Programao II Mestrado Integrado em Engenharia

  • Slides: 18
Download presentation
Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre Tipos Genéricos, a classe Array. List, Hierarquias de classes e Herança em Java Métodos Programação II 1

Tipos genéricos em Java 1. 5 • Uma classe pode ser definida à custa

Tipos genéricos em Java 1. 5 • Uma classe pode ser definida à custa de um tipo genérico. Este é definido usando parâmetros de “tipo” (i. e. não primitivos). • Usando este conceito, podemos ter uma infinidade de variantes de uma classe. Exemplo: public class Ponto<T> { // tipo genérico Ponto<T> private T x; private T y; // Métodos public Ponto(T cx, T cy) { this. x = cx; this. y = cy; } public T get. X() { return this. x; } public T get. Y() { return this. y; } public void set. X(T cx) { this. x = cx }. . . } • Podemos declarar: Ponto<Integer> c = new Ponto<Integer>(); • Ou então: Ponto<Double> d = new Ponto<Double>(); • Usando assim tipos parametrizados… Métodos Programação II 2

Primeiras Colecções – a classe Array. List<E> Tipo referenciado • O Java 1. 5.

Primeiras Colecções – a classe Array. List<E> Tipo referenciado • O Java 1. 5. oferece um conjunto de classes (que implementam estruturas de dados tradicionais) para armazenamento de objectos. • Estas, agrupam os objectos em unidades compactas e estruturadas, implementando também as necessárias operações para a correcta manipulação e organização dos dados. • Um exemplo é a classe Array. List que implementa a estrutura de dados vector de dados (array dinâmico) mas sem restrições de crescimento. • Um Array. List é uma sequência de elementos (tem uma ordem definida pela adição de novos elementos) Métodos Programação II 3

Construção & métodos de Array. List<E> • Construção: – Array. List<Ponto> lista = new

Construção & métodos de Array. List<E> • Construção: – Array. List<Ponto> lista = new Array. List<Ponto>(); • Operações e seus métodos – Adição de uma novo elemento ao fim da lista: lista. add(new Ponto(1, 2)); – Adição numa posição definida: lista. add(3, new Ponto(1, 2)); Implica que equals() esteja implementado – Eliminar um elemento: lista. remove(p); em Ponto – Eliminar uma posição: lista. remove(1); – Obter um obj numa posição: Ponto p 2 = lista. get(2); – Saber a posição de um obj: int index = lista. index. Of(p 2); – Saber tamanho da lista: int len = lista. size(); – Substituir uma posição: lista. set(2, new Ponto(3, 4)); – Criar um array cópia do Array. List: Object a[] = lista. to. Array(); Métodos Programação II 4

Exercício: class Banco usando Array. List class Banco { private Array. List<Conta> lista; private

Exercício: class Banco usando Array. List class Banco { private Array. List<Conta> lista; private String nome; private double saldo; Banco(String n) { this. nome = n; this. lista = new Array. List<Conta>(); this. saldo = 0. 0; } public void taxas(double valor) { for(Conta c: this. lista) c. debito(valor); } public double saldo_banco() { double temp = 0. 0; for(Conta c: this. lista) temp += c. get. Saldo(); return(temp); } } Métodos Programação II 5

Herança • Um grande trunfo da programação orientada aos objectos é a sua capacidade

Herança • Um grande trunfo da programação orientada aos objectos é a sua capacidade de reutilização de código. • Reutilização por duas vias: – Composição de classes: Definir uma nova classe usando objectos de classes já pré definidas – Hierarquia de classes: Definir uma nova classe que é uma especialização da uma classe pré definida: Assim, todo o código da classe geral é herdade pela nova classe. – Temos assim, não um plano de classes mas uma hierarquia Métodos Programação II 6

Herança: Exemplo • Temos a classe Ponto (2 dimensões) que passamos a chamar Ponto

Herança: Exemplo • Temos a classe Ponto (2 dimensões) que passamos a chamar Ponto 2 D. • Queremos agora definir uma nova classe para trabalhar no espaço tridimensional (Ponto 3 D) • Esta nova classe de reutilizar todo o código de Ponto 2 D adicionando nova informação (neste caso uma terceira dimensão). Em Java define-se: Keyword para definir subclasse class Ponto 3 D extends Ponto 2 D { private double z; Ponto 3 D(double x, double y, double z) { super(x, y); this. z = z; } Referência à super classe Public double get. Z() // método local a Ponto 3 D { return this. z; } } Métodos Programação II 7

Herança em Java • Definição de uma subclasse implica a definição de um subtipo!

Herança em Java • Definição de uma subclasse implica a definição de um subtipo! • Herança simples (uma classe tem um só “progenitor”) • Herdar e ter “acesso” não é necessariamente a mesma coisa (pelas questões de visibilidade) • Três pontos a resolver: – Redefinição (reescrita) de métodos e variáveis – Procura de métodos (lookup de métodos dinâmico) – Criação das instâncias das subclasses. • Há sempre forma de parar a hierarquia, pela keyword final. Uma classe definida usando “final class” não pode ter subclasses. Uma variável ou método final não pode ser reescrito. Métodos Programação II 8

Redefinição de métodos • Um método na subclasse reescreve o método herdado se tiver

Redefinição de métodos • Um método na subclasse reescreve o método herdado se tiver a mesma assinatura. • Exemplo do método to. String() em Ponto 3 D. class Ponto 3 D extends Ponto 2 D { …. public String to. String() { return super. to. String() + “, ” + this. z; } } • Criação de instâncias: – – Ponto 2 D p 1 = new Ponto 2 D(1, 2); Ponto 2 D p 2 = new Ponto 3 D(1, 2, 3); Ponto 3 D p 3 = new Ponto 3 D(3, 2, 1); String t = p 2. to. String(); Métodos Programação II Dynamic Binding: compilador atribui o tipo à variável; o interpretador pode ter de decidir o tipo de uma variável. 9

Redefinição de variáveis public class A { int i = 0; int m() {

Redefinição de variáveis public class A { int i = 0; int m() { return this. i; } } public class B extends A { int this. i = 1; // i de A é “shadowed” int m() { return this. i; } // m é “overriden” } …. A a = new A(); A b = new B(); b. m() // dá como resultado 1 e não 0 !! Por exemplo, um método de B poderia ter o seguinte código: public int mb() { this. i = super. i + 10; return this. i + this. m() + super. m(); } i -> local super. i -> i da superclasse this. m() -> local super. m() -> m() da superclasse Métodos Programação II 10

Redefinição: Exemplo public static void main(String args[]) { public class C extends A public

Redefinição: Exemplo public static void main(String args[]) { public class C extends A public class A A a 1, a 2, a 3, a 4; { a 3 = new C(); a 4 = new D(); { private int a; a 1 = new A(); a 2 = new B(); private a 4. metd(); int c; a 1. metd(); public A() { this. a = 1; } a 2. metd(); a 3. metd(); C() { this. c = 3; } out. println("a 1. metd() = " +public a 1. da. Val()); public int da. Val() { return this. a; } int da. Val() { return this. c; } out. println("a 2. metd() = " +public a 2. da. Val()); public void metd() { this. a += 10; } void metd() { this. c += 30 ; } out. println("a 3. metd() = " +public a 3. da. Val()); } out. println("a 4. metd() = "}+ a 4. da. Val()); public class B extends A public class D extends C } { { private int b; private int d; public B() { this. b = 2; } public D() { this. d = 33; } public int da. Val() { return this. b; } public int da. Val() { return this. d; } public void metd() { this. b += 20 ; } public void metd() { this. d = this. d * 10 + 3 ; } } } Métodos Programação II 11

Exemplo EMPREGADO GESTOR MOTORISTA Métodos Programação II 12

Exemplo EMPREGADO GESTOR MOTORISTA Métodos Programação II 12

Exemplo public class Empregado { // Variáveis de Classe public static double sal. Dia

Exemplo public class Empregado { // Variáveis de Classe public static double sal. Dia = 50. 00; public static double get. Sal. Dia() { return sal. Dia; } // Variáveis de Instância private String nome; private int dias; // dias de trabalho no mês // Construtores public Empregado(String nome, int dias) { this. dias = dias; this. nome = nome; } // Métodos de Instância public int get. Dias() { return dias; } public double salario() { return dias * get. Sal. Dia(); } public String get. Nome() { return nome; } } public class Motorista extends Empregado { // Variáveis de Classe public static double valor. Km = 0. 98; public class Gestor extends Empregado public static double muda. Val. Km(double nv. Km) { // Variáveis de Instância e Construtores { valor. Km = nv. Km; } // Variáveis de Instância e Construtores private double bonus; public Gestor(String nm, int dias, double bon) private int km; { super(nm, dias); bonus = bon; } public Motorista(String nm, int dias, double bon, int km) // Métodos de Instância {super(nm, dias); bonus = bon; this. km = km; } public double get. Bonus() { return bonus; } // Métodos de Instância public double salario() public double get. Bonus() { return bonus; } { return get. Sal. Dia()*this. get. Dias()*bonus; } public double salario() { return get. Sal. Dia()*this. get. Dias()*bonus + (valor. Km*km); } } Métodos Programação II 13 }

Interpretação de this em hierarquias de classes Invocar a. teste() (sendo a uma instância

Interpretação de this em hierarquias de classes Invocar a. teste() (sendo a uma instância de Sub. A) : A interpretação de this refere-se sempre ao objecto para onde a mensagem é enviada. Neste caso, como teste() é um método herdado, ele é invocado em Super. No entanto como teste() refere a this. get. X(), a procura do método faz-se na subclass Sub. A. Aqui acontece simplesmente o return x, sendo x a variável de Sub. A. Assim o resultado desta mensagem é x = 20. Em geral, a expressão this. m() onde quer que seja encontrada no código de um método de instância de uma dada classe da hierarquia, corresponderá sempre à execução do método m() da classe do receptor da mensagem que despoletou o algoritmo de procura Métodos Programação II 14

Hierarquia em Java: classe Object • A classe Object representa o topo da hierarquia

Hierarquia em Java: classe Object • A classe Object representa o topo da hierarquia de classes em Java. • Uma variável do tipo Object pode fazer referência para qualquer tipo referenciado. • Especificam os métodos clone(), equals() e to. String(). • Contém o método get. Class() que retorna a classe a que um objecto pertence. • Com get. Class(). get. Name() obtemos o nome da classe. Métodos Programação II 15

Notas finais sobre Herança • Só podemos user a keyword super uma vez numa

Notas finais sobre Herança • Só podemos user a keyword super uma vez numa expressão e. g. a expressão super. m() é inválida. • Variáveis e métodos de classe não são herdadas mas as variáveis podem ser redefinidas. Aos métodos static acontece o inlining (o compilador substitui invocação por código efectivo) em cada subclasse. • Pelo facto de uma variável de um dado tipo estático poder possuir diferentes tipos dinâmicos (ou formas) em tempo de execução, ela diz-se polimórfica. • Polimorfismos das variáveis = princípio da substituição. • Algoritmo de procura dinâmica de métodos e associação dinâmica! Permite ao interpretador decidir (em situações de herança) qual o método a executar. Métodos Programação II 16

Exercícios • Definir uma classe Forma. • Definir a seguinte hierarquia de classes: •

Exercícios • Definir uma classe Forma. • Definir a seguinte hierarquia de classes: • Implementar os métodos apresentados. • Definir a classe Fig. Geo que guarda um conjunto de figuras geométricas. • Adicionar a classe Quadrado e Elipse (subclasse de Círculo) • Implementar um método que determina a figura com a maior área e qual o seu tipo e outro método para o maior perímetro. • Um método para contabilizar o número de figuras por tipo. Métodos Programação II 17

Exercícios • Criar um banco que guarda as contas num Array. List • Definir

Exercícios • Criar um banco que guarda as contas num Array. List • Definir vários novos tipos de conta: conta a prazo, conta jovem, conta ordenado e conta Capital. – Prazo, tem uma taxa e um número de dias – Jovem, tem taxa fixa de 1% ao ano – Ordenado, dá um plafond de um valor pré definido. Isto é, permite estar com saldo devedor até ao montante estabelecido. – Conta Capital, que contém uma taxa de juro variável, indexada por períodos. A rentabilidade é calculada sobre estes períodos. • Calcular os juros que o banco tem de pagar aos seus clientes. • Calcular o nº de contas por tipo bem como o saldo total depositado no banco referente a contas Capital. Métodos Programação II 18