Fundamentos de OOP: Clase, Objeto, Instancia, Atributos y Métodos
Este artículo es una explicación de conceptos sobre los fundamentos de la programación orientada a objetos, incluyendo clases, objetos, atributos y métodos.
En pocas palabras
OOP es un paradigma de programación que estructura el software a partir de componentes reutilizables y bien organizados: los objetos. La clase es el plano, el objeto es su realización concreta.
Descripción técnica compacta
La programación orientada a objetos (OOP) es un paradigma que modela objetos del mundo real mediante objetos de software. La diferencia fundamental entre clase y objeto es crítica:
Clase (Plano):
- Plantilla o esquema abstracto
- Define atributos (propiedades) y métodos (capacidades)
- Existe una única vez en el código
- Ejemplo: la clase
Autodefine propiedades como color y métodos comofrenar()
Objeto/Instancia (algo concreto):
- Realización concreta de una clase
- Se crea en tiempo de ejecución (operador
new) - Tiene valores específicos para sus atributos
- Ejemplo: objeto
miGolfcon color=“azul”, potencia=150CV
Conceptos clave:
- Encapsulación: Los datos y métodos se agrupan en una unidad
- Reutilización: Las clases se pueden instanciar múltiples veces
- Estructuración: Separación clara de responsabilidades
- Abstracción: Reducir la realidad compleja a propiedades relevantes
Puntos clave para evaluación
- Clase vs objeto: Plano abstracto vs instancia concreta
- Atributos: Propiedades o datos de un objeto
- Métodos: Comportamiento o capacidades de un objeto
- Instanciación: Creación de objetos a partir de clases
- Constructor: Método especial para inicializar objetos
- Encapsulación: Agrupar datos y métodos
- Relevancia práctica: Comprensión fundamental para desarrollo de software
- Aplicación: Reutilización y mantenibilidad del código
Componentes principales
- Clase: Definición con atributos y métodos
- Objeto: Instancia concreta de una clase
- Atributos: Propiedades o datos de un objeto
- Métodos: Comportamiento o funciones de un objeto
- Constructor: Método de inicialización para nuevos objetos
- Variables de instancia: Datos específicos de cada objeto
- Métodos de clase: Métodos válidos para la clase
- Getter/Setter: Métodos para acceder a atributos
Ejemplos prácticos
1. Clase simple en Java
// Clase como plano
public class Auto {
// Atributos (propiedades)
private String farbe;
private int anzahlTueren;
private int leistungInPS;
private int aktuelleGeschwindigkeit;
// Constructor para crear objetos
public Auto(String farbe, int anzahlTueren, int leistungInPS) {
this.farbe = farbe;
this.anzahlTueren = anzahlTueren;
this.leistungInPS = leistungInPS;
this.aktuelleGeschwindigkeit = 0;
}
// Métodos (comportamiento)
public void beschleunigen(int kmh) {
this.aktuelleGeschwindigkeit += kmh;
System.out.println("Auto beschleunigt auf " + this.aktuelleGeschwindigkeit + " km/h");
}
public void bremsen(int kmh) {
if (this.aktuelleGeschwindigkeit >= kmh) {
this.aktuelleGeschwindigkeit -= kmh;
System.out.println("Auto bremst auf " + this.aktuelleGeschwindigkeit + " km/h");
} else {
System.out.println("Kann nicht unter 0 km/h bremsen");
}
}
// Métodos getter para acceder a atributos
public String getFarbe() {
return farbe;
}
public int getAktuelleGeschwindigkeit() {
return aktuelleGeschwindigkeit;
}
public void anzeigen() {
System.out.println("Auto - Farbe: " + farbe +
", Türen: " + anzahlTueren +
", Leistung: " + leistungInPS + " PS" +
", Geschwindigkeit: " + aktuelleGeschwindigkeit + " km/h");
}
}
// Uso de la clase
public class Garage {
public static void main(String[] args) {
// Crear objetos (instancias)
Auto meinGolf = new Auto("blau", 5, 150);
Auto deinA3 = new Auto("schwarz", 3, 120);
Auto companyAuto = new Auto("silber", 4, 200);
// Usar los objetos
meinGolf.anzeigen();
meinGolf.beschleunigen(50);
meinGolf.beschleunigen(30);
meinGolf.bremsen(20);
System.out.println("---");
deinA3.anzeigen();
deinA3.beschleunigen(80);
System.out.println("---");
companyAuto.anzeigen();
companyAuto.beschleunigen(100);
}
}
2. Clase en Python
# Clase como plano
class Auto:
# Atributo de clase (válido para todos los autos)
anzahl_autos = 0
# Constructor
def __init__(self, farbe, anzahl_tueren, leistung_in_ps):
# Atributos de instancia (específicos de cada objeto)
self.farbe = farbe
self.anzahl_tueren = anzahl_tueren
self.leistung_in_ps = leistung_in_ps
self.aktuelle_geschwindigkeit = 0
# Incrementar atributo de clase
Auto.anzahl_autos += 1
# Métodos
def beschleunigen(self, kmh):
self.aktuelle_geschwindigkeit += kmh
print(f"Auto beschleunigt auf {self.aktuelle_geschwindigkeit} km/h")
def bremsen(self, kmh):
if self.aktuelle_geschwindigkeit >= kmh:
self.aktuelle_geschwindigkeit -= kmh
print(f"Auto bremst auf {self.aktuelle_geschwindigkeit} km/h")
else:
print("Kann nicht unter 0 km/h bremsen")
def anzeigen(self):
print(f"Auto - Farbe: {self.farbe}, Türen: {self.anzahl_tueren}, " +
f"Leistung: {self.leistung_in_ps} PS, " +
f"Geschwindigkeit: {self.aktuelle_geschwindigkeit} km/h")
# Método de clase
@classmethod
def get_anzahl_autos(cls):
return cls.anzahl_autos
# Uso de la clase
def garage_demo():
# Crear objetos (instancias)
mein_golf = Auto("blau", 5, 150)
dein_a3 = Auto("schwarz", 3, 120)
company_auto = Auto("silber", 4, 200)
# Usar los objetos
mein_golf.anzeigen()
mein_golf.beschleunigen(50)
mein_golf.beschleunigen(30)
mein_golf.bremsen(20)
print("---")
dein_a3.anzeigen()
dein_a3.beschleunigen(80)
print("---")
company_auto.anzeigen()
company_auto.beschleunigen(100)
print(f"Anzahl erstellter Autos: {Auto.get_anzahl_autos()}")
if __name__ == "__main__":
garage_demo()
3. Clase en C#
using System;
// Clase como plano
public class Auto
{
// Atributos (propiedades)
private string farbe;
private int anzahlTueren;
private int leistungInPS;
private int aktuelleGeschwindigkeit;
// Propiedad estática para todos los autos
public static int AnzahlAutos { get; private set; }
// Constructor
public Auto(string farbe, int anzahlTueren, int leistungInPS)
{
this.farbe = farbe;
this.anzahlTueren = anzahlTueren;
this.leistungInPS = leistungInPS;
this.aktuelleGeschwindigkeit = 0;
AnzahlAutos++;
}
// Métodos
public void Beschleunigen(int kmh)
{
this.aktuelleGeschwindigkeit += kmh;
Console.WriteLine($"Auto beschleunigt auf {this.aktuelleGeschwindigkeit} km/h");
}
public void Bremsen(int kmh)
{
if (this.aktuelleGeschwindigkeit >= kmh)
{
this.aktuelleGeschwindigkeit -= kmh;
Console.WriteLine($"Auto bremst auf {this.aktuelleGeschwindigkeit} km/h");
}
else
{
Console.WriteLine("Kann nicht unter 0 km/h bremsen");
}
}
// Properties para acceder a atributos
public string Farbe => farbe;
public int AktuelleGeschwindigkeit => aktuelleGeschwindigkeit;
public void Anzeigen()
{
Console.WriteLine($"Auto - Farbe: {farbe}, Türen: {anzahlTueren}, " +
$"Leistung: {leistungInPS} PS, " +
$"Geschwindigkeit: {aktuelleGeschwindigkeit} km/h");
}
}
// Uso de la clase
public class Garage
{
public static void Main(string[] args)
{
// Crear objetos (instancias)
Auto meinGolf = new Auto("blau", 5, 150);
Auto deinA3 = new Auto("schwarz", 3, 120);
Auto companyAuto = new Auto("silber", 4, 200);
// Usar los objetos
meinGolf.Anzeigen();
meinGolf.Beschleunigen(50);
meinGolf.Beschleunigen(30);
meinGolf.Bremsen(20);
Console.WriteLine("---");
deinA3.Anzeigen();
deinA3.Beschleunigen(80);
Console.WriteLine("---");
companyAuto.Anzeigen();
companyAuto.Beschleunigen(100);
Console.WriteLine($"Anzahl erstellter Autos: {Auto.AnzahlAutos}");
}
}
Conceptos en detalle
Constructores
// Constructores sobrecargados en Java
public class Auto {
private String farbe;
private int leistung;
// Constructor por defecto
public Auto() {
this.farbe = "schwarz";
this.leistung = 100;
}
// Constructor con parámetros
public Auto(String farbe, int leistung) {
this.farbe = farbe;
this.leistung = leistung;
}
// Constructor copia
public Auto(Auto other) {
this.farbe = other.farbe;
this.leistung = other.leistung;
}
}
Miembros estáticos vs miembros de instancia
public class MathUtil {
// Método estático - pertenece a la clase
public static int addiere(int a, int b) {
return a + b;
}
// Método de instancia - pertenece al objeto
private int wert;
public MathUtil(int startWert) {
this.wert = startWert;
}
public int addiereZuWert(int a) {
this.wert += a;
return this.wert;
}
}
// Uso
int ergebnis1 = MathUtil.addiere(5, 3); // Estático
MathUtil rechner = new MathUtil(10);
int ergebnis2 = rechner.addiereZuWert(5); // Instancia
Getters y setters
public class Person {
private String name;
private int alter;
// Getter
public String getName() {
return name;
}
// Setter con validación
public void setAlter(int alter) {
if (alter >= 0 && alter <= 150) {
this.alter = alter;
} else {
throw new IllegalArgumentException("Ungültiges Alter");
}
}
// Getter para valor calculado
public boolean istVolljaehrig() {
return alter >= 18;
}
}
Ventajas y desventajas
Ventajas de OOP
- Reutilización: Las clases se pueden usar múltiples veces
- Mantenimiento: La estructura clara facilita los cambios
- Comprensibilidad: Se refleja el mundo real
- Encapsulación: Los datos están protegidos y accesibles de forma controlada
- Escalabilidad: Los sistemas grandes se pueden estructurar ordenadamente
Desventajas
- Sobrecarga: Más código para tareas simples
- Curva de aprendizaje: El pensamiento orientado a objetos requiere práctica
- Rendimiento: La creación de objetos puede ser costosa
- Complejidad: Demasiadas clases pueden resultar confusas
Preguntas frecuentes en exámenes
-
¿Cuál es la diferencia entre clase y objeto? La clase es el plano, el objeto es la instancia concreta en tiempo de ejecución.
-
Explica los términos atributo y método Los atributos son propiedades o datos, los métodos son el comportamiento o funciones de un objeto.
-
¿Qué es un constructor? Método especial para inicializar nuevos objetos, se invoca al usar
new. -
¿Por qué es importante la encapsulación? Protege los datos del acceso incontrolado y permite validación.
Referencias principales
- https://de.wikipedia.org/wiki/Objektorientierte_Programmierung
- https://docs.oracle.com/javase/tutorial/java/concepts/
- https://docs.python.org/3/tutorial/classes.html
Continúa en la ruta de aprendizaje de OOP
El siguiente artículo en la ruta de aprendizaje de OOP cubre OOP Begriffe: Attribute, Nachrichten, Methodenaufruf, Persistenz & Schnittstellen - conceptos clave de OOP explicados.
Lecturas recomendadas: Programación orientada a objetos
Keine Bücher für Kategorie "objektorientierte-programmierung" gefunden.



