Usar de palabra clave super en Java

Nikhil Bansal:

Duda tengo con respecto a la impresión de la declaración constructor de la superclase , incluso cuando no he utilizado super () en la subclase de palabras clave.

class A
{
    int i;
    A()
    {
        System.out.println("A's constructor");
    }
}
class B extends A
{
    int i;
    B(int a , int b)
    {
        super.i=a;
        i=b;
    }
    void show()
    {
        System.out.println(super.i);
        System.out.println(i);
    }
}
class UseSuper
{
    public static void main(String[] args)
    {
        B b=new B(1,2);
        b.show();
    }
}

La salida de mi programa es:

El constructor de una

1

2

Soy incapaz de entender por qué estoy recibiendo el constructor de un impreso en mi consola?

Arvind Kumar Avinash:

Compruebe las siguientes líneas de https://docs.oracle.com/javase/tutorial/java/IandI/super.html


Nota: Si un constructor no explícitamente invocar un constructor de la superclase, el compilador de Java inserta automáticamente una llamada al constructor sin argumentos de la superclase. Si la superclase no tiene un constructor sin argumentos, obtendrá un error en tiempo de compilación. Objeto tiene un constructor de este tipo, por lo que si objeto es la única superclase, no hay ningún problema.


Si un constructor de la subclase invoca un constructor de su superclase, ya sea explícita o implícitamente, se podría pensar que habrá toda una cadena de llamadas constructores, toda la vuelta hasta el constructor del objeto. De hecho, este es el caso. Se llama constructor de encadenamiento, y hay que tener en cuenta que cuando hay una larga línea de descendencia clase.

Espero, se aclara sus dudas.

[Actualizar]

La publicación de esta actualización a dudas clara de OP se ha mencionado en su comentario a continuación.

El siguiente código no compilará porque súper implícita constructor A()no ha sido definida y que tampoco se han definido de forma explícita. Tenga en cuenta que el super constructor implícito A()se define automáticamente cuando no hay otro constructor con argumentos han sido definidos.

class A {
    int i;

    A(int x,int y){

    }
}

class B extends A {
    int i;

    B(int a, int b) {
        super.i = a;
        i = b;
    }

    void show() {
        System.out.println(super.i);
        System.out.println(i);
    }
}

public class UseSuper {
    public static void main(String[] args) {
        B b = new B(1, 2);
        b.show();
    }
}

[Otro Actualización]

La publicación de esta actualización para OP clara es otra duda que ha mencionado en su comentario a continuación.

El siguiente código no se compilará también porque el súper constructor A()ha sido declarada como privatela prevención del constructor de la clase infantil llamarlo.

class A {
    int i;

    private A() {
        System.out.println("A's constructor");
    }
}

class B extends A {
    int i;

    B(int a, int b) {
        super.i = a;
        i = b;
    }

    void show() {
        System.out.println(super.i);
        System.out.println(i);
    }
}

class UseSuper {
    public static void main(String[] args) {
        B b = new B(1, 2);
        b.show();
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=282062&siteId=1
Recomendado
Clasificación