-
Variables
- 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
- int [] edades = {21, 27, 45, 30, 51};
float [][] resultados = {{2.0F, 1.5F}, {9.2F, 6.7F}};
-
Clases
- 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;