Java Polimorfismo: Figuras Planas, Herança e Classes Abstratas
Figuras Planas em Java: Herança e Polimorfismo
Este exemplo demonstra o uso de herança, polimorfismo e vinculação dinâmica em Java, por meio de uma hierarquia de classes de figuras planas.
Classe Base: FiguraPlana
class FiguraPlana {
double area() {
return 0;
} // será corrigido com Classes Abstratas
double perimetro() {
return 0;
}
void mostrarDados() {
System.out.println("\nNome do Objeto: " + this.toString());
System.out.println("\nÁrea = " + this.area());
System.out.println("\nPerímetro = " + this.perimetro());
}
}Classe Retangulo
class Retangulo extends FiguraPlana {
private float ladoA;
private float ladoB;
public Retangulo(float ladoA, float ladoB) {
this.ladoA = ladoA;
this.ladoB = ladoB;
}
public float getLadoA() {
return this.ladoA;
}
public void setLadoA(float ladoA) {
this.ladoA = ladoA;
}
public float getLadoB() {
return this.ladoB;
}
public void setLadoB(float ladoB) {
this.ladoB = ladoB;
}
@Override
double area() {
return this.ladoA * this.ladoB;
}
@Override
double perimetro() {
return 2 * (this.ladoA + this.ladoB);
}
@Override
void mostrarDados() {
System.out.println("Retângulo com lados " + this.ladoA + " e " + this.ladoB);
super.mostrarDados();
}
}Classe Circulo
class Circulo extends FiguraPlana {
private float raio;
public Circulo(float raio) {
this.raio = raio;
}
public void setRaio(float raio) {
this.raio = raio;
}
public float getRaio() {
return this.raio;
}
// Método exclusivo
float diametro() {
return this.raio * 2f;
}
@Override
double area() {
return Math.PI * Math.pow(this.raio, 2);
}
@Override
double perimetro() {
return this.comprimento();
}
// Método exclusivo
double comprimento() {
return 2 * Math.PI * this.raio;
}
// Método exclusivo: área em função do comprimento (em PI)
double area(float comprimento) {
float raio;
raio = comprimento / 2;
return Math.pow(raio, 2);
}
@Override
void mostrarDados() {
System.out.println("\nInformações do círculo de raio " + this.raio);
super.mostrarDados();
System.out.println("\nDiâmetro = " + this.diametro());
}
}Classe de Teste: LerFiguraPlana
class LerFiguraPlana {
public static char lerTipo() throws Exception {
char tipo;
do {
System.out.print("\nInforme 'R' para Retângulo, 'C' para Círculo ou 'F' para Fim -> ");
tipo = JUtil.readChar();
} while ((tipo != 'R') && (tipo != 'C') && (tipo != 'F'));
return tipo;
}
public static void main(String[] args) throws Exception {
FiguraPlana fp = new FiguraPlana(); // Resolver com Classe Abstrata
// fp é uma variável polimórfica:
// fp é um ator que pode assumir o papel de Círculo ou Retângulo
char tipo; // Retângulo ou Círculo
System.out.println("Dados da Figura Plana");
tipo = lerTipo();
while (tipo != 'F') {
switch (tipo) {
case 'R': {
fp = new Retangulo(0, 0);
System.out.print("\nInforme a base -> ");
((Retangulo) fp).setLadoA(JUtil.readFloat()); // cast
System.out.print("\nInforme a largura -> ");
((Retangulo) fp).setLadoB(JUtil.readFloat());
break;
}
case 'C': {
fp = new Circulo(0);
System.out.print("\nInforme o raio -> ");
((Circulo) fp).setRaio(JUtil.readFloat());
break;
}
} // switch
fp.mostrarDados(); // polimorfismo e vinculação dinâmica aqui
System.out.print("\nÁrea NOVAMENTE = " + fp.area());
// System.out.print("\nDiâmetro = " + ((Circulo) fp).diametro());
// fp é uma instância de Círculo?
if (fp instanceof Circulo) {
System.out.println("\nDiâmetro " + ((Circulo) fp).diametro());
}
if (fp instanceof Circulo) {
System.out.println("\nÁrea em PI do círculo com comprimento 20 PI " + ((Circulo) fp).area(20));
}
tipo = lerTipo();
} // while
} // main
} // class