Comportamento de métodos polimorficos dentro de construtores

Quando se tem uma chamada a um método dentro do construtor da classe-mãe, o método sobrescrito da classe filha que será chamado. Mas fiquei em dúvida no resultado da execução do código abaixo: se eu crio 1 objeto da classe filha, obrigatoriamente, o construtor da classe mãe será gerado? E se no método main, mesmo se eu não criar 1 objeto da classe-mãe, seu construtor alocará espaço na memória para ela?

class Glyph {
    	void draw() { print("Glyph.draw()"); }
    	Glyph() {
    		print("Glyph() before draw()");
    		draw();
    		print("Glyph() after draw()");
    	}
    }

    class RoundGlyph extends Glyph {
    	private int radius = 1;
    	RoundGlyph(int r) {
    	    radius = r;
    	    print("RoundGlyph.RoundGlyph(), radius = " + radius);
            }
         void draw() {
    	    print("RoundGlyph.draw(), radius = " + radius);
    	}
    }

    public class PolyConstructors {
    	public static void main(String[] args) {
    		new RoundGlyph(5);
    	}
    } /* Output:
    Glyph() before draw()
    RoundGlyph.draw(), radius = 0
    Glyph() after draw()
    RoundGlyph.RoundGlyph(), radius = 5

O termo certo não é “gerado”, é “invocado”, “executado” ou “chamado”.
Em toda classe a primeira instrução executada dentro do construtor é a chamada ao construtor da superclasse.

Sim, quando você instancia uma classe, é necessário alocar o espaço pertinente à superclasse também.

Mas é como se tivéssemos na memória 1 objeto alocado para a superclasse, mesmo sem ter criado, de fato, 1 objeto na main?

Mas você só alocou um objeto, entenda que o código da superclasse faz parte da subclasse.

1 curtida