¿Concepto de herencia de Java que se refiere al constructor de superclase?

Estaba haciendo un simple programa de herencia, sin embargo, me confundí al hacer este programa.

Aquí está el programa simple:

class Box {
    double width;
    double height;
    double depth;
    Box(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }
    //Error on removing the Box() Constructor
    Box() {
        width = -1; 
        height = -1;   
        depth = -1;  
    }

    double volume() {
        return width * height * depth;
    }
}

class BoxWeight extends Box {
    double weight,h,w,d; 

    BoxWeight(double w, double h, double d, double m) {

        // If i add super(w,h,d) here, then it is working, WHy?
        this.h = h;
        this.d = d;
        this.w = w;
        weight = m;
    }
}
class DemoBoxWeight {
    public static void main(String args[]) {
        //Implementation of above
    }
}

Lo que me confundió es que, cuando elimino el Box()constructor, me da un error en la línea donde BoxWeight(double w, double h, double d, double m)se define el constructor.The error is: "constructor Box in class Box cannot be applied to given types".

Si llamo super()desde dentro BoxWeight(), entonces funciona bien. No entiendo por qué? Sé que el concepto es bastante simple, pero me cuesta entenderlo. Cualquier ayuda es apreciada.

Respuesta 1

Su constructor BoxWeight(double w, double h, double d, double m)no llama a un súper constructor explícitamente. Esto significa que Box()se llama al constructor predeterminado .

Si elimina ese constructor o lo hace inaccesible BoxWeight, obtendrá este error.

Lo que puede hacer en su lugar es llamar al otro constructor explícitamente, como ya descubrió:

BoxWeight(double w, double h, double d, double m) {

        super(w,h,d);
        this.h = h;
        this.d = d;
        this.w = w;
        weight = m;
}

Una clase heredada solo se puede construir llamando a un constructor en la superclase.

Respuesta: 2

Cuando crea objetos de una subclase, si no realiza una llamada explícita al constructor de la superclase inmediata de la clase, entonces, implícitamente, se llama al constructor predeterminado de la superclase inmediata (y esta cadena continúa la jerarquía de herencia).

Esto es lo que estás haciendo con la llamada a super(w, h, d). Está llamando explícitamente al constructor de la superclase de Box. En este caso, super()se omite la llamada implícita a . super()es una llamada al constructor predeterminado de la superclase. Pero como no ha incluido un constructor predeterminado, se produce un error.

Sin embargo, supongamos que agrega un constructor predeterminado a su clase Box. Entonces también este código debería funcionar bien, ya que ahora, una llamada para super()invocar al constructor predeterminado de la superclase

Respuesta: 3

Cuando una clase no define su propio constructor, el lenguaje proporciona automáticamente un constructor implícito sin parámetros por defecto.

Cuando una clase define al menos un constructor, el lenguaje no proporciona ningún constructor implícito, por lo que la clase solo puede instanciarse utilizando uno de los constructores que define.

Cuando el constructor de una clase derivada no invoca a ningún constructor de su superclase, el lenguaje proporciona automáticamente una llamada implícita a super(). Pero para que esto funcione, la superclase debe tener un constructor sin parámetros (explícito o implícito).

Entonces, lo que está sucediendo con el código anterior es que el constructor de BoxWeightno está invocando explícitamente super(), super()por lo que el lenguaje proporciona una llamada implícita a . Esto funciona, porque Boxdefine un constructor explícito sin parámetros Box().

Cuando elimina el constructor sin parámetros explícito Box(), el compilador no tiene ningún constructor Boxpara invocar desde dentro del BoxWeightconstructor. No puede invocar al constructor restante, porque toma parámetros, y el compilador no puede simplemente decidir qué parámetros pasar. Y como ha descubierto usted mismo, si realiza una llamada al constructor Boxque acepta parámetros, su código se compila nuevamente.

Además, tenga en cuenta para futuras referencias: "Me da un error" no es una descripción adecuada de un problema. Le da un error muy específico, que debe incluir en su pregunta. El error es: "el constructor Box en la clase Box no se puede aplicar a tipos dados".

Respuesta: 4

En Java, ¿por qué la instancia de una palabra clave y no un método? public static void main (String args []) {Simple1 s = new Simple1 (); System.out.println (s instanceof Simple); // cierto }

Tengo una clase que acepta un tipo genérico, y quiero anular el método equals de una manera no incómoda (es decir, algo que se ve limpio y tiene una cantidad mínima de código, pero para un uso muy general ...

La API estándar no incluye una implementación AtomicBitSet. Podría rodar el mío sobre AtomicIntegerArray, pero preferiría que no. ¿Alguien sabe de una implementación existente lanzada ...

Quiero dibujar una imagen PARCIALMENTE transparente encima de otra (Hacer sombras sobre las cosas). Actualmente estoy usando la clase Graphics2D de java para renderizar, me han dicho que configure el compuesto en ...