2011-02-24 19 views
24

Lo que sé es que el compilador escribe un constructor de argumentos por defecto en el código de bytes. Pero si lo escribimos nosotros mismos, ese constructor se llama automáticamente. ¿Es este fenómeno un constructor que prevalece?¿Es posible la anulación de constructores?

Respuesta

17

Lo que describes no está anulando. Si no especifica un constructor predeterminado, el compilador creará un constructor predeterminado. Si es una subclase, llamará al el constructor padre predeterminado (super()), también inicializará todas las variables de instancia a un valor predeterminado determinado por el valor predeterminado del tipo (0 para tipos numéricos, falso para booleanos o nulo para objetos)

La anulación ocurre cuando una subclase tiene el mismo nombre, número/tipo de parámetros y el mismo tipo de devolución que un método de instancia de la superclase. En este caso, la subclase será y anulará el método de la superclase. Information on overriding here.

3

Puede tener muchos constructores siempre que tomen diferentes parámetros. Pero el compilador que pone un constructor predeterminado no se llama "sobreescritura del constructor".

+0

No puedo negar su respuesta, pero por la regla fundamental de la programación orientada a objetos, en general, cada método debe ser reemplazable, con tal de que no es declarada final. – Gopal

0

Su ejemplo no es una anulación. Las modificaciones se producen técnicamente en una subclase, pero en este ejemplo el método contructor se reemplaza en la clase original.

+0

Pero como puede observar, esa anulación es aplicable a los métodos con la misma firma digital pero diferente definición. Entonces, ¿no estamos sobrepasando al constructor? – Gopal

+2

No. El concepto primordial solo se aplica a la herencia. ¿Estás buscando a alguien que te diga que tu 'facultad' está equivocada? – Corey

3

No se puede anular el constructor. Constructor puede considerarse estático, la subclase no puede anular su superconstructor.

Por supuesto, puede llamar al método protegido en el constructor de la clase superior, y luego reemplazarlo en la subclase para cambiar el constructor de la superclase. Sin embargo, muchas personas sugieren no usar el truco, para proteger el comportamiento constructor de la clase superior. Por ejemplo, FindBugs le advertirá que un constructor llama a un método no final.

21

Los constructores no son métodos normales y no pueden "anularse". Decir que un constructor puede ser anulado implicaría que un constructor de superclase sería visible y podría llamarse para crear una instancia de una subclase. Esto no es cierto ... una subclase no tiene ningún constructor por defecto (excepto un constructor no-arg si la clase que extiende tiene uno). Tiene que declarar explícitamente cualquier otro constructor, y esos constructores pertenecen a él y no a su superclase, incluso si toman los mismos parámetros que toman los constructores de la superclase.

Las cosas que menciona sobre el valor predeterminado no arg constructors es solo un aspecto de cómo funcionan los constructores y no tiene nada que ver con la anulación.

1

Pero si lo escribimos nosotros mismos, ese constructor se llama automáticamente.

Eso no es correcto. El constructor no-args se llama si lo llamas, e independientemente de si lo has escrito o no. También se llama automáticamente si no se codifica una llamada super (...) explícita en una clase derivada.

Nada de esto constituye la anulación del constructor. No existe tal cosa en Java. There es constructor sobrecarga, es decir, proporciona diferentes conjuntos de argumentos.

11

Nunca es posible.La anulación de constructores nunca es posible en Java.

Esto es así porque,

Constructor se parece a un método, pero nombre debe ser como el nombre de la clase y no tienen valor retorno.

Anulación significa lo que hemos declarado en la superclase, que es exactamente lo que tenemos a declarar en la clase Sub se llama Anulación. Los nombres de clase Super class name y Sub son diferentes.

Si intenta escribir Súper clase Constructor de la clase Sub, entonces Sub clase tratará de que como método no constructor porque el nombre se debe no coincidir con el nombre de clase Sub. Y dará un error de compilación que los métodos no tienen valor de retorno. Entonces debemos declarar como nulo, entonces solo se compilará .


Tenga una mirada en el siguiente código:

Class One 
     { 
     .... 
     One() { // Super Class constructor 
      .... 
     } 

     One(int a) { // Super Class Constructor Overloading 
      .... 
     } 
} 

Class Two extends One 
        { 
        One() { // this is a method not constructor 
        .....  // because name should not match with Class name 
        } 

        Two() { // sub class constructor 
        .... 
        } 

        Two(int b) { // sub class constructor overloading 
        .... 
        } 
} 
0

También hay que señalar que no se puede anular el constructor de la subclase con el constructor del nombre de la superclase. La regla de OOPS dice que un constructor debe tener nombre como su nombre de clase. Si tratamos de anular el constructor de la superclase, se verá como un método desconocido sin un tipo de devolución.

0

Constructor se parece a un método, pero el nombre debe ser lo más nombre de la clase y el valor de retorno.

Anulación significa lo que hemos en la superclase, que es exactamente lo que tenemos que declarar en la clase Sub se llama Anulación. Los nombres Super class y Sub class son diferentes.

Si intenta escribir constructor de la clase Súper en la clase Sub, entonces Sub clase tratará de que como método de constructor porque no nombre no debe coincidir con el nombre de la clase Sub. Y dará un error de compilación que los métodos no tienen valor de retorno. Entonces deberíamos declararlo como vacío, entonces solo compilará.

0

primordial método en Java se utiliza para mejorar el desempeño reciente código escrito previamente.

algo de código como muestra que aquí estamos creando referencia de clase base y la creación de ejemplo phyisical de la clase derivada. en la sobrecarga de constructores es posible.

tamaño
InputStream fis=new FileInputStream("a.txt"); 
int size=fis.available(); 

devolverá el número total de bytes posibles en a.txt así

1

Debido a que un constructor no puede ser heredado en Java y el reemplazo de métodos requiere herencia. Por lo tanto, no es aplicable.

0

La anulación del constructor no es posible debido a la razón siguiente.

El nombre del constructor debe ser del mismo nombre que el de la clase. En la práctica de herencia necesita crear dos clases con diferentes nombres, por lo tanto, dos constructores deben tener diferentes nombres.Por lo tanto, la anulación de constructores no es posible y ese pensamiento ni siquiera tiene sentido.

2

No, no es posible anular un constructor. Si tratamos de hacer esto, entonces vendrá el error del compilador. Y nunca es posible en Java. Veamos el ejemplo. Le pedirá que escriba un tipo de devolución o el método. significa que tratará a ese constructor anulado como un método, no como un constructor.

package com.sample.test; 

class Animal{ 

    public static void showMessage() 
    { 
     System.out.println("we are in Animal class"); 
    } 
} 

class Dog extends Animal{ 

    public void DogShow() 
    { 
     System.out.println("we are in Dog show class"); 
    } 

    public static void showMessage() 
    { 
     System.out.println("we are in overriddn method of dog class"); 
    } 
} 

public class AnimalTest { 

    public static void main(String [] args) 
    { 
     Animal animal = new Animal(); 
     animal.showMessage(); 

     Dog dog = new Dog(); 
     dog.DogShow(); 

     Animal animal2 = new Dog(); 
     animal2.showMessage(); 
    } 

} 
+0

resultado: estamos en la clase Animal estamos en la clase de exposición canina estamos en la clase de Animal – hitesh141