La Programación Orientada a Objetos (POO) es un paradigma de programación que organiza el software en torno a objetos, que combinan datos (atributos) y comportamiento (métodos) en una misma entidad. Este enfoque busca modelar el mundo real de forma más natural e intuitiva.
Los cuatro pilares fundamentales de la POO son:
Una clase es una plantilla o molde que define la estructura y el comportamiento que tendrán los objetos creados a partir de ella. Define qué atributos (datos) y qué métodos (funciones) tendrán sus instancias.
class Coche {
String marca;
int velocidad;
void acelerar() {
velocidad += 10;
}
}
Un objeto es una instancia concreta de una clase. Es la entidad real en memoria que contiene valores específicos para los atributos definidos en la clase.
Coche miCoche = new Coche(); // Se crea un objeto de la clase Coche
miCoche.marca = "Toyota";
Un constructor es un método especial de una clase cuya función es definir el proceso de creación e inicialización de un objeto. Se ejecuta automáticamente en el momento en que se instancia (crea) un objeto a partir de la clase.
void).El constructor no declara la clase ni limita el número de objetos que se pueden instanciar. Su única responsabilidad es establecer el estado inicial del objeto en el momento de su creación.
class Coche {
String marca;
int velocidad;
// Constructor
Coche(String marca) {
this.marca = marca;
this.velocidad = 0;
}
}
// Al instanciar, se invoca el constructor automáticamente
Coche miCoche = new Coche("Toyota");
En el ejemplo anterior, al escribir new Coche("Toyota"), se ejecuta el constructor, que asigna "Toyota" al atributo marca y 0 al atributo velocidad.
El encapsulamiento es el mecanismo que permite controlar qué partes de un objeto son accesibles desde el exterior y cuáles están ocultas. Se implementa mediante modificadores de acceso.
Los niveles de acceso que existen en los lenguajes orientados a objetos más extendidos (como Java, C# o C++) son:
private)Los atributos y métodos marcados como privados solo son accesibles desde la propia clase donde están definidos. Ninguna otra clase, ni siquiera las subclases (clases hijas), puede acceder a ellos directamente.
class CuentaBancaria {
private double saldo; // Solo accesible dentro de CuentaBancaria
public void depositar(double cantidad) {
saldo += cantidad; // Acceso válido: estamos dentro de la misma clase
}
}
protected)Los atributos y métodos marcados como protegidos son accesibles desde:
- La propia clase donde están definidos.
- Todas las clases que heredan de ella (subclases o clases hijas).
class Animal {
protected String nombre; // Accesible en Animal y sus subclases
}
class Perro extends Animal {
void mostrarNombre() {
System.out.println(nombre); // Válido: Perro hereda de Animal
}
}
public)Los atributos y métodos marcados como públicos son accesibles desde cualquier clase, sin restricciones, independientemente del paquete o módulo en que se encuentren.
class Persona {
public String nombre; // Accesible desde cualquier parte del programa
}
En algunos lenguajes existe un nivel adicional de acceso a nivel de paquete o módulo: el atributo o método es accesible desde todas las clases del mismo paquete, pero no desde fuera. En Java, esto se obtiene simplemente no especificando ningún modificador.
Es importante destacar que no existe ningún nivel de acceso denominado "nivel cerrado" en la nomenclatura estándar de la programación orientada a objetos. Los modificadores de acceso reconocidos universalmente son private, protected y public (más el nivel de paquete en algunos lenguajes). Cualquier denominación distinta a estas no forma parte del estándar de la POO.
| Modificador | Misma clase | Subclases | Cualquier clase |
|---|---|---|---|
private |
✅ | ❌ | ❌ |
protected |
✅ | ✅ | ❌ |
public |
✅ | ✅ | ✅ |
| (paquete) | ✅ | ❌* | ❌ |
*En Java, las subclases de otro paquete no tienen acceso al nivel de paquete.
La herencia permite que una clase (subclase o clase hija) adquiera los atributos y métodos de otra clase (superclase o clase padre). Esto fomenta la reutilización de código y la creación de jerarquías.
class Vehiculo {
int velocidad;
void moverse() {
System.out.println("El vehículo se mueve");
}
}
class Moto extends Vehiculo {
int cilindrada;
// Moto hereda velocidad y moverse() de Vehiculo
}
El polimorfismo permite que objetos de distintas clases respondan de manera diferente al mismo método. Existen dos tipos principales:
class Animal {
void hacerSonido() {
System.out.println("...");
}
}
class Gato extends Animal {
@Override
void hacerSonido() {
System.out.println("Miau");
}
}
class Perro extends Animal {
@Override
void hacerSonido() {
System.out.println("Guau");
}
}
La abstracción consiste en representar solo las características relevantes de un objeto, ocultando los detalles de implementación. Se logra mediante clases abstractas e interfaces.
abstract class Figura {
abstract double calcularArea(); // Método abstracto: sin implementación
}
class Circulo extends Figura {
double radio;
@Override
double calcularArea() {
return Math.PI * radio * radio;
}
}
| Concepto | Definición resumida |
|---|---|
| Clase | Plantilla que define atributos y métodos |
| Objeto | Instancia concreta de una clase |
| Constructor | Método especial que define cómo se crea e inicializa un objeto |
private |
Acceso restringido a la propia clase |
protected |
Acceso desde la clase y sus subclases |
public |
Acceso desde cualquier clase |
| Herencia | Una clase adquiere características de otra |
| Polimorfismo | Mismo método, comportamiento distinto según el objeto |
| Abstracción | Exponer solo lo esencial, ocultar los detalles |