1. Todo es parte de un objeto: Los datos y comportamientos están unidos 2. Organización del Código: Cada objeto maneja sus propios datos 3. Reutilización: Podemos crear objetos similares fácilmente 4. Claridad: El código refleja el mundo real
La Programación Orientada a Objetos se basa en cuatro características principales:
¿Qué es?
setEdad() no debería aceptar negativosEn Java se implementa con:
public, private, protectedclass CuentaBancaria {
private double saldo; // Solo accesible dentro de la clase
public void depositar(double monto) {
if (monto > 0) {
saldo += monto;
}
}
}
¿Qué es?
En Java se implementa con:
abstract class)interface)interface Vehiculo {
void mover(); // Qué hace, no cómo lo hace
}
class Coche implements Vehiculo {
public void mover() {
// Implementación específica
}
}
¿Qué es?
En Java se implementa con:
extendsclass Animal {
void comer() {
// Implementación
}
}
class Perro extends Animal {
void ladrar() {
// Implementación específica
}
}
¿Qué es?
En Java se implementa con:
Sobrescritura (Override) - Polimorfismo de subtipo:
@OverrideSobrecarga (Overload) - Polimorfismo ad-hoc:
class Animal {
void hacerSonido() {
// Implementación base
}
}
class Perro extends Animal {
// Sobrescritura: mismo método, diferente implementación
@Override
void hacerSonido() {
System.out.println("Guau");
}
// Sobrecarga: mismo nombre, diferentes parámetros
void hacerSonido(int veces) {
for(int i = 0; i < veces; i++) {
hacerSonido();
}
}
void hacerSonido(String intensidad) {
if(intensidad.equals("fuerte")) {
System.out.println("GUAU!");
} else {
System.out.println("guau...");
}
}
}
Clase:
Objeto:
// Definición de una clase
class Coche {
String marca;
String modelo;
void arrancar() {
System.out.println("El coche arranca");
}
}
// Creación de objetos
Coche coche1 = new Coche(); // Primer objeto
coche1.marca = "Toyota";
coche1.modelo = "Corolla";
Coche coche2 = new Coche(); // Segundo objeto
coche2.marca = "Honda";
coche2.modelo = "Civic";
Python: Tipado dinámico, todo es un objeto Java: Tipado estático, diferencia entre primitivos y objetos
Primitivos en Java:
int numero = 42; // Similar a Python pero debe declararse
boolean verdad = true; // En Python es True
char caracter = 'a'; // En Python no existe char
Primitivos: byte, short, int, long, float, double, boolean, char
Clases Envolturas: Byte, Short, Integer, Long, Float, Double, Boolean, Character
Son útiles cuando usamos colecciones
// Primitivo
int numero = 42;
// Clase envoltura
Integer numeroObjeto = Integer.valueOf(42);
// Permite null
Integer nulo = null; // Válido
int primitivo = null; // ¡Error!
ArrayList: Lista dinámica de elementos
ArrayList<String> nombres = new ArrayList<>();
nombres.add("Ana"); // ["Ana"]
nombres.add("Ana"); // ["Ana", "Ana"] - permite duplicados
nombres.get(0); // "Ana" - acceso por índice
HashSet: Colección de elementos únicos
HashSet<String> nombres = new HashSet<>();
nombres.add("Ana"); // ["Ana"]
nombres.add("Ana"); // ["Ana"] - ignora duplicados
nombres.contains("Ana"); // true - búsqueda rápida
En Python:
for i in range(5):
print(i)
for nombre in nombres:
print(nombre)
En Java:
// Con índice
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
// For-each (como en Python)
for (String nombre : nombres) {
System.out.println(nombre);
}
While (existe en ambos):
while (condicion) {
// código
}
Do-While (exclusivo de Java):
do {
// Se ejecuta al menos una vez
} while (condicion);
String dia = "Lunes";
switch (dia) {
case "Lunes":
System.out.println("Primer día");
break;
case "Martes":
System.out.println("Segundo día");
break;
default:
System.out.println("Otro día");
}
enum DiaSemana {
LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO
}
DiaSemana hoy = DiaSemana.LUNES;
Los Strings son inmutables - cada operación crea un nuevo String:
String nombre = "Juan";
String nombreMayusculas = nombre.toUpperCase(); // Nuevo String
System.out.println(nombre); // "Juan"
System.out.println(nombreMayusculas); // "JUAN"
// Concatenación crea nuevos objetos
String completo = nombre + " Pérez"; // Nuevo String
Cada método retorna un nuevo String:
String texto = "Hola Mundo";
String mayusculas = texto.toUpperCase(); // "HOLA MUNDO"
String subcadena = texto.substring(0, 4); // "Hola"
String[] palabras = texto.split(" "); // ["Hola", "Mundo"]
boolean contiene = texto.contains("Mundo"); // true
int longitud = texto.length(); // 10
// El String original no cambia
System.out.println(texto); // "Hola Mundo"
== evalúa igualdad en referencias en memoria, no contenido== sí funciona como intuitivamente pensaríamos que funcionaString str1 = "Hola";
String str2 = "Hola";
String str3 = new String("Hola");
// NO hacer esto - comportamiento no confiable
System.out.println(str1 == str2); // ¡No comparar Strings con ==!
// Forma correcta de comparar Strings
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
Crear un sistema simple que demuestre los conceptos vistos:
// Estados posibles de un libro
enum EstadoLibro {
DISPONIBLE, PRESTADO
}
// Clase para representar un libro
class Libro {
String titulo;
String autor;
EstadoLibro estado;
Libro(String titulo, String autor) {
this.titulo = titulo;
this.autor = autor;
this.estado = EstadoLibro.DISPONIBLE;
}
}
// Clase para gestionar la biblioteca
class Biblioteca {
ArrayList<Libro> libros;
Biblioteca() {
libros = new ArrayList<>();
}
void agregarLibro(Libro libro) {
libros.add(libro);
}
void prestarLibro(Libro libro) {
libro.estado = EstadoLibro.PRESTADO;
}
}
public class Main {
public static void main(String[] args) {
// Crear una biblioteca
Biblioteca biblioteca = new Biblioteca();
// Crear algunos libros
Libro libro1 = new Libro("Don Quijote", "Cervantes");
Libro libro2 = new Libro("Cien años de soledad", "García Márquez");
// Agregar libros a la biblioteca
biblioteca.agregarLibro(libro1);
biblioteca.agregarLibro(libro2);
// Prestar un libro
biblioteca.prestarLibro(libro1);
}
}