Constructor {0} in class {1} cannot be applied to given types

publicado por: Anonymous

Mi consulta se debe a que cree una subclase (libroInfantil) que extiende de la clase Libro, al reescribir el constructor en la subclase me salta un error, el cual no termino de entender:

Constructor Libro in class libro cannot be applied to given types; requered: boolean, String, String, int, int; found: No arguments; Reason: Actual and formal arguements lists differ in length

El código es el siguiente:

package ejerciciolibroinfantil;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 *
 * @author jorge
 */
public class EjercicioLibroInfantil {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        // TODO code application logic here

        System.out.println("Ingresee los datos correspondientes");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

       System.out.print("Titulo: ");
       String til = br.readLine();
       System.out.print("ISBN: ");
       String ISBN = br.readLine();
       System.out.print("Cantidad de paginas: ");
       int numPaginas = Integer.parseInt(br.readLine());
       System.out.print("Pagina Actual: ");
       int pagAcual = Integer.parseInt(br.readLine());
       System.out.print("Edad requerida: ");
       int edadRec = Integer.parseInt(br.readLine());

       LibroInfantil lib = new LibroInfantil(false, til, ISBN, numPaginas, pagAcual,edadRec);

      lib.abierto();
      lib.mostrarLibro();
      lib.esRecomendable(edadRec);

    }

}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ejerciciolibroinfantil;

/**
 *
 * @author jorge
 */
public class LibroInfantil extends Libro{

    private int edadRecomendado = 18;


    public LibroInfantil(boolean estado, String titulo, String ISBN,int numPaginas, int pagActual, int edadRec){

        this.estado = estado;
        this.titulo = titulo;
        this.ISBN = ISBN;
        this.numPaginas = numPaginas;
        this.pagActual = pagActual;
        this.edadRecomendado = edadRec;
    }

    public boolean esRecomendable(int edadNinyo){

        if(edadNinyo < 18)
            return true;
        return false;
    }        
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ejerciciolibroinfantil;

/**
 *
 * @author jorge
 */
public class Libro {

    protected boolean estado = false;
    protected String titulo ="null";
    protected String ISBN = "null";
    protected int numPaginas = 0;
    protected int pagActual = 0;

    public Libro(boolean estado, String titulo, String ISBN,int numPaginas, int pagActual){

        this.estado = estado;
        this.titulo = titulo;
        this.ISBN = ISBN;
        this.numPaginas = numPaginas;
        this.pagActual = pagActual;
    }

    public void abierto(){

        this.estado = true;
        System.out.println("Libro abierto");
    }

    public void cerrado(){

        this.estado = false;
        System.out.println("Libro cerrado");
    }

    public void mostrarLibro(){

        System.out.println("Titulo del libro: "+titulo+" ISBN: "+ISBN+" Numero de pag: "+numPaginas+" Pagina Actual: "+pagActual);
    }
}

solución

Puede que modificando la clase siguientente:

package ejerciciolibroinfantil;

/**
 *
 * @author jorge
 */
public class LibroInfantil extends Libro{

private int edadRecomendado = 18;

  public LibroInfantil(boolean estado, String titulo, 
                      String ISBN,int numPaginas, 
                      int pagActual, int edadRec) {

        super(estado, titulo, ISBN, numPaginas, pagActual);

        this.edadRecomendado = edadRec; //este que usted usa no se como lo usa pero hay va.
    }

    public boolean esRecomendable(int edadNinyo){

        if(edadNinyo < 18)
            return true;
        return false;
    }

pruebe con super(params):

UPDATE:(resulto ser que si contaba con esos metodos al mejorar el formato pude ver que si extendia de libro, despues lo borro, aun asi pruebe por que se añade super).


Nuevo:

En base a sus preguntas en los comentarios saque algo de tiempo para analizar su codigo, pues veia que usaba la herencia, protect, this, bueno que no entendia muy bien el porque fallo/error (uno puede tener fallos de codigo “yo el primero”) pero no me refiero a el fallo sino al transfondo del error y creo que esto lo puede ayudar.

La llamada al constructor de la clase base puede ser implicita

  • Si se omite se llamara implicitamente al constructor por defecto:
  • Equivale a poner como primera sentencia super();
  • Si no existe el constructor por defecto en la clase base dara un error en tiempo de compilacion

    o explicita:

  • super(params); o super(); o los parametros que lleve el constructor que quiera invocar de la clase base dependera si el constructor al que
    invocamos tiene o no argumentos

Cuando creas clase “simples” usted abra experimentado o puede haber visto que no hace falta crear el constructor;

por ejemplo:

public class TestBase {


}

y hacer:

TestBase testBase = new TestBase();

Y crear el objeto sin ningun problema, pues el compilado ya lo crea por usted. Cuando usted crea una clase esa clase no static se espera que usted pueda crear instancias de la misma.

Entonces usted podria hacer tambien esto:

public class TestDerivada extends TestBase {

       public TestDerivada (String str){

       }         
}

y hacer:

TestDerivada test = new TestDerivada("String");

Por que funciona, porque se esta invocando el constructor de la clase base de forma implicita desde la clase derivada, y a que constructor, al constructor que se crea por defecto que fue mensionado antes, al ser omitido, es como si se pusiera super();

Pero ahora si usted cambia y añade un constructor:

public class TestBase {

   public TestBase (String str){

   }
}

y hace:

TestDerivada test = new TestDerivada("String");

Recivira un error en tiempo de compilacion (algunos ide te avisan de esto, si no tu tranquilo que ya te avisa el compilador), porque tiene que llamar al constructor de la clase base.

“Y usted puede decir vale no lo llame, pero se decia que se llamaba tambien por defecto si no se ponia nada en la clase derivada, porque era creado por el complilador bla bla”.

Y si pero cuando la clase en este caso la base se le añade un constructor creado por usted el constructor que creaba el compilado es omitido, y por que, porque usted esta definiendo como quiere que se comporte/logica a la hora de crear instancias, de no ser asi alguien podria instanciarlo de una manera para la que no fue diseñada la clase.

Este es un ejemplo simple, pero si esa clase se le pasara a otra como parametro, y tubiera que tomar datos de esa clase/instancia para trabajar, y resulta que eso datos solo son inicializado/creados o lo que sea, desde el constructor que usted creo, pues seria un problema porque en el constructor por defecto estas “llamense” variables no estarian inicializadas o creadas o lo que usted implementara en el construtor que diseño (espero se entienda).

Tendria que quedar algo asi:

public class TestBase {

   public TestBase (String str){

   }
}

.

public class TestDerivada extends TestBase {

       public TestDerivada (String str){
           super(str);
           //super(); <- no valdria porque no esta, ni tampoco dejalo sin ninguno por lo mismo
       }         
}

si quisiera llamarlo de manera implicita o explicita tendria que crearlo pues, ya añadio uno antes y este otro digamos que es anulado.

Seria algo asi;

public class TestBase {

   public TestBase (){

   }

   public TestBase (String str){

   }
}

Sabiendo eso usted puede usarlo de la manera que crea mas oportuno en su codigo, (ademas de lo que le comente en los comentarios).

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *