JavaRush /Blog Java /Random-ES /Diferencias entre constructores y métodos ordinarios.
fog
Nivel 18

Diferencias entre constructores y métodos ordinarios.

Publicado en el grupo Random-ES
Un constructor es un método especial cuyo objetivo es establecer inicialmente los valores de los campos de un objeto. A primera vista, los constructores de objetos no difieren mucho de los métodos de objetos ordinarios. Y, de hecho, dentro del constructor podemos hacer todo lo que podemos hacer en los métodos de objetos normales: enviar texto a la consola, acceder a todos los campos y métodos del nuevo objeto, lanzar excepciones, etc. Al igual que los métodos normales, los constructores pueden tener argumentos. Al igual que los métodos sobrecargados, puede haber varios constructores con firmas diferentes. Al igual que los métodos genéricos, los constructores pueden parametrizarse mediante variables de tipo. Incluso si miramos el código de bytes generado por el compilador, en el lugar donde debería haber una llamada al constructor, encontraremos una llamada a algún método cuyo nombre no es diferente de la llamada a otros métodos <init>de el objeto. Y habiendo encontrado el código de bytes de este método, encontraremos que contiene el resultado de compilar nuestro constructor. Parece que no hay muchas diferencias con los métodos convencionales, pero las existen, y bastante significativas. Primero, averigüémoslo, ¿por qué realmente necesitamos constructores? Para almacenar y procesar cualquier dato, ya sean tipos primitivos, matrices u objetos, necesitamos una cierta cantidad de memoria. Pueden ser registros del procesador, espacio de pila o una parte de espacio asignada en la sección de datos del proceso, o en una parte de la memoria asignada dinámicamente (montón). En muchos lenguajes de programación, para fines de aceleración, cuando un programa solicita una nueva porción de memoria, la memoria se le dio al programa sin borrarse y podría contener datos arbitrarios que se almacenaron anteriormente en esta celda de memoria. Preparar y escribir los valores necesarios en dicha parte de la memoria para que al final hubiera alguna estructura de datos significativa recayó completamente sobre los hombros del programador. Naturalmente, los programadores querían hacerles la vida más fácil y escribieron rutinas para inicializar (es decir, establecer valores iniciales) para estructuras de datos utilizadas con frecuencia. Estas rutinas se utilizaban casi constantemente, por lo que los creadores del lenguaje Java decidieron hacer que dichas rutinas de inicialización fueran obligatorias al crear objetos y las llamaron constructores . Cuando se crea un nuevo objeto en Java, sucede lo siguiente: primero, el administrador de memoria de Java asigna la cantidad de memoria necesaria para acomodar el objeto. En este caso, no solo se tienen en cuenta los campos declarados directamente en la clase del objeto creado, sino también los campos declarados en todos los antepasados ​​de esta clase. Además, este volumen incluye espacio para colocar estructuras que son utilizadas por la máquina Java para necesidades internas. Todos los campos de dicho "espacio en blanco" se configuran automáticamente con los valores predeterminados: nullpara tipos de referencia, 0para números y falseparaboolean. Después de esto, se llama automáticamente al constructor de la clase, cuya tarea es establecer los valores iniciales de los campos del objeto. Mientras que en un método normal la primera declaración puede ser cualquier cosa, el constructor tiene mucha menos libertad. La primera declaración de un constructor debe ser una llamada explícita a otro constructor de la misma clase o una llamada explícita o implícita a un constructor de una clase principal. Las llamadas explícitas a constructores de la misma clase se realizan utilizando una palabra clave thisseguida de un conjunto de argumentos entre paréntesis. Llamar explícitamente al constructor de una clase principal se realiza exactamente de la misma manera, pero se usa la palabra clave super. En los argumentos de una llamada explícita al constructor de la misma clase o de la clase principal, no se puede acceder a los campos y métodos del objeto, así como utilizar las palabras clave thisy super, ya que una llamada explícita al constructor introduce un contexto estático. Para llamar implícitamente al constructor de una clase padre, no es necesario escribir nada, pero se llama implícitamente al constructor predeterminado, que debe existir y ser visible para la clase actual. Al mismo tiempo, debe tenerse en cuenta que si la cadena de llamada de los constructores principales se interrumpe antes de que el constructor de clase Objectubicado en la parte superior de la cadena complete con éxito su trabajo, entonces el objeto no será finalizable, es decir, el método. finalize()de tal objeto nunca será llamado. Una vez que se completa el constructor de la clase principal, el control se transfiere implícitamente a los bloques inicializadores de instancia y a los inicializadores de campos de instancia de la clase actual. Los inicializadores se ejecutan en el orden en que aparecen en el texto del programa. Sólo después de que los inicializadores completen su trabajo se transfiere el control al resto del constructor. El resto de características de los constructores se relacionan con el modelo de memoria Java. Si una clase, o uno de sus ancestros, anula el método finalize(), entonces la finalización del constructor ocurrirá antes ( sucede-antes ) de que se ejecute el método finalize(). Si algún hilo vio una referencia a un objeto después de que se completó el constructor, entonces se garantiza que este hilo verá los campos finaldel objeto correctamente inicializados, cuya inicialización ocurrió antes de que se completara el constructor.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION