Objetos y Clases
Como en otras áreas de la vida humana, no tiene sentido reinventar o reconstruir todo a partir de los elementos básicos. Hay puertas y ventanas estándares para construir casas. Los neumáticos la misma cosa y son reusables en cualquier auto.
En software se quiere hacer lo mismo. Construir soluciones a problemas bien definidos y luego reusar estas componentes o clases.
Al usuario de algo empaquetado no le debería interesar ni requerir la información sobre cómo algo fue hecho, sólo le interesan los aspectos de uso externo. Es el caso de componentes electrónica, donde se usa la hoja de datos para el diseño sin saber los detalles internos (cuántos trasistores usó, en qué configuración,...)
Las clases intentan ser el empaquetado básico descrito.

Herencia: Se refiere a la clase construida a partir de otra. Esto tiene sentido cuando ambas clases cumplen la relación "es-un". Por ejemplo un perro es un mamífero. Luego si tenemos una clase mamífero, podremos construir la clase perro a partir de la otra y aprovechar todo lo ya hecho en mamífero. Si tengo la clase ComponenteBasica, luego puedo definir la clase Resistencia como sub-clase o clase derivada de ComponenteBasica.

Hay tres tipos de relaciones entre clases:
  1. Dependencia corresponde a relación "usa-un" Eje.: Un amplificador usa un parlante para emitir el sonido. Un Computador usa la red para enviar sus datos.
  2. Agregación corresponde a la relación "tiene-un"  Eje.:  Un circuito RC tiene un condensador.
  3. Herencia corresponde a la relación "es-un" Eje.: un condensador es una ComponenteBasica. Un Auto es un medio de transporte. Un círculo es una forma geométrica.
Estas dependencias reflejan el tipo de relación o asociación de las clases que dan forma a una solución.

Estudio de ejemplos: CalendarTest.java     Employee.java  y  EmployeeTest.java

Explicar:
  1. Estructura para definir una clase: constructor, métodos, datos
  2. Definiciones:
    Un método se dice que es un mutador si su invocación permite cambiar el estado del objeto (cambia alguno de sus atributos -miembros dato)
    Un método se dice "accesor" si su invocación sólo permite acceder a un objeto pero no lo modifica.
  3. this.
  4. Calificadores de acceso o visibilidad:
    1. public: El acceso es abierto para cualquier código que tiene acceso a la clase. Aquel que tiene acceso al archivo donde se encuentra.
    2. protected: miembro visible a cualquier clase derivada o del mismo paquete.
    3. package: visible al paquete . Es el valor por defecto si lo omitimos.
    4. private: miembros accesibles sólo a miembros de la misma clase.
  5. Campos estáticos: Corresponden a datos de los cuales hay sólo uno para toda la clase (no uno por objeto). Almacena el estado de una clase y no de cada objeto en particular.
  6. Métodos estáticos: también usan el calificador static y sólo pueden manipular datos estáticos. Se invocan anteponiendo el nombre de la clase, pueden ser invocados desde una instancia pero no es recomendable. ver StaticTest.java
  7. Invocación de métodos: Todas las invocaciones en Java son por valor (no por referencia). Los tipos primitivos copian su valor en el parámetro, luego el parámetro actual (aquel usado en el llamdo) nunca es modificado. Los nombre de objetos son referencias a éstos, luego cuando tenemos un objeto como parámetro, el objeto referenciado sí puede ser modificado. Ver ParamTest.java.
  8. Sobrecarga: Se refiere a que un método puede poseer varias formas diferenciándose en sus argumentos. En Java un método queda entonces definido en forma única al considerar su nombre más el conjunto de parámetros.
  9. Inicialización de miembros dato de la clase: Se puede hacer en el constructor o en su definición. Primero se ejecuta la definición y luego lo del constructor.
  10. Llamado entre constructores. Para ello se puede usar this(/* parámetros del constructor a invocar*/); Ver ConstructorTest.java
  11. Packages: Son colecciones de clases. Son buenos para separar los módulos y proyectos. Su principal razón es garantizar unicidad de los nombres. Para poner una clase en un paquete se debe poner el nombre del paquete antes de la definición de la clase:
    package cl.utfsm.elo.elo330;
    public class Employee
    {
     ...
    }
    ver: PackageTest.java
  12. Documentación:
    1. Para la clase de inmediatamente antes de la clase  y ser encerrado entre /**  y */
    2. Para los métodos: usar los rótulos
      1. @param variable descripción
      2. @return descripción
      3. @throws class descripción
    1. Para los datos públicos: /**   ...*/
    2. Comentarios Generales:
      1. @author nombre
      2. @version texto
      3. @since texto
      4. @see link
        En este caso link puede ser: package.class#característica rotulo
        como en @see cl.utfsm.elo.Employee#raiseSalary(double)
    3. Se pueden usar todo tipo de rótulos html incrustados.
    4. ¿Cómo generar la documentación?: javadoc -d docDirectory nameOfPackage
      Para un archivo en el paquete por defecto: javadoc -d docDirectory *.java
  13. La ruta para la búsqueda de todas las clases: CLASSPATH El compilador y el interprete java buscan los archivos en el directorio actual. Si el proyecto está compuesto por varias clases en diferentes directorios, javac y java buscan las clases en los directorios indicados en la variable de ambiente CLASSPATH. En Linux ELO ésta se configura con
    export CLASSPATH=/home/user/classdir1:/home/user/classdir2:.
    El Windows se debe fijar también esta variable de ambiente.