2012-06-16 10 views
5

El texto en el libro que estoy leyendo estados en resumenconstructores overiding sección del libro de texto no tener sentido

"Técnicamente, los constructores no pueden ser alterada temporalmente debido a que tienen el mismo nombre que la clase actual. Los nuevos constructores se crean vez . de ser heredada este sistema funciona bien; ... "

La parte que no entiendo es cuando dicen esto:

" cuando constuc de su clase Para los métodos que se llaman, también se llaman los métodos de construcción con la misma firma para todas sus superclases. Por lo tanto, la inicialización puede suceder para todas las partes de una clase que herede "

Lo que no entiendo es la misma sección de firma ... Me llega como si todos los constructores debieran tener la misma firma , y luego cuando inicialice un objeto de clase hijo, todas sus superclases se llamarán automáticamente en lugar de tener que llamar a super (arg1, arg2) para cada subclase ... ¿Esto es lo que están diciendo?

+0

¿qué libro de texto? – UmNyobe

+0

Me quedé con Sams Teach Yourself Java 2 en 21 días por ahora. Se pondrá al día con las nuevas características de Java más tarde. ¿Pero es esto lo que están diciendo? –

+0

Bueno, tiene razón para confundirse, ya que no es cierto ... – UmNyobe

Respuesta

2

cuando son llamados métodos Constuctor de su clase, también se llaman los métodos constructores con la misma firma para todas sus superclases. Por lo tanto, la inicialización puede ocurrir para todas las partes de una clase que herede

Esto es incorrecto. Primero, una nota sobre terminología: los constructores no son métodos, por lo que el término "métodos de constructor" no tiene ningún sentido.

Si bien es cierto que se invoca un constructor de superclase, no necesita tener la misma firma. Si un constructor de la subclase comienza con una invocación expresión constructor de superclase como

class Student extends Person { 
    public Student(String name) { 
     super(name, Occupation.STUDENT); 
    } 
} 

el constructor de la superclase que coincida con el número de argumentos y tipos de invocada. Estás completamente libre de los argumentos que pasas a ese constructor.

Si el constructor de la subclase no comienza con una expresión de invocación de superconstructor, el compilador insertará una llamada al constructor de argumento cero accesible de la superclase, o generará un error de compilación si no existe tal constructor.

Sams Teach Yourself Java 2 en 21 días por ahora

Usted es consciente de que Java 2 es una década fuera de fecha? Cualquier libro así de viejo te enseñará cosas obsoletas, que lo mejor sería olvidarte rápidamente. ¿Por qué no usar un libro más moderno?

10

Eso no es del todo bien. constructor de su superclase sólo se le llama de forma automática si es el constructor por defecto (es decir, el constructor sin argumentos).

Si sus superclas s no tiene un constructor predeterminado, entonces debe invocar explícitamente un constructor de su elección con super(args..).

Por ejemplo, esto está perfectamente bien a pesar del hecho de que el constructor BearManPig 's tiene una firma diferente que Animal:

public class Animal { 
    public Animal() { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    } 
} 

Esto se debe a que hay un defecto de Java encontró el constructor sin argumentos.

Ahora, cuando no hay un constructor por defecto, debe ser explícito acerca de cuál de ellos desea llamado. Por ejemplo, este no trabajo:

// DOESN'T COMPILE 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    // There is no default constructor, stupid Java can't figure out what to do 
    public BearManPig(String string) { 
    } 
} 

pero esto:

// does compile 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    super(string); // I've told Java what to do 
    } 
} 
+0

Hmmm Gracias a @Tim Pote, eso es lo que pensé, pero leí esta sección del texto y me confundió. –

4

Todas las clases súper no necesita tener misma firma constructora.
Cuando crea un nuevo objeto, Java no invocará ningún constructor de parámetros de superclase si no se define un constructor. Java no proporciona ningún constructor de parámetros si no define ningún otro constructor.
Si define cualquier otro constructor que debe tener para llamarlo (en primera línea) en el interior constructor de la clase hijo.
This podría ayudar.

Cuestiones relacionadas