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
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
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