Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Aplicações de Java: Sobrecarga de Métodos, Herança e Polimorfismo, Notas de estudo de Construção

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

2022

Compartilhado em 07/11/2022

Pernambuco
Pernambuco 🇧🇷

4.2

(45)

225 documentos

1 / 8

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Java First-Tier: Aplicações Grupo de Linguagens de Programação - DI/PUC-Rio
1
Grupo de Linguagens de Programação
Departamento de Informática
PUC-Rio
Java First-Tier: Aplicações
Orientação a Objetos
em Java (II)
2
Sobrecarga
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
Sobrecarga de Construtores
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
Sobrecarga de Construtores:
Exemplo de Declaração
class Point {
int x = 0;
int y = 0;
Point() {
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
...
}
5
Sobrecarga de Construtores:
Exemplo de Uso
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
Encadeamento de
Construtores
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.
pf3
pf4
pf5
pf8

Pré-visualização parcial do texto

Baixe Aplicações de Java: Sobrecarga de Métodos, Herança e Polimorfismo e outras Notas de estudo em PDF para Construção, somente na Docsity!

Grupo de Linguagens de Programação Departamento de Informática PUC-Rio

Java First-Tier: Aplicações

Orientação a Objetos

em Java (II)

2

Sobrecarga

 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

Sobrecarga de Construtores

 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

Sobrecarga de Construtores:

Exemplo de Declaração

class Point { int x = 0; int y = 0; Point() { } Point(int x, int y) { this.x = x; this.y = y; } ... }

5

Sobrecarga de Construtores:

Exemplo de Uso

 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

Encadeamento de

Construtores

 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

Exemplo revisitado

class Point { int x, y; Point() { this(0,0); } Point(int x, int y) { this.x = x; this.y = y; } ... }

8

Sobrecarga de Métodos

 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

Sobrecarga de Métodos:

Exemplo de Uso

 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

Herança & Polimorfismo

11

Herança

 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

Interface & Código

 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

Superclasse Comum

 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

Especialização × Extensão

 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

 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

Polimorfismo de Pixel

 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

Exemplo de Polimorfismo

 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

Mais sobre Polimorfismo

 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

Conclusão

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

Ampliando o Exemplo

 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

Ampliando o Exemplo (cont.)

 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+“)”); } }

Ampliando o Exemplo (cont.)

30

Ampliando o Exemplo (cont.)

 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

Classes Constantes em Java

 Uma classe inteira pode ser definida final. Nesse caso, em particular, a classe não pode ser estendida.

public final class A { ... }

38

Conversão de Tipo

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

Type Casting

 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

Mais Type Casting

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

instanceof

 Permite verificar a classe real de um objeto

if (pt instanceof Pixel) { Pixel px = (Pixel)pt; … }

42

Classes Abstratas

 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

Classes Abstratas em Java

 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

Exemplo de Classe Abstrata

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

Próxima Aula de Laboratório

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.