You are on page 1of 30

12492 - PROGRAMAÇÃO ORIENTADA A OBJETOS

Prof. MSc. Karl Phillip Buhr


Curso: 620 - Engenharia da Computação
Componente Curricular: 12492
Créditos: 4
Fase: 3
• Quando implementar uma classe que herda de outra,
ao implementar o construtor da subclasse é importante
invocar o construtor da superclasse, através do método
super():
class A {
public A() { System.out.println("Superclasse"); }
}
class B extends A {
public B() {
super();
System.out.println("Subclasse");
}
}
• Como o exemplo anterior nos mostra, invocar
super() é a primeira coisa que deve ser feita quando
você implementa o construtor de uma subclasse.
• Mesmo que você não invoque explicitamente o
construtor da superclasse, o compilador do Java irá
fazer isso por você (apenas no caso de ser um
construtor padrão).
• O motivo pelo qual isso deve ser feito é para poder
inicializar todos os atributos que foram herdados da
superclasse.
• É essencial entender que os construtores das
superclasses não são herdados.

• Vamos estudar a implementação a seguir e


entender porque o erro de compilação
acontece:
• Código:
class A {
public A(int alfa) { System.out.println("Superclasse"); }
}
class B extends A {

}
• Erro:
constructor A in class A cannot be applied to given types;
class B extends A {
required: int
found: no arguments
reason: actual and formal argument lists differ in length
• Aprendemos anteriormente que quando decidimos
implementar um construtor, o construtor padrão
que era gerado automaticamente pelo compilador
do Java, deixa de existir.
• Neste caso:
– A superclasse implementa um construtor
parametrizado, e por isso não possui mais um
construtor padrão;
– A subclasse por sua vez, não implementa nenhum
construtor, e por isso ganha de presente um
construtor padrão do compilador do Java.
• O problema principal é que o construtor padrão da
subclasse tenta invocar o construtor padrão da
superclasse, que simplesmente não existe.
• Como resolver este erro?
– Escreva você mesmo um construtor para a subclasse,
parametrizado ou não, que invoca o construtor
parametrizado da superclasse:
class A {
public A(int alfa) { System.out.println("Superclasse"); }
}
class B extends A {
public B() { super(0); }
}
• Um problema similar pode ser observado em:
class A {
public A(int alfa) { System.out.println("Superclasse"); }
}
class B extends A {
public B(int alfa) { System.out.println("Subclasse"); }
}
• Erro:
constructor A in class A cannot be applied to given types;
public B(int alfa) {
required: int
found: no arguments
reason: actual and formal argument lists differ in length
• Neste novo caso, tanto a superclasse quanto a
subclasse implementam construtores
parametrizados idênticos (possuem a mesma
assinatura).
Qual é o problema agora?
• Apesar da subclasse implementar um construtor
parametrizado, ela não está invocando um
construtor da superclasse.
• Lembre-se que: quando seu construtor não invoca
explicitamente o construtor da superclasse através
de super(), o compilador do Java adiciona uma
instrução para fazer isso.
• O problema é que o compilador do Java sabe
invocar apenas o construtor padrão. Ele não sabe
como invocar construtores parametrizados das
superclasses.
• Assim, o erro acontece porque deixamos o
compilador do Java adicionar código no nosso
construtor para invocar o construtor da superclasse.
Desta forma, como a superclasse não possui um
construtor padrão, um erro de compilação é
gerado.
• Como consertar o problema?
– Invoque você mesmo o construtor parametrizado da
superclasse:
class A {
public A(int alfa) { System.out.println("Superclasse"); }
}
class B extends A {
public B(int alfa) {
super(alfa);
System.out.println("Subclasse");
}
}
• Nesta seção continuaremos estudando POO
explicando e demonstrando polimorfismo com
hierarquias de herança.
• O polimorfismo permite escrever programas
que processam objetos que compartilham a
mesma superclasse (direta ou indiretamente)
como se todos fossem objetos da mesma
superclasse, isso pode simplificar a
programação.

• Considerem o exemplo a seguir:


• Suponha que criamos um programa que simula
o movimento de vários tipos de animais para um
estudo biológico.
• As classes Peixe, Anfíbio e Pássaro representam
os 3 tipos de espécies sob investigação e todas
elas estendem da classe Animal, que contém o
método mover() e mantém a localização atual
de um animal como coordenadas X-Y.
• Toda subclasse implementa o método mover(),
e o programa possui um array de objetos destes
3 tipos.
• Para simular os movimentos dos animais, o
programa envia a mesma mensagem – mover –
a cada objeto uma vez por segundo.
• Entretanto, cada tipo específico de animal
responde a mensagem mover de uma maneira
única. Um Peixe poderia nadar um metro, um
Anfíbio poderia pular 2 metros e um Pássaro
poderia voar 5 metros.
• O programa emite a mesma mensagem para
cada objeto de animal, mas cada objeto sabe
como modificar suas coordenadas (X,Y)
apropriadamente de acordo com seu tipo de
movimento.
• Assumir o fato de que cada objeto sabe “fazer a
coisa certa” em resposta à mesma chamada de
método é o conceito-chave do polimorfismo.
• A mesma mensagem enviada a uma variedade
de objetos pode ter muitos resultados
diferentes.
(superclasse)
Quadrilátero

herança

(subclasse)
Exemplos: Quadriláteros
• Se a classe Retângulo for derivada da classe
Quadrilátero, então um objeto Retângulo é uma
versão mais específica de um Quadrilátero.
• Ou seja: qualquer operação realizada por um
Quadrilátero também pode ser realizada em um
Retângulo.
• Essas operações também podem ser realizadas em
outros Quadriláteros, como Quadrados,
Paralelogramos e Trapezóides.
Exemplos: Quadriláteros
• O polimorfismo ocorre quando um programa
invoca o método de um objeto que possui uma
superclasse, e tanto a superclasse como a
subclasse implementam exatamente o mesmo
método, só que para realizar tarefas diferentes.
• Em tempo de execução, a implementação do
método da subclasse tem preferência, e o
método especializado dela é executado.
public class Pai {
protected int velocidade = 0;

public void Correr(int v)


{ public class Filho extends Pai {
if (v <= 8) // 8km/h
public void Correr(int v)
velocidade = v;
{
}
if (v <= 12) // 12km/h
}
velocidade = v;
}
}
Implemente a hierarquia de classe abaixo. Certifique-
se que a superclasse implementa o método salario()
que imprime o valor padrão de salário (2000).
Implemente as duas especializações da classe levando
em consideração que o salário do professor tem 5% de
desconto, e o salário do coordenador tem 10% de
aumento. Funcionario

Professor Coordenador
Implemente a hierarquia de classe abaixo. Certifique-
se que a superclasse implementa o método area(),
que imprime uma simples mensagem na tela, e que
cada uma das suas especializações também
implemente este método, que calcula e imprime a
área do objeto específico:
Quadrilátero

Retângulo Paralelogramo Trapézio


Desenhe o diagrama de classe do exercício
anterior.
O que acontece quando o código abaixo é
compilado/executado?
class A {
private A() {
System.out.println(“Construtor de A!");
}
}
class B extends A {
public B() {
System.out.println(“Construtor de B!");
}
}
B obj_b = new B();
Exercício 5
Examine o código abaixo e desenhe o diagrama de classe:
class Animal {
public void saudacao() { System.out.println("Olá!"); }
}
class Gato extends Animal {
public void saudacao() {
System.out.println("Meow!");
}
}
class Cachorro extends Animal {
public void saudacao() {
System.out.println("Woof!");
}
public void saudacao(Cachorro amigo) {
saudacao();
amigo.saudacao();
} }
Escreva a classe principal do exercício anterior.
Instancie um objeto de cada tipo e execute todos os
métodos existentes em cada classe.
Não esqueça de adicionar a seguinte classe ao programa:
class CachorroGrande extends Cachorro {
public void saudacao() {
System.out.println("WOOOOF!");
}
public void saudacao(Cachorro amigo) {
saudacao();
amigo.saudacao();
}
}
Marque com um X todas as instruções que iriam compilar:
( ) Animal pet1 = new Animal();
( ) Animal pet2 = new Gato();
( ) Animal pet3 = new Cachorro();
( ) Gato cat1 = new Gato();
( ) CachorroGrande dog1 = new CachorroGrande();
( ) Cachorro dog2 = new Gato();
( ) Cachorro dog3 = new Animal();
( ) Cachorro cat2 = new Cachorro();
( ) Cachorro dog4 = new CachorroGrande();
( ) CachorroGrande dog5 = new Cachorro();
Escreva a superclasse Pessoa de acordo com o diagrama:
CLASSE Pessoa

# nome: String
# sobrenome: String

<<constructor>> Pessoa( nome, sobrenome: String )


+ info()

• Implemente o método info() para: imprimir o nome e o


sobrenome na tela.
• Escreva também uma especialização desta classe chamada
Estudante, que deve receber no construtor da classe, o nome e
sobrenome como Strings, e duas notas como float.
• Implemente o método info() desta subclasse para informar o
nome/sobrenome do indivíduo bem com a média aritmética
das duas notas.
BIBLIOGRAFIA
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
ANSELMO, F. Aplicando Lógica Orientada a Objetos em Java. 2ed. Florianópolis: Visual
Books, 2005.
BOENTE, A. Aprendendo a Programar em Java 2 Orientado a Objetos. São Paulo: Brasport,
2003.

CARDOSO, C. Orientação a Objetos na Prática: aprendendo orientação a objetos com Java.


Rio de Janeiro: Ciência Moderna, 2006.
COX, B, J. Programação Orientada para Objeto: o método Fusion. São Paulo: Makron Books
do Brasil, 1991.
MEYER, B. et al. Desenvolvimento Orientado a Objetos. Rio de Janeiro: Campus, 1996.

SANTOS, R. Introdução à Programação Orientada a Objetos usando Java. 2 tir. Rio de


Janeiro: Campus, 2003.
DEITEL, P., DEITEL, H. Java Como Programar. 8a ed. São Paulo: Pearson Prentice Hall, 2010.

You might also like