Java polimorfismo

Estou fazendo uns exercícios aqui pra praticar e me deparei com um erro, não entendi o porque dele, essa classe quadrado está funcionando normalmente, porém, a que vem em seguida, a classe retângulo, tá dando um erro, sendo que os princípios das 2 classes são os mesmos, poderiam me ajudar??

public class Quadrado extends Poligono implements Diagonal {

	public Quadrado(double altura, double base) {
		super(altura, base);

	}

	@Override
	public double area() {

		return getBase() * 2;
	}

	@Override
	public double base() {

		return this.base();
	}

	@Override
	public double altura() {

		return this.altura();
	}

	@Override
	public double calcularDiag() {
		return (Math.sqrt(2)) * this.getAltura();

	}

	@Override
	public double perimetro() {

		return ((getBase() + getBase()) * 2);
	}

	public String toString() {

		return "A Diagonal do quadrado é " + calcularDiag() + ", o perímetro do quadrado é " + perimetro()
				+ ", e a área do quadrado é " + area()+ "\n";

	}

}

classe retângulo…

public class Retangulo extends Poligono implements Diagonal {

	public Retangulo(double altura, double base) {
		super(altura, base);

	}

	@Override
	public double base() {

		return this.base();
	}

	@Override
	public double altura() {

		return this.altura();
	}

	@Override
	public double calcularDiag() {

		return (altura() * 2 + base() * 2) * 0.5;
		//return ((Math.pow(altura(), 2) + Math.pow(base(), 2)) * 0.5);
	}

	@Override
	public double perimetro() {

		return getAltura() + getBase() + getAltura() + getBase();
	}

	@Override
	public double area() {

		return getBase() * getAltura();
	}

	public String toString() {

		return "A Diagonal do retângulo é " + calcularDiag() + ", o perímetro do retângulo é " + perimetro()
				+ ", e a área do retângulo é " + area()+ "\n";

	}

}

erro: Exception in thread “main” java.lang.StackOverflowError
at Retangulo.altura(Retangulo.java:18)
at Retangulo.altura(Retangulo.java:18)
at Retangulo.altura(Retangulo.java:18)

Vc precisaria mandar o código todo pra testar. Com método main e tudo, pra gente copiar, executar e ver o resultado. Se puder colocar no repl.it, melhor ainda.

Mas olhando por cima, acredito que seu erro esteja no fato de que vc está criando métodos que invocam a si mesmos. Como no trecho abaixo.

@override
public double base() {
    return this.base();
}

@Override
public double altura() {
    return this.altura();
}

O que vc deveria fazer seria algo assim:

class Poligono {
    private double base;
    private double altura;

    public double getBase() {
        this.base;
    }

    public double getAltura() {
        this.altura;
    }
}

Percebeu? Eu tenho um campo chamado base que é privado, e quando eu invoco o getBase(), ele retorna o valor deste campo.

Se quiser manter a nomenclatura que está usando, vc poderia fazer assim:

class Poligono {
    private double _base;
    private double _altura;

    public double base() {
        this._base;
    }

    public double altura() {
        this._altura;
    }
}

Aí sempre que vc ver um nome começando com um _ vai saber que se trata de um campo privado, mas eu não recomendo fazer isso, é melhor manter as convenções da linguagem.

É exatamente o que o @wldomiciano disse

O StackOverFlowError é lançado quando há um estouro de memória, no seu caso, o seus métodos altura() e base() ficam se chamando em um loop eterno, ai acaba dando essa exceção.