1. Encapsulación Estricta
    1. Encapsulación se refiere a la combinación de campos y métodos juntos en una clase de tal manera que los métodos trabajan sobre los datos, en oposición a los usuarios que acceden directamente a los campos
    2. Encapsulación estricta se refiere a la utilización de la encapsulación en todos los campos de una clase, y sólo facilitar el acceso a los campos a través de métodos
    3. Con encapsulación estricta, los campos de un objeto no pueden ser modificados o accedidos directamente, sólo a través de métodos
    4. Para implementar encapsulación estricta, los campos de una clase privada deben proveer métodos públicos de acceso ("getter") y de modificación ("setter")
    5. Beneficios
      1. Se puede monitorear y validar todos los cambios de un campo
      2. Se puede supervisar y dar formato a todos los accesos de un campo
      3. El tipo de dato real de un campo puede ser ocultado al usuario
    6. El usuario de un objeto no tiene conocimiento de cómo el objeto almacena sus datos
    7. Si se necesita alterar un campo, los usuarios de la clase no se ven afectados por el cambio, siempre y cuando no se modifique la firma de los métodos
    8. Bajo Acoplamiento
      1. El acoplamiento es el grado en que un objeto depende de otro objeto de lograr su objetivo
      2. Si los objetos están estrechamente acoplados, cambiar el código en una clase tiene un efecto importante sobre las clases dependientes y se requerirá cambios de código para varias clases
      3. El código cambiante en una clase tiene un efecto mínimo en sus clases dependientes
      4. Aumenta la reutilización de las clases
    9. Alta Cohesión
      1. Cohesión se refiere a cómo se vinculan las tareas específicas de un objeto
      2. Alta cohesión es cuando un objeto realiza un conjunto de tareas que están estrechamente relacionadas
      3. Bajaa cohesión es cuando un objeto realiza múltiples tareas que no están relacionadas entre sí
      4. La baja cohesión crea código que es difícil de mantener y reutilizar
      5. Las clases que implementan la alta cohesión, son más reutilizables y más fácil de probar y entender
  2. Relaciones de Diseño
    1. Relación "es un"
      1. Es una sencilla comprobación para verificar que se está utilizando la herencia correctamente
      2. En concreto, se debe ser capaz de afirmar que un objeto hijo "es un" objeto padre
      3. Topic
      4. Topic
    2. Relación "tiene un"
      1. Es una sencilla comprobación para verificar que se está utilizando adecuadamente la composición
      2. Composición refiere a una clase que contiene una referencia a otra clase
      3. Si un objeto "tiene un" atributo o propiedad específica, el atributo o propiedad es un buen candidato para crear un campo dentro de la clase del objeto
      4. Topic
    3. Beneficios
      1. El código resultante es más lógico
      2. El código es más fácil de entender
      3. Las clases son más fáciles de reutilizar en otras relaciones y aplicaciones
      4. El código es más fácil de mantener, especialmente si cambian las necesidades y requerimientos del programa
  3. Modificadores y Herencia
    1. Modificadores de Acceso
      1. public
        1. Un campo, método o constructor público de una clase es accesible a cualquier otra clase
      2. private
        1. Un campo, método o constructor privado sólo es accesible desde dentro de la clase que se declara
      3. protected
        1. Un campo, método o constructor protegido es accesible desde otras clases del mismo paquete o desde sus subclases (clases hijas)
      4. default
        1. Un campo, método o constructor sin modificador es accesible desde otras clases del mismo paquete
    2. Modificador abstract
      1. Una clase abstracta no puede ser instanciada
      2. Un método abstracto debe ser sobrescrito
      3. Una clase que contiene un método abstracto también debe declararse abstracta
      4. Una clase hija debe sobrescribir los métodos abstractos de su clase padre o la clase hija también debe ser abstracta
      5. Los modificadores de acceso en la clase hija deben ser al menos tan accesible como los modificadores de acceso de los méódos abstractos de la clase padre
      6. Un método abstracto no puede ser privado porque no seria visible en su clase hija y por lo tanto no puede ser sobrescrito
      7. Los constructores no puedes ser abstractos ya que estos no se sobreescriben
    3. Modificador final
      1. Se aplica a las variables locales, campos, métodos o clases
      2. Una variable o campo final no se puede cambiar una vez que se asigna. Estos se conocen como constantes
      3. Un método final no puede ser sobrescrito
      4. Una clase final no puede tener subclases
      5. Convención
        1. Los nombres de las variables deben estar en mayúsculas
        2. Si el nombre de la variable es una palabra compuesta, se utiliza el guión bajo (_) para separar las palabras
        3. final String COMPANY_NAME = "Sun";
  4. Polimorfismo
    1. Se refiere a cómo un objeto en Java puede adoptar "muchas formas"
    2. Una clase hija puede adoptar la forma de su clase padre
    3. Una clase puede adoptar la forma de sus interfaces implementadas
    4. Métodos Virtuales
      1. Todos los métodos en Java son métodos virtuales
      2. Si un método se sobrescribre, el método se reemplaza en tiempo de ejecución
      3. El compilador ve el método de la clase padre en tiempo de compilación
    5. Referencias polimórficas a menudo necesitan ser moldeadas a su tipo de clase adecuada
    6. Topic
    7. Operador instanceof
      1. Es un operador booleano que se utiliza para comparar una referencia a un tipo de clase
      2. Si la referencia es del tipo de clase dada, entonces el resultado es verdadero, de lo contrario, es falso
      3. Sintaxis
        1. reference instanceof ClassName
    8. Uso
      1. Un uso son los métodos con parámetros polimórficos
      2. Si el parámetro de un método es un tipo de clase, el argumento puede ser cualquier clase hija
      3. Topic
    9. Colección Heterogénea
      1. Es una colección de objetos que no son del mismo tipo de dato, pero que tienen una clase padre común
      2. Topic