-
Escribiendo
Clases Java
- Una clase describe un objeto
-
Objeto
- Puede representar algo tangible o algo menos obvio pero útil para el programa
- Es una instancia de una clase
- En un archivo .java solo puede existir una clase del tipo public de nivel superior
-
Topic
- La clase Order no puede ser private ni protected porque no está permitido tener
una clase de nivel superior de este tipo
- La clase Order no puede ser public porque la clase Customer ya es public. Por
consiguiente, solo puede tener el acceso por defecto
- El nombre completo de una clase o interfaz cambia cuando se encuentra en un paquete. El nombre del paquete se
convierte en un prefijo para el nombre de clase.
- El archivo bytecode compilado debe aparecer en una estructura de directorios en el sistema de archivo que coincida
con el nombre del paquete.
-
Paquetes
- Grupo de clases y/o interfaces
-
Beneficios
- Organiza el programa por grupos de clases y/o interfaces que poseen cierta relación de usabilidad
- Crea un namespace a las clases e interfaces
-
Palabra Resevada: package
- Coloca una clase e interfaces dentro de un paquete
- Debe estar en la primera línea del archivo fuente
-
Unnamed Package
- Si una clase no específica un paquete, la clase pertenece al paquete unnamed
- Las clases del paquete unnamed NO pueden ser importadas dentro de un archivo fuente
-
Palabra Reservada: import
- Permite hacer referencia a una clase sin necesidad de usar su nombre completo
- Se usa para importar una simple clase o todo un paquete (*)
- Las importaciones se realizan después de declarar el paquete y antes de declarar la clase
- El compilador de Java elimina todas las declaraciones de importación y sustituye
a todos los nombres de clase en el código fuente con sus nombres completos.
- El paquete java.lang es el único que el compilador importa automáticamente
- Importar todo un paquete con el uso del comodín (*) no tiene impacto sobre
el tamaño del archivo compilado (bytecode file). Esto se debe a que realmente
no se incluye nada en el archivo fuente.
- El estándar de Java para el nombre de paquetes es utilizar el nombre de dominio de la
empresa (en sentido inverso) como prefijo a los nombres de su paquete. Ej: net.kielsaenz
-
Estructura de Directorios
- El uso de paquetes origina que el código compilado aparezca dentro de una estructura de
directorio que es igual al nombre de su paquete
-
Opción -d del
compilador
- El código compilado se emitirá en el directorio especificado
- Crea dentro del directorio de salida una estructura de directorios adecuada
que coincida con los nombres de paquetes de las clases
- java -d <directorio de salida> <clases a compilar>
-
La variable de entorno
CLASSPATH
- Especifica los directorios y archivos JAR en donde se desea que el compilador y la JVM
busquen archivos compilados
- Puede contener cualquier número de directorios y archivos JAR
- Se debe hacer referencia al directorio padre. El compilador y el JRE buscará en los
subdirectorios apropiados.
- ERROR COMÚN: Agregar parte del nombre del paquete
-
Corriendo Aplicaciones Java
- El punto de entrada a un programa Java es el método main, que puede estar definido en cualquier clase:
public static void main(String[] args)
-
Comando java
- Se utiliza para ejecutar una aplicación: java nombre_aplicacion
- Asume que el archivo compilado se encuentra en el mismo directorio
- Para ejecutar la aplicación desde cualquier directorio, se debe incluir dicha aplicación en el CLASSPATH
- Solo se necesita el nombre de la clase, la cual debe contener el método main
- ERROR: java HelloWorld.class (la JVM buscará la clase class dentro del paquete HelloWorld)
-
-classpath
- Permite especificar la ruta de clases a partir de la línea de comandos
- Garantizar que se esté apuntando a los directorios y archivos JAR correctos
- Reemplaza la variable de entorno CLASSPATH
- Ejemplo: java -classpath c:\myproject\build com.sybex.demos.TestColors
-
Para separar multiples directorios usar
- Windows: punto y coma (;)
- Unix: coma (,)
- Se puede utilizar la abreviatura -cp en lugar de -classpath
-
Archivos JAR
- Archivos de código de bytes (bytecode) se pueden almacenar en archivados comprimidos
denominados archivos JAR
- El compilador y la JVM puede encontrar archivos de código de bytes en archivos JAR sin
necesidad de descomprimir los archivos
- Ejemplo: C:\myproject\build > jar -cvf myproject.jar .
- La opción -c es para crear un nuevo archivo JAR
- La opción -v indica al comando jar ser prolijo mientras procesa los archivos (recursividad)
- La opción -f denota el nombre del archivo JAR, en el ejemplo es myproject.jar
- Después del nombre del archivo, se debe especificar los archivos o directorios a incluir en el JAR
-
Argumentos
- Los argumentos en la línea de comandos se pasan al método principal como una sola matriz de objetos String
- Topic
-
Tipos de Referencia
vs
Tipos Primitivos
-
Tipos Primitivos
- Son ocho los tipos de datos primitivos y representan los bloques de construcción de objetos de Java
- Todos los objetos de Java son un conjunto complejo en memoria de estos tipos de datos primitivos
-
Tipos de Datos Primitivos
-
byte
- 8 bits
- -128 a 127
-
short
- 16 bits
- -32768 a 32767
-
int
- 32 bits
- -2147483648 a 2147483647
-
long
- 64 bits
- -9223372036854775808 a 9223372036854775807
-
float
- 32 bits
- 2^-149 a (2-2^-23).2^217
-
double
- 64 bits
- 2^-1074 a (2-2^-52).2^1023
-
char
- 16 bits
- '\u0000' a '\uffff' (0 a 65535) - Formato UNICODE
-
boolean
- --
- verdarero o falso
-
int x = 12345;
- Mantienen sus valores en la memoria donde se asigna la variable
- Un tipo primitivo sólo puede almacenar un valor de ese mismo tipo
-
Tipos de Referencia
-
Topic
- Son variables del tipo clase, interface o matriz
- No tienen el valor del objeto al que se refieren. En su lugar,
almacenan la dirección de memoria donde se encuentra el
objeto (puntero)
- El lenguaje Java no permite a un programador para acceder
a una dirección de memoria física de ninguna manera
- sólo puede usar una referencia para acceder a los campos y
métodos del objeto al que se refiere
-
Literales de Cadena
- La palabra reservada new no es necesaria para crear
el objeto String
- Los literales de cadena reciben un trato especial por la JVM
- La instancia un objeto String es almacenada en la
piscina de cadenas
- Como los objetos String en Java son inmutables, la JVM
puede optimizar el uso de literales de cadena, al permitir
sólo una instancia de una cadena en la piscina
-
Tipo null
- El tipo null no tiene un nombre, por lo que no es posible declarar una variable que debe ser el tipo nulo.
- Se puede asignar cualquier referencia al tipo null
- Los tipos primitivos no pueden ser asignados a null, solo referencias
- Dos referencias son compatibles sólo si los objetos que señalan son del mismo tipo o uno de los objetos es una hija de la otra.
-
Recolector de basura
(Garbage Collections)
-
Objeto Inaccesible
- El objeto ya no tiene referencias apuntando hacia él
- Todas las referencias al objeto estan fuera de alcance (scope)
-
Topic
- La referencia es una variable que tiene un nombre y puede ser
utilizado para acceder al contenido de un objeto.
- Una referencia puede ser asignada a otro de referencia
- Todas las referencias son del mismo tamaño
- Una referencia usualmente tiene 32 bits, pero su tamaño real
depende de la JVM
- Un objeto se encuentra en la pila (heap) y no tiene un nombre
- Se accede a un objeto únicamente a través de una referencia
- Los objetos consumen diferentes cantidades de memoria
- Un objeto no puede ser asignado a otro objeto
- Es el objeto del que se encarga el recolector de basura, no de
su referencia.
- Referencia
- Objeto
-
Método: System.gc
- Método estático que INTENTA ejecutar el recolector de basura
- Único método que se comunica con el recolector de basura
- Sugiere a la JVM gastar esfuerzo hacia el reciclaje de objetos no utilizados a fin de que
la memoria que ocupan en la actualidad estén disponibles para su reutilización
-
Método: finalize
Object.finalize()
- Sólo puede ser llamado una vez en un objeto
- Sólo se llama por el recolector de basura
- Es llamado después de que el objeto es elegible para la recolección de basura,
pero antes de que el objeto sea recogido en realidad
- Es invocado por el recolector de basura antes de que el objeto sea recogido
-
Llamada por valor
- Una variable que es pasada dentro de un método es llamada argumento
- Java simplifica el concepto de paso de argumentos a los métodos, proporcionando sólo una forma de pasar argumentos: por valor
- Pasar argumentos por valor significa que una copia del argumento se pasa al método
- Si el argumento pasado a un método es un tipo primitivo, es imposible para el método alterar el valor original primitivo
- Si el argumento pasado a un método es un tipo de referencia, es imposible para el método modificar la referencia original.
Sin embargo, el método puede cambiar el objeto
- Cuando se pasan argumentos a un método, es la referencia lo que se pasa, no el objeto
-
Ejemplo: Resultado = Albert Einstein
- La única razón por la que first y last no cambian de valor es porque son objetos del tipo String y los objetos String son inmutables
- Cuando se termina de ejecutar un método, los parámetros y las variables locales son destruidos y ya no existen en la memoria del programa
- Al igual que con los argumentos de los métodos, la mayor tamaño de datos que puede devolver cualquier método es de 64 bits (un long o double)
-
Operadores
-
Operadores de Asignación
-
Asignación Simple (1)
- =
- Almacena el resultado de la derecha en la variable de la derecha
- Sucede un error de compilación si el resultado de la derecha
no se puede convertir en el tipo de dato de la izquierda
-
Asignación Compuesta (11)
- +=, -=, *=, /=, %=, &= ^=, |=, <<=, >>=, >>>=
- Los operadores de asignación compuesta realizan el operador dado
primero entre los lados izquierdo y derecho del operando, y entonces
el resultado se almacena en la variable de la izquierda.
- A veces el operador compuesto puede salvarnos de la
necesidad de castear un valor antes de la asignación
-
Operadores Aritméticos
-
Operadores
de Adición
- Los operadores + y - se conocen como operadores aditivos
- Pueden ser evaluados en cualquiera de los tipos primitivos, excepto booleanos
- El operador + se puede aplicar a objetos String, que se traduce en la concatenación de cadenas
- Si los operandos son de tipos diferentes, el operando más pequeño es promovido al más grande
- Al asignar un tipo de datos más grande a una más pequeña, el compilador
se queja de una posible pérdida de precisión.
- La JVM asegura que el orden de las operaciones se evalúen de izquierda
a derecha cuando los operadores comparten la misma precedencia
-
Operadores
Multiplicativos
- Los operadores *, /,% y se conocen como los operadores multiplicativos
- Tienen una prioridad más alta que los operadores aditivos
- Sólo se puede realizar con los tipos primitivos, de lo contrario,
se produce un error del compilador
- Promueve ambos operandos al tipo de dato del operando más grande
- Si ambos operandos son más pequeños que un int, ambos operandos
se convierten a int s antes de la multiplicación se produce
-
Operador Módulo
- También conocido como el operador de resto (%)
- Evalúa el resto de dos números cuando se dividen
-
Operados de Incremento
y Decremento
- Son los operadores ++ y --
- Se pueden aplicar a una expresión ya sea como prefijo o como sufijo
- Tienen el mayor nivel de prioridad de todos los operadores de Java
- Sólo se puede aplicar a operandos numéricos y el
resultado es el mismo tipo de datos del operando
- Cuando el operador aparece después del operando, el incremento o decremento
no se produce hasta después que el operando se utilice en la expresión actual
- Cuando el operador aparece delante del operando, el operando se incrementa o
decrementa primero y luego el resultado se utiliza en la expresión actual
-
Operadores Relacionales
- < (menor que), <= (menor o igual que), > (mayor que), >= (mayor o igual que)
- Los operadores de relación sólo se puedem utilizar en tipos numéricos primitivos
- El resultado de cada operador relacional es siempre un valor booleano
- Si los operandos no son el mismo tipo primitivo, el operando más pequeño se promueve
al tipo del operando más grande antes que la comparación se realice
-
Operador instanceof
- El operador instanceof compara una referencia contra una clase o interface
- Sintaxis: reference instanceof ClassOrInterfaceName
-
Operadores bit a bit y Lógicos
- & (AND), ^ (OR exclusivo), | (OR inclusivo), && (AND condicional), || (OR condicional)
- &, ^ y | requiere que ambos operadores sean del tipo numérico primitivo o expresiones lógicas
- Para operar con los tipos numéricos, los operadores son bit a bit
- Los operadores && y || requieren que los dos operandos sean expresiones lógicas
- Los operadores bit a bit se evalúan sobre los tipos enteros (int)
-
Tabla
-
00
- 0 & 0 = 0
- 0 ^ 0 = 0
- 0 | 0 = 0
-
01
- 0 & 0 = 0
- 0 ^ 1 = 1
- 0 | 1 = 1
-
10
- 1 & 0 = 0
- 1 ^ 0 = 1
- 1 | 0 = 1
-
11
- 1 & 1 = 1
- 1 ^ 1 = 0
- 1 | 1 = 1
-
Operador Condicional
- También llamado como "operador ternario" , ya que es el único operador que tiene tres operandos
- Sintaxis: boolean_expression ? true_expression : false expression
- Los operandos segundo y tercero pueden ser expresiones que se evalúan
como un valor o cualquier método que devuelva un valor
- Versión condensada de una sentencia if / else
-
Operadores de Igualdad
- == (es igual a), != (no es igual a)
- Los dos operandos son tipos primitivos numéricos
- Los dos operandos son tipos booleanos
- Los dos operandos son tipos de referencias o tipos nulos (null)
- Retorna un valor booleano
- Si un operando es un tipo más grande, entonces el tipo más
pequeño se promueve antes de la comparación
- Entre dos referencias, compara las referencias, no los objetos a los que apuntan.
Dos referencias son iguales si y sólo si apuntan al mismo objeto (o ambos apuntan a null)
- Situaciones de Uso
-
Iigualdad de Objetos
- La clase java.lang.Object contiene el método: public boolean equals (Object obj)
- La regla general es reemplazar el método equals en todas las clases
para definir lo que significa que dos objetos son iguales
- La igualdad debe ser basado en la lógica de negocio de su aplicación
- Debido a que el método equals se define en la clase Object, se puede invocar
dicho método en cualquier objeto y pasarle cualquier otro objeto
- La clase java.lang.Object contiene el método: public int hashCode()
- Los métodos hashCode y equals se relacionan en el sentido de que
dos objetos que son iguales debería generar el mismo código hash