/**
 * {@link <a href=
 * "https://[Log in to view URL]" target=
 * "_blank">Astrazione, incapsulamento, ereditarietà, polimorfismo</a>}
 * 
 * @author itammb ( Italia Massimiliano Buscati )
 * @version JDK 1.15
 *
 */
class Main {
	public static abstract class Figura {
		// incapsulamento
		private String colore;

		// costruttore
		public Figura(String colore) {
			this.colore = colore;

			System.out.println("super.costruttore");
		}
		
		public String getColore() {
			return colore;
		}

		// metodo senza corpo
		protected abstract double area();

		protected abstract double calculate(double a, double b);

		@Override
		public String toString() {
			return String.format("Figura [colore=%s]", colore);
		}
	}

	public static final class Cerchio extends Figura {
		// errore
		// private String colore;
		private double raggio;
		
		public Cerchio(String color, double raggio) {
			// chiama il costruttore padre
			super(color);

			this.raggio = raggio;
		}

		public double area() {
			return calculate(Math.PI, Math.pow(raggio, 2));
		}
		
		protected double calculate(double a, double b) {
			return a * b;
		}

		@Override
		public String toString() {
			return String.format("Cerchio [raggio=%s, area()=%s, toString()=%s, getColore()=%s]", raggio, area(),
					super.toString(), getColore());
		}
	}

	public static class Rettangolo extends Figura {
		private double area, lunghezza, larghezza;
		
		public Rettangolo(String colore, double lunghezza, double larghezza) {
			super(colore);

			// overloading 
			area = calculate(lunghezza, larghezza);

			this.lunghezza = lunghezza;
			this.larghezza = larghezza;
		}

		public Rettangolo(String colore, int lunghezza, int larghezza) {
			super(colore);

			// overloading 
			area = calculate(lunghezza, larghezza);

			this.lunghezza = lunghezza;
			this.larghezza = larghezza;
		}
		
		public double getLunghezza() {
			return lunghezza;
		}

		public double getLarghezza() {
			return larghezza;
		}

		protected int calculate(int a, int b) {
			return a * b;
		}

		protected double calculate(double a, double b) {
			return a * b;
		}

		public double area() {
			return area;
		}

		@Override
		public String toString() {
			return String.format(
					"Rettangolo [area=%s, lunghezza=%s, larghezza=%s, getLunghezza()=%s, getLarghezza()=%s, area()=%s, getColore()=%s, toString()=%s]",
					area, lunghezza, larghezza, getLunghezza(), getLarghezza(), area(), getColore(), super.toString());
		}	
	}
	
	public static void main(String args[]) throws Exception {
		// Unit test - astrazione, incapsulamento, ereditarietà, polimorfismo
   	 	System.out.println( new Cerchio( "rosso", 20d ).toString() );  	 
   	    System.out.println( new Rettangolo( "blu", 20d, 20d ).toString() ); 
   	 
   	    // Unit test - overloading del metodo	 
   	    System.out.println( new Rettangolo( "verde", 20, 20 ));
	}
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: