Duda: Inicializar constructor en Java.

Estaba mirando el siguiente ejemplo, en el cual, tengo una clase Top y Bottom2 (la cual está definida de manera incorrecta y no se el por qué):

 

 

El error que sale es:
 

Mi duda es, por qué es necesario establecer el constructor por defecto en la clase Top para que el constructor de la clase Buttom2 pueda iniciar correctamente? Alguien me explica.

No se supone que el constructor de la clase Buttom2 llama al constructor que tiene los mismos argumentos en la clase Top?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

explícito

El único constructor implícito es el que no lleva argumentos. Si extiendes una clase que no tiene constructor sin argumentos, debes invocar algún constructor de la superclase antes de hacer cualquiera cosa. En este caso, la primera línea del constructor de Bottom2 debe ser  . Si en la clase Top tuvieras un constructor sin argumentos, el código compilaría bien pero sería equivalente a que la primera línea del constructor de Bottom2 fuera  .

Constructor por defecto

ezamudio tiene toda la razón.

De hecho esa es una clásica pregunta de certificación.

Además de lo que te comenta ezamudio de colocar super(s)

Podrías quitar el constructor con argumentos de la clase Top y crearle su método set y get al String para poder establecer su valor, como si fuera un Bean de la siguiente forma:

public class Top {
private String miCadena = "";

public void setMiCadena(String s){ miCadena = s;}
public String getMiCadena(){ returng miCadena;}

// public Top( String s ) {
// System.out.println("Segundo Constructor de la clase Top");
// }

}

class Bottom2 extends Top {

public Bottom2( String s )
{
System.out.println("Segundo Constructor de la clase Bottom2");
}
}

De esta forma el compilador cuando detecta que la clase Top no ningún constructor, le crea el de default para poder compilar correctamente, lo puedes corroborar si tu descompilas tu clase Top.class

public class Top extends java.lang.Object
{
public Top();//CREADO POR EL COMPILADOR

public void setMiCadena(java.lang.String);

public java.lang.String getMiCadena();
}

ok

Gente.. gracias...