




Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Este documento, produzido pelo grupo de linguagens de programação da di/puc-rio, aborda conceitos importantes em programação orientada a objetos em java, como sobrecarga de métodos, herança e polimorfismo. São apresentados exemplos práticos, como a criação de construtores e métodos sobrecarregados, herança de interface e código, e polimorfismo em arrays de objetos.
Tipologia: Notas de estudo
1 / 8
Esta página não é visível na pré-visualização
Não perca as partes importantes!
Grupo de Linguagens de Programação Departamento de Informática PUC-Rio
2
Um recurso usual em programação OO é o uso de sobrecarga de métodos. Sobrecarregar um método significa prover mais de uma versão de um mesmo método. As versões devem, necessariamente, possuir listas de parâmetros diferentes, seja no tipo ou no número desses parâmetros (o tipo do valor de retorno pode ser igual).
3
Como dito anteriormente, ao criarmos o construtor da classe Point para inicializar o ponto em uma dada posição, perdemos o construtor padrão que, não fazendo nada, deixava o ponto na posição (0,0).
Nós podemos voltar a ter esse construtor usando sobrecarga.
4
class Point { int x = 0; int y = 0; Point() { } Point(int x, int y) { this.x = x; this.y = y; } ... }
5
Agora temos dois construtores e podemos escolher qual usar no momento da criação do objeto.
Point p1 = new Point(); // p1 está em (0,0) Point p2 = new Point(1,2); // p2 está em (1,2)
6
Uma solução melhor para o exemplo dos dois construtores seria o construtor vazio chamar o construtor que espera suas coordenadas, passando zero para ambas. Isso é um encadeamento de construtores. Java suporta isso através da construção this(...). A única limitação é que essa chamada seja a primeira linha do construtor.
7
class Point { int x, y; Point() { this(0,0); } Point(int x, int y) { this.x = x; this.y = y; } ... }
8
Pode ser feita da mesma maneira que fizemos com os construtores. Quando sobrecarregamos um método, devemos manter a semântica: não é um bom projeto termos um método sobrecarregado cujas versões fazem coisas completamente diferentes.
9
A classe Math possui vários métodos sobrecarregados. Note que a semântica das várias versões são compatíveis.
int a = Math.abs(-10); // a = 10; double b = Math.abs(-2.3); // b = 2.3;
10
11
Como vimos anteriormente, classes podem ser compostas em hierarquias, através do uso de herança.
Quando uma classe herda de outra, diz-se que ela a estende ou a especializa , ou os dois. Herança implica tanto herança de interface quanto herança de código.
12
Herança de interface significa que a classe que herda recebe todos os métodos declarados pela superclasse que não sejam privados. Herança de código significa que as implementações desses métodos também são herdadas. Além disso, os atributos que não sejam privados também são herdados.
19
Uma das vantagens de termos uma superclasse comum é termos uma funcionalidade comum a todos os objetos. Por exemplo, a classe Object define um método chamado toString que retorna um texto descritivo do objeto. Um outro exemplo é o método finalize usado na destruição de um objeto, como já dito.
20
Uma classe pode herdar de outra para especializá-la redefinindo métodos, sem ampliar sua interface. Uma classe pode herdar de outra para estendê-la declarando novos métodos e, dessa forma, ampliando sua interface. Ou as duas coisas podem acontecer simultaneamente...
21
Polimorfismo é a capacidade de um objeto tomar diversas formas. O capacidade polimórfica decorre diretamente do mecanismo de herança. Ao estendermos ou especializarmos uma classe, não perdemos compatibilidade com a superclasse.
22
A sub-classe de Point , Pixel , é compatível com ela, ou seja, um pixel, além de outras coisas, é um ponto. Isso implica que, sempre que precisarmos de um ponto, podemos usar um pixel em seu lugar.
23
Podemos querer criar um array de pontos. O array de pontos poderá conter pixels:
Point[] pontos = new Point[5]; // um array de pontos
pontos[0] = new Point(); pontos[1] = new Pixel(1,2,0); // um pixel é um ponto
24
Note que um pixel pode ser usado sempre que se necessita um ponto. Porém, o contrário não é verdade: não podemos usar um ponto quando precisamos de um pixel.
Point pt = new Pixel(0,0,1); // OK! pixel é ponto. Pixel px = new Point(0,0); // ERRO! ponto não é pixel.
25
Polimorfismo é o nome formal para o fato de que quando precisamos de um objeto de determinado tipo, podemos usar uma versão mais especializada dele. Esse fato pode ser bem entendido analisando-se a árvore de hierarquia de classes.
26
Pessoa
Funcionário
Gerente Faxineiro
José Josias
27
Vamos aumentar a classe Point para fornecer um método que imprima na tela uma representação textual do ponto. public class Point { ... public void print() { System.out.println(“Point (”+x+“,”+y+“)”); } } 28
Com essa modificação, tanto a classe Point quanto a classe Pixel agora possuem um método que imprime o ponto representado.
Point pt = new Point(); // ponto em (0,0) Pixel px = new Pixel(0,0,0); // pixel em (0,0) pt.print(); // Imprime: “Point (0,0)” px.print(); // Imprime: “Point (0,0)”
29
Porém, a implementação desse método não é boa para um pixel pois não imprime a cor.
Vamos, então, redefinir o método em Pixel.
public class Pixel extends Point { ... public void print() { System.out.println(“Pixel (”+x+“,”+y+“,”+color+“)”); } }
30
Com essa nova modificação, a classe Pixel agora possui um método que imprime o pixel de forma correta.
Point pt = new Point(); // ponto em (0,0) Pixel px = new Pixel(0,0,0); // pixel em (0,0) pt.print(); // Imprime: “Point (0,0)” px.print(); // Imprime: “Pixel (0,0,0)”
37
Uma classe inteira pode ser definida final. Nesse caso, em particular, a classe não pode ser estendida.
public final class A { ... }
38
Como dito anteriormente, podemos usar uma versão mais especializada quando precisamos de um objeto de certo tipo mas o contrário não é verdade. Por isso, se precisarmos fazer a conversão de volta ao tipo mais especializado, teremos que fazê-lo explicitamente.
39
A conversão explícita de um objeto de um tipo para outro é chamada type casting.
Point pt = new Pixel(0,0,1); // OK! pixel é ponto. Pixel px = (Pixel)pt; // OK! pt agora contém um pixel. pt = new Point(); px = (Pixel)pt; // ERRO! pt agora contém um ponto. pt = new Pixel(0,0,0); px = pt; // ERRO! pt não é sempre um pixel.
40
Note que, assim como o late binding, o type casting só pode ser resolvido em tempo de execução: só quando o programa estiver rodando é que poderemos saber o valor que uma dada variável terá e, assim, poderemos decidir se a conversão é válida ou não.
41
Permite verificar a classe real de um objeto
if (pt instanceof Pixel) { Pixel px = (Pixel)pt; … }
42
Ao criarmos uma classe para ser estendida, às vezes codificamos vários métodos usando um método para o qual não sabemos dar uma implementação, ou seja, um método que só sub-classes saberão implementar. Uma classe desse tipo não deve poder ser instanciada pois sua funcionalidade está incompleta. Tal classe é dita abstrata.
43
Java suporta o conceito de classes abstratas: podemos declarar uma classe abstrata usando o modificador abstract.
Além disso, métodos podem ser declarados abstratos para que suas implementações fiquem adiadas para as sub-classes. Para tal, usamos o mesmo modificador abstract e omitimos a implementação. 44
public abstract class Drawing { public abstract void draw(); public abstract BBox getBBox(); public boolean contains(Point p) { BBox b = getBBox(); return (p.x>=b.x && p.x<b.x+b.width && p.y>=b.y && p.y<b.y+b.height); } ... }
45
Será aplicado o conceito de heranças sobre a implementação do sistema bancário. No exercício da próxima aula, será pedido que os alunos implementem a conta poupança. Esta nova conta herdará de conta corrente e especializará alguns métodos.