1. La programación Orientada a objetos se define como un paradigma de la programación, una manera de programar específica, donde se organiza el código en unidades denominadas clases, de las cuales se crean objetos que se relacionan entre sí para conseguir los objetivos de las aplicaciones.
    1. Abstracción
      1. La abstracción consiste en seleccionar datos de un conjunto más grande para mostrar solo los detalles relevantes del objeto.
        1. Ayuda a reducir la complejidad y el esfuerzo de programación.
          1. En Java, la abstracción se logra usando clases e interfaces abstractas. Es uno de los conceptos más importantes de POO.
          2. Ejemplo: Un ejemplo sencillo para comprender este concepto seria la abstracción de un Automóvil. Acá vamos a sacar de esta entidad sus características por ejemplo: color, año de fabricación, modelo, etc. Y ahora sacamos sus métodos o funciones típicas de esta entidad como por ejemplo: frenar, encender, etc. A esto se le llama abstracción.
    2. Herencia
      1. La herencia es un pilar importante de POO
        1. Es el mecanismo en Java por el cual una clase permite heredar las características (atributos y métodos) de otra clase.
          1. En el lenguaje de Java, una clase que se hereda se denomina superclase. La clase que hereda se llama subclase.
          2. Por lo tanto, una subclase es una versión especializada de una superclase. Hereda todas las variables y métodos definidos por la superclase y agrega sus propios elementos únicos.
          3. Ventajas de la Herencia: Reutilización del código- Mantenimiento de aplicaciones existentes
    3. Encapsulamiento
      1. Es por ello que el encapsulamiento consiste en permitir la visibilidad de atributos y/o métodos, en una clase determinada, teniendo así tres niveles: privados, protegidos y públicos.
        1. Privados (private) que se utilizaran solo en esa clase
          1. Protegidos (protected) que se utilizaran por todas los métodos, clases y /o atributos mientras se encuentre en el mismo package
          2. Públicos (public) que pueden ser usados por cualquier clase o método.
          3. Un ejemplo de encapsulamiento aplicado a objetos es una lavadora, donde el usuario solo se le ofrece la posibilidad de programar; el nivel de llenado del estanque, su funcionalidad (lavar, centrifugar, secar), encendido o apagado, como funciones principales. Pero para funcionamiento interno, no se requiere saber cuál es el método para cambiar de estanque lleno a vaciado y posterior centrifugado, etc. De esta manera se hace más fácil el uso de la lavadora para el usuario.
    4. Polimorfismo
      1. El polimorfismo es la habilidad de una función, método, variable u objeto de poseer varias formas distintas.
        1. un mismo identificador comparte varios significados diferentes.
          1. El propósito del polimorfismo es implementar un estilo de programación llamado envío de mensajes en el que los objetos interactúan entre ellos mediante estos mensajes, que no son más que llamadas a distintas funciones.
          2. Java tiene 4 grandes formas de polimorfismo (aunque conceptualmente, muchas más): Polimorfismo de asignación Polimorfismo puro Sobrecarga Polimorfismo de inclusión