2010-09-04 14 views
21

Funciona bien cuando los constructores no están definidos, pero da errores si defino un constructor parametrizado y no uno predeterminado y no pasa ningún valor al crear un objeto. Pensé que los constructores están predefinidos.¿Realmente necesito definir el constructor predeterminado en java?

¿Por qué tengo que definir un constructor predeterminado si he definido un constructor con parámetros? ¿No está predefinido el constructor predeterminado?

Respuesta

48

Un constructor predeterminado (sin argumentos) se crea automáticamente solo cuando no define ningún constructor usted mismo.

Si necesita dos constructores, uno con argumentos y otro sin, necesita definir manualmente ambos.

+1

[Enlace a los documentos] (https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html): "No tiene que proporcionar ningún constructor para su clase, pero debe tenga cuidado al hacer esto. El compilador proporciona automáticamente un constructor predeterminado sin argumentos para cualquier clase sin constructores. Este constructor predeterminado llamará al constructor sin argumentos de la superclase. En esta situación, el compilador se quejará si la superclase no funciona t tiene un constructor sin argumentos, por lo que debe verificar que lo haga ". – ruhong

+0

Y de forma predeterminada ¿Objeto es la superclase de todas las clases, se llama al constructor sin argumentos para Object? – Lucky

+0

@Lucky Todas las clases implícitamente extienden 'Objeto', así que sí, se llama' Objeto() '. –

10

Un constructor no-arg se inserta automáticamente para usted, si no escribe uno. Esto significa que, si escribe un constructor con algunos parámetros, será el único constructor que tenga, por lo que debe pasar algunos valores para esos parámetros para crear una instancia de este.

1

Este es exactamente el comportamiento esperado.

Java genera automáticamente un valor predeterminado (sin constructores de argumentos) para las clases que no tienen ningún constructor.

Si define otro constructor (con argumentos), no se generará el constructor predeterminado. Si aún quiere uno, necesita definirlo usted mismo.

8

Si bien todas las respuestas anteriores son correctas, es un poco difícil para los recién llegados envolverlo en sus cabezas. Trataré de responder la pregunta de nuevo para los recién llegados.

El problema que Ayush enfrentaba era al intentar crear una instancia de un Object para una clase a través de un constructor sin argumentos. Sin embargo, esta clase tiene uno o más constructores parametrizados y esto da como resultado un error de tiempo de compilación.

Por ejemplo, permítanos crear una clase Student con un único constructor parametrizado e intente crear una instancia a través del constructor no-arg.

public class Student { 

    private String name; 
    private int rollNo; 

    public Student(String name, int rollNo) { 
     this.name = name; 
     this.rollNo = rollNo; 
    } 

    public static void main(String[] args) { 
     // The line below will cause a compile error. 
     Student s = new Student(); 
     // Error will be "The constuctor Student() is undefined" 
    } 
} 

Woha! Pero cuando eliminamos el public Student(String name, int rollNo) constructor todos juntos, el error se ha ido y el código se compila.

La razón detrás de esta aparente anomalía reside en el hecho de que Java sólo se nos proporciona el valor por defecto (sin argumentos) cuando el constructor no definimos ninguna constructora de dicha clase por nuestra cuenta.

Por ejemplo, la siguiente clase se suministra con un contructor por defecto:

public class Student { 
    private String name; 
    private int rollNo; 
} 

se convierte en:

public class Student { 

    private String name; 
    private int rollNo; 

    //Default constructor added by Java. 
    public Student() { 
     super(); 
    } 
} 

En otras palabras, el momento en que definimos ningún constructor con parámetros, que necesidad también define un constructor no-arg si queremos instanciar el objeto de esa clase a través de un constructor no-arg.

También en caso de herencia, una subclase sin constructores; se suministra un constructor predeterminado . Este constructor predeterminado suministrado por Java como el anterior llama al constructor no-arg de la superclase. Si no puede encontrar uno, arrojará un error.

Así que sí, siempre es una buena opción para definir un constructor no arg/predeterminado.

Ref: Oracle Java Tutorial

1

Siempre que se cumpla la clase, si el compilador no encuentra ningún constructor válida en la clase (por defecto, parametrizada) sólo al final por sustituir automático genera constructor por defecto para su clase.

Debes haber notado que puedes crear objetos sin ningún constructor predeterminado definido en tu clase, ahí viene el concepto de constructor autogenerado por defecto. Como siempre que se crea un objeto, se llama al constructor predeterminado.

Pero, si define parametrizada constructor en la clase, eso significa que restringir los objetos que tienen que los parámetros

Ejemplo: Cada empleado debe tener un id.

Por lo tanto, en ese momento, el compilador no insertará ningún constructor predeterminado allí, ya que hay un constructor válido en una clase. Si también necesita un constructor predeterminado, debe definirlo usted mismo.

Cuestiones relacionadas