Un'errore e' nella restituzione del perimetro.
Ad esempio nel triangolo restituisci lati*3 (cioe' 9), in realta' devi restituire lati * lughezza, altrimenti non ha senso.
E comunque e' tutto il concetto a non stare in piedi.
Per utilizzare il polimorfismo dovresti partire da una superclasse astratta chiamata Poligono, la quale ha un metodo area e un metodo perimetro, che restituiscono rispettivamente area e perimetro dell'oggetto in questione.
Poi ogni figura che intendi implementare estende la classe Poligono e fornisce una corretta implementazione dei metodi.
Di conseguenza dal tuo programma principale agisci sempre su un oggetto di tipo Poligono, ci pensa poi il linguaggio a run time ad eseguire il corretto metodo, in base all'effetiva natura dell'oggetto che sta utilizzando.
Esempio veloce (e non testato, non ricordo dove vanno messe le parole chiave abstract)
codice:
class abstract Poligono {
public abstract double perimetro() {}
public abstract double area() {}
}
class Quadrato extends Poligono {
private double lato;
Quadrato( double l) {
lato = l;
}
public double perimetro() {
return lato*4;
}
public double area() {
return lato*lato;
}
}
class Cerchio extends Poligono {
private double raggio;
Quadrato( double l) {
raggio = l;
}
public double perimetro() {
return 2*raggio*Math.PI;
}
public double area() {
return raggio*raggio*Math.PI;
}
}
class prova {
public static void main(String args[]) {
Poligono p;
Quadrato q = new Quadrato( 19.5);
Cerchio c = new Cerchio( 100);
p = q;
System.out.println( p.perimetro());
System.out.println( p.area());
p = c;
System.out.println( p.perimetro());
System.out.println( p.area());
}
}
Come vedi chiamo sempre i metodi di un generico poligono, che faccio riferire una volta ad un cerchio e una volta ad un quadrato.
Se poi in futuro volessi implementare un'altra figura, ad esempio il triangolo, estendendo la classe Poligono il tutto funzionerebbe senza bisogno di modifiche, se non al main.