2011-08-25 14 views

Respuesta

50

(igual que Michael, supongo que significaba para hacer B se extienden A.)

Hay dos aspectos en el trabajo aquí:

  • Si hace especificar un constructor de forma explícita (como se en A) el compilador Java no crea un constructor sin parámetros para usted.

  • Si no se especifica explícitamente un constructor (como en B) el compilador de Java creará un constructor sin parámetros para que de esta manera:

    B() 
    { 
        super(); 
    } 
    

(La accesibilidad depende de la accesibilidad de la clase en sí.)

Eso está tratando de llamar al constructor sin parámetros de la superclase, por lo que tiene que existir. Tiene dos opciones:

  • proporcionar un constructor sin parámetros explícitamente en A
  • Proporcionar un constructor sin parámetros explícitamente en B que se pide explícitamente el constructor de la clase base con un argumento apropiado int.
+0

@ user358099: Para dejar en claro que estaba tratando de llamar al superconstructor sin parámetros. –

0

Por supuesto es un error si se escribe así, no es JAVA.

Si hubiera utilizado la sintaxis JAVA, no sería un error.

Las clases A y B no saben nada sobre el otro si están en archivos/paquetes separados.

La clase A no necesita un constructor predeterminado, funciona bien solo con un constructor de parámetros.

Si B se extiende A, simplemente utiliza una llamada a super (int a) en el constructor de B y todo está bien. para los constructores que no llamen a un súper (vacío/o no) que extienda una superclase, el compilador agregará una llamada a super().

Para más mirada de lectura en Using the Keyword super

+0

realmente una respuesta valiosa. Pero una pequeña aclaración por qué súper() se agrega implícitamente por el compilador. – bharanitharan

+0

@ user358099 He agregado una nueva respuesta a su pregunta editada. – Farmor

5

Suponiendo que significa que escribir class B extends A:

Cada constructor tiene que llamar a un constructor de la superclase; si no lo hace, el constructor de la superclase sin parámetros se llama implícitamente.

Si (y solo si) una clase no declara ningún constructor, el compilador de Java le da un constructor predeterminado que no toma parámetros y llama al constructor sin parámetros de la superclase.En su ejemplo, A declara un constructor y, por lo tanto, no tiene dicho constructor predeterminado. La clase B no declara un constructor, pero no puede obtener un constructor predeterminado porque su superclase no tiene un constructor sin parámetros para llamar. Como una clase siempre debe tener un constructor, este es un error del compilador.

+0

es un error del compilador, mi duda es ... ¿por qué la clase padre debe tener un constructor predeterminado explícitamente ... mientras que tiene un constructor argumentado – bharanitharan

+1

@ user358099: Porque el constructor predeterminado implícito solo se crea si no hay un constructor ecplicit. Y eso es porque un programador no puede * querer * que su clase tenga un constructor sin parámetros, por lo que sería un diseño de lenguaje muy malo crear siempre uno implícitamente. –

1

Diga esto compilado, ¿qué esperaría que se imprima?

class A{ 
    A(int i){ 
    System.out.println("A.i= "+i); 
    } 
} 

class B extends A { 
    public static void main(String... args) { 
    new B(); 
    } 
} 

Cuando A se construye un valor para i tiene que ser pasado, sin embargo, el compilador no sabe lo que debe ser por lo que tiene que especificar explícitamente en un constructor (cualquier constructor, que no tiene que ser una opción por defecto)

8

por qué se requiere constructor por defecto (explícitamente) en una clase padre si tiene un constructor argumentada

yo diría que esta afirmación no siempre es correcta. Como idealmente no se requiere.

La regla es: Si está proporcionando explícitamente un constructer con argumento editado, entonces el constructor predeterminado (no argumentado) no está disponible para la clase.

For Example : 
class A {  
    A(int i){  
    } 
} 

class B extends A { 
} 

Así que cuando se escribe

B obj_b = new B(); 

En realidad, llama al constructor implícito proporcionado por java a B, lo que llama más la super(), que debería ser idealmente A(). Pero como ha proporcionado el constructor argument-ed a A, el constructor predeterminado i: e A() no está disponible para B().

Esa es la razón por la que necesita que A() se declare específicamente para que B() llame a super().

0

Supongo que es porque cuando tienes una lista de parámetros vacía la supervariable no se puede crear una instancia. Con la lista de parámetros vacía me refiero al súper implícito() que el compilador podría agregar si la superclase tuviera un constructor no paramétrico.

Por ejemplo si escribe:

int a; 
System.out.print(a); 

obtendrá un error con lo que creo que es el mismo error lógico.

0

Cuando tenemos el constructor de parámetros. estamos explícitamente atados al consumidor por diseño. él no puede crear el objeto de esa clase sin parámetro. en algún momento debemos forzar al usuario a proporcionar valor. objeto debe crearse solo proporcionando el parámetro (valor predeterminado).

class Asset 
{ 
    private int id; 
    public Asset(int id) 
    { 
     this.id = id; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     /* Gives Error - User can not create object. 
     * Design bound 
     */ 
     Asset asset1 = new Asset();/* Error */ 
    } 
} 

