¿Por qué los constructores no pueden ser heredados en Java?

Soy un principiante en el lenguaje de progtwigción java, recientemente he estudiado que los constructores no pueden ser heredados en java. ¿Puede alguien explicar por qué ?

Ya leí este enlace de C ++

En palabras simples, un constructor no se puede heredar, ya que en las subclases tiene un nombre diferente (el nombre de la subclase).

 class A { A(); } class B extends A{ B(); } 

Puedes hacer solo:

 B b = new B(); // and not new A() 

Los métodos, en cambio, se heredan con “el mismo nombre” y se pueden usar.

En cuanto a la razón: no tendría mucho sentido heredar un constructor, ya que el constructor de clase A significa crear un objeto de tipo A, y el constructor de clase B significa crear un objeto de clase B.

Sin embargo, todavía puede usar constructores de A en la implementación de B:

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

De lo que estás hablando es del nivel de lenguaje Java. Si los constructores fueran heredados, eso haría imposible hacer una clase privada. Como sabemos, la visibilidad del método no se puede degradar. Object clase de Object tiene un constructor sin argumento y cada clase extiende el Object , por lo que en el caso de la herencia del constructor cada clase tendría un constructor sin argumento. Eso rompe los principios OO.

Las cosas son diferentes en el nivel de bytecode. Cuando se crea el objeto, se llaman dos operadores:

  1. nuevo : asigna memoria para el objeto
  2. invokespecial – llama al constructor en la pieza de memoria recién asignada

Podemos modificar bytecode para que la memoria se asigne a la clase Child y se llame al constructor desde la clase Parent. En este caso, podemos decir que los constructores son heredados. Un aviso si no desactivamos la verificación del código de bytes, JVM arrojará una excepción al cargar la clase. Podemos hacer esto agregando el argumento -noverify .

Conclusión:

  1. Los constructores no se heredan en el nivel del idioma debido a los principios OO
  2. Los constructores se heredan en el nivel bytecode

Motivo mencionado en documentos de Herencia

Una subclase hereda todos los miembros (campos, métodos y clases anidadas) de su superclase. Los constructores no son miembros, por lo que no son heredados por subclases, pero el constructor de la superclase puede invocarse desde la subclase.

Puede consultar los documentos de Proporcionar constructores para sus clases

  • Un constructor solo puede ser llamado con new . No puede ser llamado como un método.
  • El nombre del constructor es idéntico al nombre de la clase.

Entonces, la herencia prácticamente no es posible como tal. Sin embargo, en una construcción uno podría llamar a otros constructores.

  • En la misma clase usando this(...) ;
  • De la clase extendida que usa super(...) ;

Ejemplo

 class A { A() { } // Constructor A(int a) { } // Constructor A(boolean c) { } // Constructor } class B extends A { B() { this(3, 7); } B(int a) { super(); } B(String b) { super(7); } B(int a, int c) { // Calls super() implicitly } } A a = new B(8): 

Desgraciadamente, no hay posibilidad de usar el constructor de A para un booleano:

 B b = new B(true): // ERROR 

Los diseños del lenguaje podrían haber implementado algo como:

Genere para cada constructor público en la clase base, un constructor con la misma firma si dicho constructor no está definido. Llame super con los mismos parámetros. Llame a this() si hay un constructor predeterminado.

Eso parece un poco hinchado el código. Y no es simplemente un puntero en una tabla de método virtual, por la cual funciona la herencia / anulación de método.

Los constructores no son miembros de las clases y solo los miembros son heredados. No puedes heredar un constructor. Es decir, no puede crear una instancia de una subclase usando un constructor de una de sus superclases.

Respuesta simple que observé, Usted no puede invocar o usar constructores de la clase padre directamente en la clase hija, pero los métodos de la clase padre los puede usar directamente en la clase hija.

En caso de que tenga un método en la clase infantil con el mismo nombre que en la clase principal en ese momento, solo necesita usar la palabra clave “super” para invocar el método de clase principal para resolver la ambigüedad de la llamada.

“Para invocar” el constructor de la clase padre en la clase secundaria, siempre necesita la palabra clave “super”. Por lo tanto, los constructores de clase padre “no están disponibles de forma directa”, como los métodos de clase primaria en la clase infantil, por lo que podemos decir que los constructores no se pueden heredar.

Solo los campos, métodos y clases anidadas son el nombre de cualquier clase, no constructores. Una subclase hereda todos los miembros (campos, métodos y clases anidadas) de su superclase. Los constructores no son miembros, por lo que no son heredados por subclases, pero el constructor de la superclase puede invocarse desde la subclase.

No, los constructores no se heredarán en la subclase, aunque es un miembro no estático, no se heredará en la subclase porque los constructores no se cargarán dentro del objeto, sino que se usará para crear el objeto. Los constructores son como un inicializador no estático

Las limitaciones sintácticas a menudo se pueden eludir si hay alguna razón para una característica de una manera conceptual. Con esto, creo, la verdadera razón para no apoyar la herencia del constructor no se debe a las limitaciones sintácticas sino a la semántica.

Conceptualmente, la herencia proporciona un mecanismo para adquirir (o heredar) un comportamiento y muy probablemente sin escribir ningún fragmento de código, ya que su propósito es proporcionar la reutilización del código. Para una clase secundaria, no es necesario heredar el comportamiento de inicialización de su clase principal. Después de todo, un comportamiento heredado encuentra su mejor uso cuando un llamador externo puede usarlo sin saber quién (en la cadena matriz) realmente lo ha implementado. Como puede ver, una persona que llama casi no tiene ningún negocio sabiendo cómo se inicializa una clase principal a través de su clase secundaria, no hay una razón discernible para apoyar la herencia de un constructor (clase principal).

no puedes heredar constructores pero puedes heredar el valor inicializado en constructor como

 class test1 { int a,b; test1(){ a = 100; b = 20; } } class test2 extends test1 { test2(){ // do something } } class test { public static void main(String[] args) { test2 t = new test2(); int a = ta; int b = tb; System.out.println(a+b); } }