Taller de Programación Orientada a Objetos
Taller de Programación Orientada a Objetos
Si el garbage collector es extremadamente eficiente, durante la ejecución del método main, el código llamará al método 'finalize()' de 'personas[3]', lo cual imprimiría 'Matando a: Santiago'. Luego, la llamada a `System.out.println(personas[3]);` imprimirá 'Soy Santiago', ya que el método 'finalize()' no necesariamente implica que el objeto sea inmediatamente recogido si queda pendiente una operación. Esto presenta un potencial comportamiento no determinista debido a la recolección de basura, especialmente si existen métodos u operaciones subsiguientes .
La pérdida de referencia al objeto de tipo 'Persona' puede resultar en que el objeto se convierta en elegible para la recolección de basura si no existe otra referencia en el programa que señale dicho objeto. En Java, el garbage collector identifica los objetos sin referencia y libera la memoria que ocupan para optimizar el uso de recursos del programa. Si el garbage collector es muy eficiente, y un objeto de tipo 'Persona' pierde su referencia, podría causar que el método 'finalize()' sea invocado, imprimiendo "Matando a: [nombre]" antes de eliminar el objeto del sistema .
Al activar la función específica para 'short', las impresiones para 'short' cambiarán a 'Entra a short: 2', y al activar para 'float', las impresiones para 'float' cambiarán a 'Entra a float: 5.65'. Cada tipo corresponde al método sobrecargado que maneja su tipo específico, demostrando la capacidad de Java para vincular dinámicamente la llamada al método apropiado según el tipo de dato pasado como argumento, optimizando la eficiencia y legibilidad en la ejecución .
La sobrecarga de constructores es una técnica importante en la programación orientada a objetos porque permite a los desarrolladores definir múltiples maneras de inicializar un objeto, dependiendo de los datos disponibles al momento de su creación. Esto añade flexibilidad y permite que un objeto pueda ser instanciado con diferentes conjuntos de parámetros, mejorando la legibilidad del código y facilitando el mantenimiento. Al proporcionar diferentes constructores, se puede crear un mismo objeto con distintos niveles de información o configuraciones, lo que es esencial en sistemas que requieren adaptabilidad y reutilización de código .
Para agregar un dueño al vehículo 'auto2', se debe emplear el método 'setDueno()' con un objeto de tipo 'Persona' como argumento. Por ejemplo, si se quiere asignar un dueño que ya exista en el arreglo 'personas', el código sería `auto2.setDueno(personas[3]);` Suponiendo que 'personas[3]' es el objeto deseado .
Para que 'System.out.println(auto2)' imprima tanto la placa como el dueño, se debe sobrescribir el método 'toString()' en la clase 'Vehiculo'. Este método debe concatenar la información deseada del vehículo. Por ejemplo, modificar así el método: `public String toString() { return "Placa: " + this.placa + ", Dueño: " + (this.dueno != null ? this.dueno.getNombre() : "Sin dueño"); }`. Esto permite que el método despliegue tanto la placa del vehículo como el nombre del dueño si está asignado, o una indicación de que no hay dueño .
Después de la línea `personas[1] = personas[2];`, la referencia inicial en 'personas[1]' a la 'Persona' original de la posición cero se pierde, y ahora 'personas[1]' apunta al mismo objeto que 'personas[2]'. Por lo tanto, al ejecutar `System.out.println(personas[1])`, el sistema imprimirá la cadena resultante del método 'toString()' de la clase 'Persona' correspondiente al objeto en 'personas[2]'. Si 'personas[2]' no ha sido modificado, se imprimirá "Soy Alejandro" .
La sobrecarga de métodos permite definir múltiples variaciones de un método dentro de una misma clase con diferentes parámetros, lo cual proporciona una manera conveniente de implementar un comportamiento similar para diferentes tipos de datos. Esto es útil porque reduce el código redundante y mejora la legibilidad al permitir que una acción similar se ejecute de maneras levemente diferentes, dependiendo de las entradas proporcionadas. Además, mantiene el contexto y semántica de la operación sin necesidad de inventar nombres diferentes y confusos para cada variación .
Para conocer el nombre del dueño del vehículo 'auto' en la línea 11 del método main, se utilizaría el método 'getDueno()' del objeto 'Vehiculo'. Posteriormente, se llamaría al método 'getNombre()' de la clase 'Persona' para obtener el nombre del dueño del vehículo. El código sería `auto.getDueno().getNombre()` .
El uso de un inicializador estático en Java ofrece varias ventajas: permite que el código se ejecute una vez cuando la clase se carga por primera vez en el sistema, facilitando la inicialización de variables estáticas con lógica más compleja que no puede resumirse en una sola línea. Esto es especialmente útil para configurar entornos, cargar recursos, o inicializar un atributo que depende de la ejecución de algún cálculo, favoreciendo así la consistencia y la eficiencia al evitar que la misma lógica se duplique en diferentes lugares del código .