ProgramaciónDesarrollador Java

¿Cuáles son los principios fundamentales de OOP que se utilizan en Java y cómo se implementan en la práctica?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Java implementa los cuatro principios clave de la programación orientada a objetos (OOP): encapsulación, herencia, polimorfismo y abstracción.

  • Encapsulación permite ocultar la implementación interna de una clase y proporcionar acceso a los datos solo a través de métodos. Java utiliza modificadores de acceso (private, protected, public) y getters/setters para lograr la encapsulación.
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • Herencia permite crear una nueva clase basada en una existente usando la palabra clave extends. Esto favorece la reutilización del código.
public class Animal {} public class Dog extends Animal {}
  • Polimorfismo se manifiesta en la capacidad de una interfaz para servir a varios tipos. En Java, esto se logra a través de la sobrescritura de métodos y las interfaces.
Animal animal = new Dog(); animal.makeSound(); // llamará a la implementación en Dog
  • Abstracción se logra declarando clases abstractas e interfaces, simplificando sistemas complejos.
public interface Drawable { void draw(); }

Pregunta capciosa.

¿Qué sucede si en Java una clase hereda de una interfaz y de una clase abstracta que tienen métodos con la misma firma? ¿Qué comportamiento demostrará la clase heredada?

Respuesta: Si tanto la clase abstracta como la interfaz definen la misma firma de método, se necesita implementar este método solo una vez en la clase derivada. Sin embargo, si la clase abstracta implementó este método, entonces Java utilizará su implementación. Los métodos predeterminados de la interfaz solo se sobrescriben si es necesario.

interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() imprimiría "B"

Ejemplos de errores reales debidos a la falta de conocimiento sobre las sutilezas del tema.


Historia

En un proyecto para un banco, un desarrollador hacía todos los campos public y accedía a ellos directamente. Esto llevó a cambios incontrolados en el estado de los objetos y dificultó la búsqueda de errores. Posteriormente, todo el código tuvo que reescribirse para usar campos private y métodos de acceso.


Historia

Uno de los nuevos empleados intentó sobrescribir un método private de la clase base, pensando que esto apoyaba el polimorfismo. Pero en realidad se creaba un nuevo método en la clase derivada, y las llamadas desde la clase base invocaban la versión original, lo que llevaba a un comportamiento inesperado.


Historia

El uso de interfaces con métodos predeterminados de múltiples fuentes llevó al error "class X inherits unrelated defaults for Y() from types A and B" — el empleado no sabía que tales conflictos debían resolverse manualmente en la clase derivada.