Professional Documents
Culture Documents
}
• 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.
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;
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
# nome: String
# sobrenome: String