Java implementa los cuatro principios clave de la programación orientada a objetos (OOP): encapsulación, herencia, polimorfismo y abstracción.
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; } }
extends. Esto favorece la reutilización del código.public class Animal {} public class Dog extends Animal {}
Animal animal = new Dog(); animal.makeSound(); // llamará a la implementación en Dog
public interface Drawable { void draw(); }
¿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"
Historia
En un proyecto para un banco, un desarrollador hacía todos los campos
publicy 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 camposprivatey métodos de acceso.
Historia
Uno de los nuevos empleados intentó sobrescribir un método
privatede 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.