Apuntes de Programación Orientada a Objetos (POO) en Java - PDF
Document Details
Uploaded by AngelicHorse6980
Universidad del Tolima
Tags
Summary
Estos apuntes de clase cubren los fundamentos de la programación orientada a objetos (POO) en Java. Se incluyen temas como el progreso de la abstracción, paradigmas de programación imperativo, declarativo, funcional y orientado a objetos, conceptos como clases, atributos y métodos, herencia y polimorfismo. El documento proporciona ejemplos en Java y la importancia de la POO en la actualidad.
Full Transcript
Apuntes EPOO Java Semestre II CONTENIDOS FORMATIVOS: I. La Programación Orientada a Objetos El progreso de la abstracción. Principales Paradigmas de Programación. El Paradigma Orientado a Objetos Historia de los Lenguajes Or...
Apuntes EPOO Java Semestre II CONTENIDOS FORMATIVOS: I. La Programación Orientada a Objetos El progreso de la abstracción. Principales Paradigmas de Programación. El Paradigma Orientado a Objetos Historia de los Lenguajes Orientados a Objetos Metas del Paradigma Orientado a Objetos. II. Conceptos fundamentales del Diseño y la POO Clase Atributos y métodos Interfaces Objetos Relaciones entre Clases y Objetos. III. Herencia Definición y clasificación Clases abstractas Constructores Redefinición de métodos Restricción y visibilidad protegida. IV. Polimorfismo Asignación polimórfica Tipos estáticos y dinámicos Herencia y sistemas de tipos Compatibilidad de tipos Sobrecarga. I. La Programación Orientada a Objetos I.El Progreso de la Abstracción Definición: La abstracción es el proceso de simplificar un sistema complejo destacando sólo sus elementos esenciales y ocultando los detalles innecesarios. En programación, la abstracción permite representar ideas complejas de manera manejable y modular. Evolución de la Abstracción en POO: o La abstracción ha avanzado desde simples representaciones numéricas y funciones, hacia la representación de objetos del mundo real en código. Los lenguajes orientados a objetos permiten que los desarrolladores creen modelos cercanos a la realidad mediante clases y objetos, logrando estructuras de datos más intuitivas y organizadas. Ejemplo de Abstracción en POO: Una clase Coche abstrae los atributos y comportamientos comunes de cualquier coche (como color, modelo, y el método acelerar()), sin entrar en detalles sobre el funcionamiento interno del motor. 2. Principales Paradigmas de Programación Los paradigmas de programación son enfoques o estilos de programación que influyen en cómo se estructura y se desarrolla el código. Los principales paradigmas incluyen: o Paradigma Imperativo: Basado en una secuencia de instrucciones que modifican el estado del programa. Ejemplos: C, Fortran. o Paradigma Declarativo: Se enfoca en describir lo que se desea lograr sin especificar cómo hacerlo en detalle. Ejemplo: SQL. o Paradigma Funcional: Basado en funciones matemáticas y evita el cambio de estado. Ejemplos: Haskell, Lisp. o Paradigma Lógico: Basado en la lógica y reglas. Ejemplo: Prolog. o Paradigma Orientado a Objetos (POO): Enfocado en organizar el código mediante objetos y clases que representan entidades y comportamientos del mundo real. Ejemplos: Java, C++. Estos paradigmas ofrecen diferentes formas de abordar problemas en programación, cada uno con ventajas específicas para diferentes tipos de proyectos. 3. El Paradigma Orientado a Objetos Definición: El paradigma orientado a objetos organiza el software en "objetos" que representan tanto los datos como las operaciones relacionadas. Los objetos interactúan entre sí, modelando comportamientos del mundo real o de sistemas complejos. Principios de POO: o Encapsulamiento: Agrupa datos y métodos que operan sobre esos datos, ocultando los detalles internos. o Herencia: Permite crear nuevas clases basadas en clases existentes, promoviendo la reutilización. o Polimorfismo: Permite que los métodos se comporten de diferentes maneras según el contexto. o Abstracción: Simplifica la complejidad del sistema enfocándose en los aspectos esenciales. Ejemplo en POO: Una clase Empleado puede representar a un empleado con atributos como nombre, puesto, y salario, y métodos como calcularSalario(). Otras clases, como Gerente o Interno, podrían heredar de Empleado y tener características adicionales o diferentes. 4. Historia de los Lenguajes Orientados a Objetos Origen de la POO: La POO surgió en los años 60 y 70 como un enfoque que permitía representar sistemas complejos mediante objetos y relaciones entre ellos. Lenguajes Pioneros: o Simula (1967): Considerado el primer lenguaje orientado a objetos, desarrollado para simulaciones y modelado de sistemas complejos. o Smalltalk (1970s): Popularizó la POO y fue pionero en el concepto de “todo es un objeto”. Lenguajes Actuales: En los años 80 y 90, lenguajes como C++ y Java llevaron la POO a las aplicaciones comerciales y empresariales. Otros lenguajes, como Python, Ruby, y C#, también adoptaron POO, manteniéndose como paradigmas ampliamente aceptados. 5. Metas del Paradigma Orientado a Objetos Reusabilidad: La POO permite reutilizar código mediante clases y herencia, facilitando la ampliación y mejora del software. Modularidad: Facilita el diseño de componentes modulares e independientes, lo cual mejora la mantenibilidad y permite cambiar o actualizar partes del sistema sin afectar el todo. Mantenibilidad: Al organizar el código en objetos que encapsulan datos y comportamiento, se simplifica la localización y corrección de errores. Escalabilidad: La POO es adecuada para proyectos grandes y complejos que requieren muchas funcionalidades, ya que permite agregar nuevos objetos sin modificar la estructura del sistema. Facilita el Modelado de Problemas Complejos: Al representar elementos del mundo real en el software, se obtiene una representación más intuitiva y fácil de comprender. II. Conceptos fundamentales del Diseño y la POO 1.Clase Definición: Una clase es una plantilla o modelo que define las características (atributos) y comportamientos (métodos) comunes a todos los objetos de un tipo particular. Es como un plano que describe cómo será un objeto, sin ser el objeto en sí. Ejemplo en Java: java Copiar código public class Persona { String nombre; int edad; public void saludar() { System.out.println("Hola, mi nombre es " + nombre); } } En este ejemplo, Persona es la clase, que tiene atributos como nombre y edad y un método saludar(). 2. Atributos y Métodos Definición: o Atributos: Son las variables que definen el estado o las características de una clase. Cada objeto creado a partir de la clase puede tener valores distintos para estos atributos. o Métodos: Son las funciones o comportamientos que define una clase. Los métodos operan sobre los atributos de la clase o realizan alguna tarea específica. Ejemplo en Java: java Copiar código public class Coche { String color; int velocidad; public void acelerar() { velocidad += 10; System.out.println("Velocidad actual: " + velocidad); } } Aquí, color y velocidad son atributos de Coche, y acelerar() es un método que aumenta la velocidad. 3. Interfaces Definición: Una interfaz es una colección de métodos abstractos (sin implementación) que las clases pueden implementar. Una interfaz define un conjunto de comportamientos que una clase debe cumplir sin definir cómo se deben llevar a cabo. Ejemplo en Java: java Copiar código public interface Volador { void volar(); } public class Pajaro implements Volador { public void volar() { System.out.println("El pájaro está volando"); } } Aquí, Volador es una interfaz con el método volar(), que luego implementa la clase Pajaro. 4. Objetos Definición: Un objeto es una instancia de una clase; representa una entidad concreta en el programa con valores específicos para sus atributos y puede usar los métodos definidos en la clase. Ejemplo en Java: java Copiar código Persona persona1 = new Persona(); persona1.nombre = "Juan"; persona1.edad = 25; persona1.saludar(); En este ejemplo, persona1 es un objeto de la clase Persona con valores específicos para nombre y edad. 5. Relaciones entre Clases y Objetos Definición: Las clases y objetos pueden relacionarse de varias formas para modelar sistemas complejos: o Asociación: Una relación donde una clase usa otra sin tener propiedad sobre ella. o Agregación: Una relación débil donde una clase contiene objetos de otra clase. o Composición: Una relación fuerte donde una clase tiene objetos de otra clase y es responsable de su creación y destrucción. o Herencia: Una relación jerárquica donde una clase (subclase) hereda atributos y métodos de otra (superclase). Ejemplo de Herencia en Java: java Copiar código public class Animal { public void comer() { System.out.println("El animal está comiendo"); } } public class Perro extends Animal { public void ladrar() { System.out.println("El perro está ladrando"); } } Aquí, Perro hereda de Animal, por lo que un objeto Perro puede usar los métodos comer() y ladrar(). III. Herencia Definición: La herencia es un principio de POO que permite crear una nueva clase (subclase o clase derivada) a partir de una clase existente (superclase o clase base). La subclase hereda los atributos y métodos de la superclase y puede agregar sus propias características o modificar las existentes. Clasificación de la Herencia: o Herencia Simple: La subclase hereda de una única superclase. o Herencia Múltiple: La subclase hereda de más de una superclase. En Java, esto no es posible directamente debido a la complejidad y problemas como el diamante de herencia. Sin embargo, se puede usar interfaces para simular este comportamiento. o Herencia Jerárquica: Una superclase tiene múltiples subclases. o Herencia Multinivel: Una clase hereda de otra que, a su vez, es una subclase de otra. Ejemplo en Java: java Copiar código public class Animal { public void comer() { System.out.println("El animal está comiendo"); } } public class Perro extends Animal { public void ladrar() { System.out.println("El perro está ladrando"); } } En este ejemplo, Perro es una subclase de Animal y hereda el método comer(). 2. Clases Abstractas Definición: Una clase abstracta es una clase que no puede ser instanciada y que sirve como modelo para otras clases. Puede contener métodos abstractos (sin implementación) y métodos concretos (con implementación). Las clases que heredan de una clase abstracta deben implementar los métodos abstractos. Ejemplo en Java: java Copiar código public abstract class Animal { public abstract void sonido(); public void dormir() { System.out.println("El animal está durmiendo"); } } public class Perro extends Animal { public void sonido() { System.out.println("El perro ladra"); } } Aquí, Animal es una clase abstracta con el método sonido() sin implementar, que debe ser definido en Perro. 3. Constructores en Herencia Definición: Los constructores no se heredan, pero una subclase puede llamar al constructor de la superclase mediante super(). Esto es útil cuando la superclase tiene un constructor con parámetros o realiza alguna inicialización importante. Ejemplo en Java: java Copiar código public class Animal { String nombre; public Animal(String nombre) { this.nombre = nombre; } } public class Perro extends Animal { public Perro(String nombre) { super(nombre); // Llama al constructor de la superclase } } En este ejemplo, Perro llama al constructor de Animal usando super(nombre). 4. Redefinición de Métodos (Override) Definición: La redefinición de métodos permite que una subclase proporcione una implementación específica de un método que ya existe en su superclase. Se realiza mediante la anotación @Override en Java. Ejemplo en Java: java Copiar código public class Animal { public void hacerSonido() { System.out.println("El animal hace un sonido"); } } public class Perro extends Animal { @Override public void hacerSonido() { System.out.println("El perro ladra"); } } Aquí, el método hacerSonido() se redefine en la subclase Perro. 5. Restricción y Visibilidad Protegida (protected) Definición: La visibilidad protected permite que los atributos o métodos de una clase sean accesibles desde la misma clase, sus subclases y el mismo paquete. Sin embargo, no son accesibles desde otras clases fuera del paquete. Ejemplo en Java: java Copiar código public class Animal { protected String nombre; protected void mostrarNombre() { System.out.println("Nombre del animal: " + nombre); } } public class Perro extends Animal { public void mostrarNombrePerro() { mostrarNombre(); } } En este ejemplo, nombre y mostrarNombre() son protected, por lo que Perro puede acceder a ellos. IV. Polimorfismo Definición: El polimorfismo es un principio fundamental de la POO que permite que una misma operación o método funcione de diferentes maneras según el objeto que la invoque. Gracias al polimorfismo, el mismo método puede actuar de forma diferente en distintas clases, aumentando la flexibilidad y la extensibilidad del código. 1. Asignación Polimórfica Definición: La asignación polimórfica permite que una variable de tipo de superclase o interfaz se asigne a un objeto de cualquiera de sus subclases. Esto es posible porque una subclase puede ser tratada como una instancia de su superclase. Ejemplo en Java: java Copiar código Animal animal = new Perro(); // Asignación polimórfica animal.hacerSonido(); Aquí, animal es una variable de tipo Animal, pero se le asigna un objeto de tipo Perro. Aunque animal es de tipo Animal, ejecutará el método hacerSonido() de Perro si este está redefinido. 2. Tipos Estáticos y Dinámicos Definición: o Tipo Estático: Es el tipo de la variable en tiempo de compilación. No cambia y está determinado por la declaración de la variable. o Tipo Dinámico: Es el tipo real del objeto referenciado por la variable en tiempo de ejecución. Puede cambiar si la variable apunta a un objeto de una subclase. Ejemplo en Java: java Copiar código Animal animal = new Perro(); // Tipo estático: Animal, Tipo dinámico: Perro animal.hacerSonido(); // Se llama al método `hacerSonido()` de `Perro` Aquí, el tipo estático es Animal porque así fue declarado, pero el tipo dinámico es Perro, ya que es el tipo del objeto real asignado a animal. 3. Herencia y Sistemas de Tipos Definición: En sistemas de tipos, la herencia permite la utilización de subclases en lugar de superclases gracias a la compatibilidad de tipos. Esto significa que un objeto de una subclase puede ser tratado como un objeto de su superclase, lo cual es la base del polimorfismo. Ejemplo en Java: java Copiar código List listaAnimales = new ArrayList(); listaAnimales.add(new Perro()); // Un Perro se considera un Animal listaAnimales.add(new Gato()); // Un Gato también se considera un Animal Aquí, Perro y Gato son subclases de Animal, por lo que pueden añadirse a una lista de tipo List. 4. Compatibilidad de Tipos Definición: La compatibilidad de tipos permite que una variable de tipo superclase almacene referencias a objetos de cualquier subclase. Sin embargo, es importante tener en cuenta que no todos los métodos de las subclases serán accesibles desde la variable de superclase sin una conversión de tipo (casting). Ejemplo en Java: java Copiar código Animal animal = new Perro(); if (animal instanceof Perro) { Perro perro = (Perro) animal; // Conversión de tipo perro.ladrar(); } Aquí, animal es compatible con Perro debido a la herencia, y el casting permite acceder al método ladrar() específico de Perro. 5. Sobrecarga de Métodos Definición: La sobrecarga de métodos ocurre cuando una clase tiene varios métodos con el mismo nombre pero diferentes parámetros (tipo o número). Esto es un tipo de polimorfismo en tiempo de compilación, ya que se determina qué método se llamará según los argumentos. Ejemplo en Java: java Copiar código public class Calculadora { public int sumar(int a, int b) { return a + b; } public double sumar(double a, double b) { return a + b; } } En este caso, el método sumar está sobrecargado con dos versiones: una que acepta int y otra que acepta double. El compilador elige cuál usar en función de los argumentos. Estos conceptos de polimorfismo permiten que el código sea flexible y extensible, facilitando la reutilización y la modificación del comportamiento de los objetos de forma controlada y predecible. Evaluación pasada: IDE Entornos de programación: