1. Variables
    1. Representa un pedazo de la memoria asignada para el almacenamiento de datos
    2. Se inicializa cuando se le asigna un valor por primera vez
    3. Al nombre de una variable se le conoce como su identificador (los nombres de clases, métodos, interfaces y enumeraciones son también identificadores)
    4. Reglas para los identificadores
      1. Un identificador es una secuencia de caracteres Unicode de letras y dígitos. Lo cual incluye a los caracteres ASCII A - Z y a - z, los dígitos 0 a 9, el carácter de subrayado (_), y el signo de dólar ($)
      2. El primer carácter de un identificador debe ser una letra, subrayado o el signo de dólar. En otras palabras, el primer carácter no puede ser un dígito
      3. Un identificador no debe ser una palabra reservada de Java
    5. En Java, cada variable tiene un tipo
    6. Se declara colocando primero el tipo de variable, seguido de su nombre
    7. Cuando su código fuente se compila, el compilador analiza el código en tokens sobre la base de los espacios, saltos de línea, tabuladores y otros separadores en el código
    8. Existen cinco tipos de tokens en Java
      1. separadores
      2. palabras reservadas
      3. literales
      4. operadores
      5. identificadores
  2. Alcance
    1. Se refiere a la parte del código donde se puede acceder a una variable
    2. Variables de Instancia
      1. Son los campos no estáticos de la clase, denominados simplemente como campos
      2. Se asignan en la memoria cuando un nuevo objeto es instanciado
      3. El operador new inicializa todos los campos con su valor por defecto
      4. Valores por Defecto
        1. Los campos numéricos primitivos se inicializan en cero
        2. Los tipos booleanos se inicializan en false
        3. Los tipos caracteres (char) se inicializan en null ('\u0000')
        4. Tipos de referencias se inicializan en null
      5. Inicialización explícita es cuando se le asigna un valor al mismo tiempo que se declara
      6. La inicialización explícita permite inicializar campos antes que se ejecute el constructor
      7. tipo nombre_variable = valor_explicito
    3. Variables de Clase
      1. Se refiere a una variable estática o campo estático
      2. Se asigna la memoria para el campo cuando la clase es cargada por el cargador de clases de la JVM
      3. La variable permanece en memoria hasta que el cargador de clases de la JVM descargue la clase
      4. Java no es compatible con el concepto de variables globales. Todas las variables aparecen dentro de una clase o interfaz
      5. Existen en la memoria antes que los objetos sean instanciados
      6. Los campos estáticos no pertenecen a ninguna instancia de la clase
      7. Para "n" instancias de una clase, se tiene una (1) sola instancia de la variable estática
      8. Se accede a ellas anteponiendo el nombre de la clase o interfaz (Clase.Variable)
      9. Importaciones Estáticas
        1. Las variables estáticas se pueden importar
        2. Permite que la variable estática sea accesible sin anteponer el nombre de la clase o interfaz
        3. También se puede utilizar el asterisco como comodín, lo que permite importar todas las variables estáticas de una clase o interfaz
        4. import static paquete.clase.variable
    4. Variables Locales
      1. Es una variable definida dentro de un método, incluyendo los parámetros
      2. Se crea en la memoria cuando el método se ejecuta y se borra cuando el método termina o devuelve algún valor
      3. Se almacenan en la memoria de pila de llamada (Call Stack Memory)
      4. No aparecen nunca en la pila de la memoria (heap memory), aunque puede hacer referencia a un objeto de la pila de la memoria
      5. Se deben inicializar antes de usar, sino el compilador generará un error (variable x might not have been initialized)
      6. No tienen un valor predeterminado y contienen datos basura hasta que se inicialice
  3. Matrices
    1. Es un bloque continuo en la pila de la memoria que representa una colección tamaño fijo de valores del mismo tipo de dato
    2. Las matrices son de tamaño fijo y no puede aumentar o disminuir dinámicamente
    3. Topic
    4. Referencias de Matrices
      1. Una referencia indica el tipo de dato que los valores van a almacenar
      2. Se utiliza corchetes para denotar la referencia a un matriz
      3. int [] edades; GregorianCalendar [] fechas;
      4. Un error común es especificar el tamaño en la declaración int [20] finishTimes;
      5. El tamaño de la matriz se determina solo cuando el objeto matriz es instanciado
    5. Objetos Array
      1. Se inicializan con la palabra reservada new, la cual requiere el tipo de dato y el tamaño
      2. Estan indexados con base cero, es decir, el primer elemento de la matriz es el índice 0, el segundo elemento es el índice de 1, etc.
      3. Cuando se instancia una matriz, todos sus elementos son inicializados
      4. int [] edades = new int[20]; fechas[0] = new GregorianCalendar(2010, 3, 22);
      5. La longitud de una matriz se conoce mediante el atributo length Ejemplo: edades.length
    6. Matrices Multidimensionales
      1. Topic
      2. Declarar una referencia a una matriz multidimensional consiste en denota un conjunto de corchetes para cada dimensión de la matriz
      3. Para crear instancias de una matriz multidimensional, se define el tamaño de cada dimensión en la sentencia new
      4. Para acceder a un elemento de una matriz multidimensional, se debe especificar el índice de cada dimensión
      5. String [][][] nombres; nombres = new String[10][5][20];
      6. GregorianCalendar [][] meses = new GregorianCalendar[12][]; meses[0] = new GregorianCalendar[31]; meses[1] = new GregorianCalendar[29];
      7. Un error común es no especificar el tamaño de la matriz GregorianCalendar [][] meses = new GregorianCalendar [][]; int [][] notas = new int [][4];
    7. Inicializadores de Matrices
      1. Es una notación abreviada para declarar una matriz y llenarla de valores, todo en una sola instrucción
      2. Son convenientes para la creación rápida de pequeños arreglos
      3. En lugar de utilizar la palabra clave new, se lista los elementos de la matriz entre llaves y separados por comas
      4. int [] edades = {21, 27, 45, 30, 51}; float [][] resultados = {{2.0F, 1.5F}, {9.2F, 6.7F}};
  4. Clases
    1. Es la descripción de un objeto y es uno de los pilares fundamentales de la programación orientada a objetos
    2. Se define en un arhcivo fuente .java y su correspondiente código de bytes compilado en un archivo .class
    3. El nombre del archivo .class coincide con el nombre de la clase
    4. El archivo .class debe estar guardado en una estructura de directorio que coincida con el nombre del paquete de la clase
    5. Elementos que puede contener
      1. Variables de instancia también denominados campos, representan los atributos del objeto que describe y se utilizan para almacenar el estado del objeto
      2. Variables de clase, son campos estáticos y representan a las variables globales y a los datos que se comparte entre las instancias de la clase
      3. Métodos, representan los comportamientos del objeto que se describe
      4. Constructores, son métodos especiales y es invocado durante el proceso de creación de la instancias y permitir al objeto inicializar su estado
      5. Clases anidadas, una clase Java puede contener la definición de otra clase
      6. Inicializadores de instancia, bloques de código que se ejecutan durante el proceso de creación de instancias
      7. Inicializadores estáticos, bloques de código que se ejecutan cuando la clase es cargada por el cargador de clases de la JVM
  5. El proceso de instanciación
    1. Con el operador new es la forma típica de instanciar una clase
    2. El operador new crea una instancia del objeto en la pila de la memoria (heap memory) y devuelve una referencia al objeto
    3. Lista de eventos que suceden cuando se crea la instancia de un nuevo objeto
      1. La JVM determina la cantidad de memoria necesaria para el nuevo objeto, asigna la memoria en la pila (heap) y asigna los valores por defecto de los campos.
      2. Se lleva a cabo la inicialización explícita de las variables de instancia
      3. El constructor adecuado es invocado, en función de los argumentos especificados en la sentencia new
      4. Antes de que el constructor sea ejecutado, se ejecuta uno de los constructores de la clase padre
      5. Se ejecutan los inicializadores de instancia. Si una clase tiene varios inicializadores de instancia, se ejecutan en el orden en el que aparecen en el archivo fuente
      6. Se ejecuta el cuerpo del constructor
      7. El operador new devuelve una referencia al nuevo objeto
    4. Constructores
      1. Es un método especial dentro de la clase que se invoca en el proceso de instanciación
      2. Permite "construir" su objeto, asegurando que todos los campos se inicien correctamente
      3. Pueden tener argumentos, lo que le permite inicializar el estado del objeto
      4. Propiedades
        1. El nombre debe coincidir con el nombre de la clase
        2. No declara un valor de retorno
        3. Sólo se invoca una vez durante el proceso de creación de la instancia
        4. Puede tener cualquiera de los cuatro niveles de acceso: público, privado, protegido, o por defecto
        5. Puede lanzar cualquier número de excepciones
    5. El constructor predeterminado
      1. Toda clase tiene por lo menos un constructor
      2. Si NO se define explícitamente un constructor para una clase, el compilador inserta un constructor por defecto
      3. El constructor predeterminado no posee argumentos y tiene el cuerpo de método vacío
    6. El uso de this en los Constructores
      1. La palabra clave this en Java representa la referencia que cada objeto tiene a sí mismo
      2. Puede invocar a otro constructor de la misma clase, evitando la repetición de código en varios constructores
      3. Topic
      4. La llamada a otro constructor mediante el uso de la palabra reservada this debe ser la primera línea de código en el constructor o se producirá un error al compilar
    7. El uso de super en los Constructores
      1. La palabra reservada super sirve para invocar a un constructor de la clase padre
      2. Permite elegir qué constructor de la clase padre será ejecutado
      3. Debe ser la primera línea del código del cuerpo del constructor o dicho código no se compilará
      4. No se debe confundir el uso de la palabra super en un constructor con la palabra clave super, que representa la referencia al objeto padre
      5. Si un constructor no contempla explícitamente una llamada a super, el compilador inserta la declaración super() como la primera línea de código en el constructor
    8. Inicializador de Instancia
      1. Es un bloque de código declarado en una clase que se ejecuta en cada nueva instancia de la clase
      2. Se ejecuta inmediatamente después de que termine el constructor de la clase padre y antes del cuerpo del constructor de la clase
      3. Una clase puede tener varios inicializadores de instancia y serán ejecutan en el orden en que aparecen en la clase
      4. No se puede invocar explícitamente a un inicializador de instancia porque no tiene nombre
      5. La sintaxis es simplemente colocar el código entre llaves
      6. Topic
    9. Inicializador Estático
      1. Es un bloque de código que se ejecuta una vez cuando una clase es cargado por el cargador de clases
      2. La sintaxis de un inicializador estático es la palabra clave static seguida de llaves
      3. Una clase puede contener varios inicializadores estáticos y estos se ejecutarán en el orden en que aparecen en la clase
      4. Su propósito es realizar cualquier inicialización compleja de los campos estáticos en la clase o para realizar cualquier tarea que deban llevarse a cabo sólo una vez
      5. Topic
    10. Cargador de Clases (Class Loader)
      1. Cada JVM ha construido su objeto cargador de clases de java.lang.ClassLoader, el cual es responsable de cargar las clases de un programa en la memoria
      2. Por cada clase que se carga, se instancia el objeto java.lang.Class
      3. Carga una clase sola una vez, por lo que hay un sólo objeto java.lang.Class por cada clase que utiliza el programa
  6. Métodos
    1. Representan los comportamientos del objeto
    2. La firma de un método consiste únicamente en el nombre del método y sus parámetros (el valor de retorno, las excepciones y el cuerpo no se consideran)
    3. ¿Cómo Declarar un Método?
      1. Topic
      2. Especificador de Acceso
        1. public (público), el método es accesible para cualquier otra clase
        2. private (privado), el método sólo es accesible dentro de la clase
        3. protected (protegido), el método es accesibre dentro del mismo paquete y en las clases hijas
        4. acceso por defecto, el método es accesible solo en el mismo paquete
      3. Otros Especificadores
        1. static (estático), también conocido como un método de clase
        2. final, el método no puede ser sobreescrita por una clase hija
        3. abstract (abstracto), el método debe ser sobreescrito por las clases hijas no abstractas
        4. native (nativo), mapea un método escrito en un idioma diferente, por lo general C o C++
        5. synchronized (sincronizado), el hilo de la llamada deberá obtener un bloqueo del objeto antes de ejecutar el método
        6. Un método puede NO declarar estos modificadores o puede puede declarar más de uno
      4. Valores de Retorno
        1. void, el método no devuelve nada
        2. Puede devolver tipos primitivos (byte, short, int, long, float, double, boolean o char)
        3. Puede devolver cualquier referencia, es decir, puede devolver cualquier tipo de datos
    4. Métodos de Instancia
      1. Es un método no estáticos de una clase
      2. Representan los comportamientos de cada instancia de la clase
      3. Sólo se puede invocar desde una instancia de la clase
      4. Sin una instancia de la clase, el método no existe y no tiene sentido tratar de invocarlo
      5. Se utiliza el operador punto (.) en una referencia para invocar un método de instancia
      6. Detrás de la Escena
        1. Desde el punto de vista orientado a objeto, cada instancia de una clase recibe cada campo y método de la clase en la memoria cuando el objeto es instanciado
        2. Para los campos, eso sucede en la pila de la memoria (heap memory). Cada objeto tiene su propia memoria para cada campo no estáticos de la clase
        3. Desde un punto de vista práctico, cada objeto no necesita su propia copia de los métodos porque los métodos no tienen ningún estado y la aplicación de cada método es el mismo para cada instancia
        4. Para ahorrar memoria, la JVM almacena las implementaciones de los métodos en el objeto Class de la clase, y cada objeto tiene acceso a estas implementaciones mediante un puntero
        5. Los métodos de instancia en realidad son compartidos por todas las instancias
    5. Métodos Estáticos
      1. También conocido como un método de clase
      2. Se declara con la palabra reservada static
      3. Igual que un campo estático, pertenece a la clase, no las instancias
      4. Se invoca sin tener ninguna instancia de la clase
      5. Se utiliza el nombre de la clase para invocar a alguno de sus métodos estáticos Ejemplo: double resultado = Math.sqrt(49.5);
      6. Realizan su tarea sólo con los argumentos pasados o con datos "globales" como los campos estáticos
    6. Argumentos de Longitud Variable
      1. Sintaxis: Se coloca tres puntos (puntos suspensivos) a continuación del tipo de dato del parámetro
      2. Sólo se puede declarar un parámetro como longitud variable y debe aparecer al final de la lista de parámetros
      3. Java trata el parámetro de longirud variable como una matriz cuyos elementos son igual al tipo de dato del parámetro
      4. Topic
      5. Cuando se sobrecarga métodos con un argumento de longitud variable, es necesario asegurarse de que los tipos de datos de la lista de parámetros sean suficientemente únicos para evitar cualquier ambigüedad
      6. Topic
    7. Sobrecarga de Métodos
      1. Se produce cuando una clase contiene varios métodos con el mismo nombre, pero con diferentes listas de parámetros
      2. Reglas
        1. Las listas de parámetros debe ser único, ya sea en el número de parámetros o en su tipo de datos
        2. El valor de retorno puede ser diferente (siempre y cuando la lista de parámetros sea única)
        3. La lista de excepciones declarado puede ser diferente (siempre y cuando la lista de parámetros sea única)
      3. Topic
      4. Los valores de retorno y la lista de excepciones son irrelevantes si las firmas de los método son únicos
      5. Topic
      6. No debe haber confusión cuando los tipos de parámetros de métodos sobrecargados están relacionados ya sea por herencia o promoción
    8. Sobreescribir Métodos
      1. Significa que la clase hija contiene una firma de método igual que su clase padre
      2. Se refiere a una clase hija que sobreescribe un método heredado de su padre
      3. Reglas
        1. El método en el hijo debe tener la misma firma (nombre y lista de parámetros) que el método del padre
        2. El acceso al método del hijo deber ser al menos igual o más accesible que el método del padre
        3. Cualquier excepción lanzada por el método del hijo debe ser una subclase de una de las excepciones producidas por el método del padre
        4. El tipo de retorno del método del hijo tiene que ser el mismo o una subclase de tipo de retorno del método del padre
      4. Un hijo puede invocar el método sobreescrito del padre usando la palabra reservada super
      5. Todo objeto tiene una referencia a su objeto padre a través de la palabra reservada super
      6. Tipo de Retorno Covariante
        1. Antes de Java 5.0, para que una clase hija sobreescriba un método, éste debería de tener el mismo tipo de dato de retorno que el método de la clase padre
        2. Java 5.0 introduce el tipo de retorno covariante, que permite sobreescribir un método si el tipo de dato de retorno del método hijo es una subclase del tipo de dato de retorno del método del padre
        3. Topic
        4. No se aplica a tipos primitivos
        5. Topic
    9. Ocultar Métodos
      1. Si un método estático en una clase hija contiene el mismo método estático como en lau clase padre, entonces el método en la clase hija esconde el método de la clase padre, pero no la anula
      2. Una clase hija no puede contener una versión no estática de un método estático de la clase padre
      3. Una clase hija no puede contener una versión estática de un método no estático de la clase padre
    10. Métodos Finales
      1. Se declara utilizando la palabra reservada final
      2. Estos métodos no pueden ser sobreescritos
  7. Clases Abstractas
    1. Es una clase que no puede ser instanciada
    2. Se utiliza la palabra reservada abstract para declarar clases abstractas
    3. Métodos Abstractos
      1. Es un método de instancia que no contiene cuerpo y que tiene que ser sobreescrito por las clases hijas no abstractas
      2. En lugar del cuerpo del método, simplemente se coloca un punto y coma para terminar su declaración
      3. Ejemplo: public abstract int read() throws IOException;
    4. El término de subclase concreta se refiere a una subclase que no es abstracta
  8. Interfaces
    1. Es similar a una clase, pero no es una clase
    2. Una clase que implementa una interfaz, hereda todos los métodos abstractos declarados en la interfaz
    3. Una clase que implementa una interfaz debe sobreescribir los métodos de interfaz o la clase deberá ser declararada como abstracta
    4. Una clase puede implementar múltiples interfaces separandolas por comas
    5. Topic
    6. Propiedades
      1. Todos los métodos son abstractos, sean o no declarados explícitamente como abstractos
      2. Todos los métodos en una interfaz son públicos, sean o no declarados explícitamente como públicos
      3. Los campos son públicos, estáticos y finales, sean o no declarados explícitamente como tales
      4. No puede declarar métodos estáticos
      5. No puede ser instanciada
      6. Sus campos, al ser del tipo final, deben ser inicializados explícitamente
      7. Topic
    7. Una interface puede extender de otra interface utilizando la palabra reservada extends. Incluso, puede extender de MÚLTIPLES interfaces.
    8. Topic
  9. Enumeraciones
    1. Es un conjunto fijo de constantes
    2. Es una clase Java que representa una enumeración
    3. Se utiliza cuando se tiene un conjunto de elementos cuyos valores son conocidos en tiempo de compilación
    4. Se utiliza la palabra reservada enum para declara una enumeración
    5. Propiedades
      1. La palabra clave enum realmente define una clase que extiende de java.lang.Enum. Por lo tanto, una enumeración no puede extender de otra clase o enumeración.
      2. No se instancia. Las constantes que se definen en una enumeración son implícitamente del tipo public, final y static. Ejemplo: Size s = Size.LARGE;
      3. Puede declarar métodos y campos adicionales. Los cuales deben aparecer después de la lista de enumeración, y dicha lista debe terminar con un punto y coma en esa situación
      4. Se pueden definir constructores, útil cuando las enumeraciones contienen campos adicionales. Dichos constructores deben ser privados.
    6. Topic
    7. Métodos heredados
      1. values()
        1. Devuelve una matriz con todos los valores de la enumeración. Por ejemplo, la llamada Size [] valores = Size.values (); devuelve una matriz con los elementos de Size Size.SMALL, Size.MEDIUM, Size.LARGE, and Size.EXTRA_LARGE.
      2. ordinal()
        1. Proporciona la posición de una constante contando desde cero. Por ejemplo, Size.MEDIUM.ordinal () devuelve 1
      3. toString()
        1. Devuelve el nombre de la constante enumerada. Por ejemplo, Size.SMALL.toString () devuelve la cadena "SMALL"
      4. valueOf
        1. Convierte una cadena (String) a su valor de enumeración correspondiente. Por ejemplo, las sentencias Size s = (Size) Enum.valueOf(Size.class, "SMALL"); y Size s = Size.valueOf("SMALL"); establecen Size.SMALL a la variable s
  10. Clases Anidadas
    1. Es una clase definida dentro de otra clase
    2. Una clase anidada que no es estática se conoce como una clase interna
    3. Tipos
      1. Clase miembra interna, es una clase no estática anidada que se declara a nivel miembro de una clase
      2. Clase local interna, se define dentro de un método. Debido a que aparece dentro de un método
      3. Clase anúnica interna, es un caso especial de una clase local interior que no tiene nombre
      4. Clase interna de nivel superior, son clases estáticas que se anidan en el nivel miembro de una clase
    4. Clase Miembra Interna
      1. Se define a nivel de miembro de una clase
      2. Propiedades
        1. Puede ser del tipo public, private, protected o tener el acceso por defecto
        2. No puede extender de ninguna clase o implementar algún número de interfaces
        3. Puede ser del tipo abstract o final
        4. No puede declarar campos o métodos estáticos
        5. Tiene acceso a los miembros de la clase externa, incluso los miembros privados
        6. Un objeto de una clase interna se asocia exactamente con un objeto de la clase externa
        7. No se puede crear una instancia de una clase interna sin una instancia de la clase externa correspondiente
        8. Outer a = new Outer; Outer.Inner b = a.new Inner();
      3. Topic
      4. JVM no posee un concepto de clase interna
      5. Cuando una clase externa se compila, se generan dos archivos de código de bytes: Externa.class y Externa$Interna.class
    5. Clase Local Interna
      1. Es una clase anidada definida dentro de un método
      2. No existe hasta que el método sea invocado
      3. Propiedades
        1. No tienen un especificador de acceso
        2. No pueden ser declaradas estáticas, ni pueden declarar campos o métodos estáticos
        3. Tienen acceso a todos los campos y métodos de su clase envolvente
        4. No tiene acceso a las variables locales del método a menos que dichas variables sean del tipo final
      4. Topic
      5. Cuando una clase interna se compila, se generan dos archivos de código de bytes: Externa.class y Externa$1Interna.class
    6. Clase Anónima Interna
      1. Es una clase local interna que no tiene nombre
      2. Se declara y se instancia mediante la palabra reservada new
      3. Exiende de una clase o implementa una interface
      4. Propiedades
        1. No tienen un especificador de acceso
        2. No pueden ser declaradas estáticas, ni pueden declarar campos o métodos estáticos
        3. Tienen acceso a todos los campos y métodos de su clase envolvente
        4. No tiene acceso a las variables locales del método a menos que dichas variables sean del tipo final
      5. Topic
      6. Debido a que la clase anónima interna no tiene nombre, el compilador le asigna un número, generando dos archivos de código de bytes: Externa.class y Externa$1.class
    7. Clase Estática Anidada
      1. Es una clase estática definida a nivel de miembro de su clase envolvente
      2. No es una clase interna
      3. No tienen acceso a los campos y los métodos de la clase envolvente, y se pueden instanciar, sin tener la instancia correspondiente de la clase externa
      4. Propiedades
        1. Para denotar una clase anidada desde fuera de su clase envolvente, a la clase anidada se le coloca como prefijo el nombre de la clase envolvente (como a los campos o métodos estáticos)
        2. El acceso puede ser controlado por un especificador de acceso
        3. La clase envolvente tiene acceso a los campos y métodos de la clase anidada, incluso los privados
      5. Puede ser importada usando una importación estática import paquete.ClaseExterna.ClaseInterna;