Even child class no puede crear. por lo tanto, es un comportamiento de buen diseño.

4
Why default constructor is required(explicitly) in a parent class if it 
has an argumented constructor 

¡No necesariamente!

En su clase B

class B extends A { 
} 

usted no ha proporcionado ninguna constructor de la clase B por lo que se coloca un constructor por defecto. Ahora es una regla que cada constructor debe llamar a uno de sus constructores de clase superior.En su caso, el constructor predeterminado en la Clase B intentará llamar al constructor predeterminado en la clase A (es padre) pero como no tiene un constructor predeterminado en la Clase A (ya que ha proporcionado explícitamente un constructor con argumentos en la clase A, lo hará no tiene un constructor predeterminado en la Clase A) obtendrá un error.

Lo que posiblemente podría hacer es

O no proporcionan argumentos del constructor de la clase A.

A() 
{ 
    //no arg default constructor in Class A 
} 

O

explícitamente escribir sin argumentos del constructor en B y llame a su estupenda con algunos argumentos int por defecto.

B() 
{ 
    super(defaultIntValue); 
} 

El fondo es que para que se cree un objeto completamente constructores de cada padre en la jerarquía de herencia deben ser llamados. A cuáles llamar es realmente su elección de diseño. Pero en caso de que no proporcione explícitamente ningún java, pondrá la llamada de constructor predeterminada super() como primera línea de cada uno de los constructores de su clase secundaria y, si no tiene eso en la superclase, obtendrá un error.

5

Cada constructor de subclase llama al constructor predeterminado de la superclase, si el constructor de la subclase no llama explícitamente a otro constructor de la superclase. Por lo tanto, si su constructor de subclase llama explícitamente a un constructor de superclase que proporcionó (con argumentos), entonces no hay necesidad de ningún constructor de argumentos en la superclase. Por lo tanto, la siguiente compilará:

class B extends A{ 
    B(int m){ 
     super(m); 
    } 
} 

pero el siguiente no se compilará, a menos que proporcione explícitamente ningún constructor args en la superclase:

class B extends A{ 
    int i; 
    B(int m){ 
     i=m; 
    } 
} 
1

Hay algunas cosas que deben observarse cuando usando constructores y cómo deberías declararlos en tu clase base y súper clase. Esto puede ser un poco confuso únicamente porque puede haber muchas posibilidades de disponibilidad o existencia de constructores en la super clase o clase base. Voy a tratar de profundizar en todas las posibilidades:

  • Si define explícitamente constructores en cualquier clase (/ superclase de la clase base), el compilador Java no creará ningún constructor para que en esa clase respectiva.

  • Si no define explícitamente los constructores en cualquier clase (clase base/superclase), el compilador Java creará un constructor sin argumentos para usted en esa clase respectiva.

  • Si su clase es una clase base que hereda de una superclase y no define explícitamente constructores en esa clase base, no solo se creará un constructor sin argumentos para usted (como el punto anterior) por el compilador, pero también llamará implícitamente al constructor sin argumentos de la superclase.

    class A 
    { 
        A() 
    { 
        super(); 
    } 
    } 
    
  • Ahora bien, si no se introduce explícitamente super(), (o super (parámetros)), el compilador pondrá en el super() para que en su código.
  • Si el compilador llama a super() (explícita o implícitamente), el compilador esperará que su superclase tenga un constructor sin parámetros. Si no encuentra ningún constructor en su superclase sin parámetros, le dará un error de compilación.

  • Similar si se llama super (parámetros), el compilador esperará que su superclase tenga un constructor con parámetros (el número y tipo de parámetros deben coincidir). Si no encuentra dicho constructor en su superclase, le dará un error de compilación. (Super (parámetros) nunca pueden ser llamados implícitamente por el compilador. Hay que poner de forma explícita en el código si se requiere.)

Podemos resumir algunas cosas de las reglas anteriores

  • Si su superclase solo tiene un constructor con parámetros y no tiene un constructor sin argumentos, debe tener una declaración super (parámetros) explícita en su constructor. Esto se debe a que si no haces eso, una sentencia super() se incluirá implícitamente en tu código y, dado que tu superclase no tiene un constructor sin argumentos, mostrará un error de compilación.
  • Si su superclase tiene un constructor con parámetros y otro constructor sin argumentos, no es necesario tener una declaración super (parámetros) explícita en su constructor. Esto se debe a que el compilador colocará implícitamente una sentencia super() en tu código y, dado que tu superclase tiene un constructor sin argumentos, funcionará bien.
  • Si su superclase solo tiene un constructor sin argumentos, puede consultar el punto anterior ya que es lo mismo.

Otra cosa que debe tenerse en cuenta es si su superclase tiene un constructor privado, que creará un error cuando compile su subclase. Esto se debe a que si no escribe un constructor en su subclase, llamará al constructor de la superclase y el superinicio implícito intentará buscar un constructor sin argumentos en la superclase, pero no encontrará uno.

Cuestiones relacionadas