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