Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1
DIPLOMATURA EN PROGRAMACION JAVA
Capítulo 2
Diplomatura en Programación Java
entidades
+ Publico
+ Socio
gestion
+ Calendario + Prestamo
+ Direccion
+ GestionBiblioteca
+ Lector
+ prestamos (from gestion)
+ reservas
+ salidas
reserv as
recursos + Reserva
+ Computadora
+ Escritorio
+ Libro
(from gestion)
+ PuestoDeTrabajo
+ Salon
+ Silla
salidas
+ Consola
test
+ BibliotecaTest
(from gestion)
Los paquetes son los lugares físicos y lógicos donde se almacenan las clases en Java. Tienen una
relación con los directorios del sistema de archivos en cada sistema operativo, de manera que el
nombre de un paquete donde se guardan las clases es igual al nombre del directorio en el sistema
operativo donde residen las mismas.
Se definen al principio de toda declaración de clase y debe ser la primera sentencia cuando se crea
una clase y es el lugar donde se guarda la clase compilada (archivos con extensión .class), no los
archivos fuentes (que tiene extensión .java). Sin embargo, algunos entornos de trabajo guardan en
el mismo directorio ambos archivos o utilizan una estructura igual para los archivos fuentes para
facilitar el desarrollo.
Cuando se declara un paquete, se define un espacio de nombres, por lo tanto no es sólo un lugar
de almacenamiento, sino que también es un espacio que define una visibilidad. De esta manera, si
se quiere utilizar una clase que se encuentra en un paquete, se debe definir explícitamente el
acceso al mismo.
Nota: en el caso de Java, los paquetes UML además de definir un espacio de nombres, tienen
una relación directa con el lugar dónde se almacenan los elementos que contienen. Sin
embargo, el uso de estos espacios de nombres como tal para definir visibilidades está fuera
del alcance de lo expuesto. Sólo se utilizarán las visibilidades mínimas y necesarias para
comprender los conceptos de la programación orientada a objetos de la forma más sencilla.
En el lenguaje, el espacio de nombre por defecto que se coloca en un proyecto, coincide con el
lugar físico al que apunta la variable de entorno para la máquina virtual de Java, llamada
CLASSPATH (por el momento no nos preocuparemos de este tema, ya que los entornos definen y
manejan automáticamente esta variable). Lo que se debe saber conceptualmente es que el lugar a
partir del cual se definen las clases y los paquetes en un proyecto se lo conoce como el paquete
por defecto y el espacio de nombres por defecto. Se debe tener en cuenta desde ahora la
siguiente recomendación:
Si bien se pueden declarar clases en el paquete por defecto, no utilizarlo nunca para este
fin, sino sólo para declarar paquetes dentro de él.
Nota: se puede omitir la declaración de un paquete cuando se crea una clase, lo cual determina
que dicha clase se asigne al paquete por defecto (se lo puede pensar como el paquete “raíz” del
cual dependen todos los paquetes). Sin embargo esto puede traer problemas al intentar usar
una clase debido a que no “tiene” un espacio de nombres asignado. Por lo tanto, no usar nunca
el paquete por defecto para las clases.
Sin embargo, se pueden declarar otros espacios de nombre en un proyecto. Cabe destacar que en
Java un espacio de nombre se declara siempre en forma explícita dentro de la definición de una
nueva clase mediante la instrucción para la creación de un paquete. Esto crea el mencionado
paquete, crea un directorio a partir del valor de la variable CLASSPATH (por el momento, diremos
que se crea a partir del directorio que se toma como raíz para dejar los archivos compilados .class,
dentro del proyecto que se crea en el entorno de desarrollo) y por último asocia “lógicamente” el
paquete como un espacio de nombres. El formato de la instrucción de creación de paquetes se
muestra en el Código 2-1 y un ejemplo de uso en el Código 2-2.
Se declara con la sentencia package. Si el paquete no existe, el compilador lo crea (así como
también el directorio asociado al nombre en el sistema de archivos del sistema operativo). Si el
paquete existe, sólo incorpora la clase compilada a éste.
Para usar un espacio de nombre y que el compilador lo interprete correctamente, se debe utilizar
una sentencia diferente con el nombre totalmente calificado del dicho espacio de nombre (lo cual
da acceso – visibilidad – a todos los elementos que se encuentren en él usando luego del nombre
“.*”) o la clase en particular que se desee utilizar. El Código 2-3 muestra el formato y el Código 2-4
un ejemplo de uso.
Para acceder a una clase dentro de un paquete se debe utilizar la sentencia import, porque como
se mencionó anteriormente, los paquetes definen visibilidades, por lo tanto, se debe indicar
donde “mirar” para utilizar la clase.
Código 2-3: Formato UML del uso de un paquete o una clase que le pertenezca
import <espacio de nombre o clase totalmente calificada>
Código 2-4: Ejemplo del uso de un paquete con una clase que le pertenece
import ocultar.Persona;
Ejemplo
Estructura de paquetes en el sistema de la biblioteca desde el punto de vista del código. El diseño
UML correspondiente se puede apreciar en la Figura 2-1.
Figura 2-2: Estructura de paquetes del sistema para la biblioteca con las clases que les pertenecen
Comentarios
En Java existen tres formas de poner comentarios dentro del código, aunque por ahora solo
veremos dos y son las siguientes
/* Comienza el comentario
La combinación barra – asterisco para comenzar y asterisco - barra para
finalizar se utiliza si el comentario abarca más de una línea.
Finaliza el comentario. */
Variables
Las variables en un lenguaje de programación es el medio por el cual se almacenan valores
transitoriamente en un programa. Particularmente, en un lenguaje de programación orientado a
Objetos como Java, las variables son directamente asociadas a los atributos de las clases, aunque
se utilicen en otros lugares que no sean directamente atributos, como los parámetros de un
método. Si bien es cierto que en otros lenguajes orientados a objetos existen variables fuera de las
clases, en Java no. Por lo tanto en este lenguaje hablar de variables o atributos es lo mismo salvo
que estén en un método. Para comprender mejor el concepto se puede ver a la variable como el
resultado de utilizar en conjunto dos elementos y definirla de la siguiente manera:
Luego, en base a esta definición, es necesario saber en qué lugar se encuentra en la memoria
(dirección) y el rango de valores que puede almacenar (lo cual lo determina el tipo al que
pertenece la variable, como veremos posteriormente).
Las variables se diferencian en un programa por sus nombres y su tipo. Los nombres se utilizan
para asociarlos al lugar de la memoria donde se almacenará la variable. Estos siguen ciertas reglas
de escritura a las que están circunscriptas los identificadores (todo aquello a lo que un
programador le puede asignar un nombre se llama identificador). La razón de esto es para evitar
ambigüedades entre posibles operadores e instrucciones y los nombres de los identificadores.
En Java se puede hacer una primera clasificación de las variables según dos grupos:
Tipos primitivos
Tipos Referenciados
La principal diferencia entre estos dos grupos es que el primero son los tipos de datos prexistentes
definidos en el lenguaje mientras que los segundos son aquellos que pueden almacenar las
referencias que se obtienen al crear un objeto de cualquier clase que se haya definido.
Es necesario mencionar un área gris en el lenguaje. Hay ciertos tipos referenciados, o sea, que
provienen de clases definidas, que el lenguaje los maneja como tipos prexistentes o primitivos. El
motivo de esto es que dichas clases se consideraron con la importancia suficiente como para que
el lenguaje las maneje internamente. Este es el caso del tipo String o los vectores. Retomaremos el
tema posteriormente.
Identificadores
Hay una regla muy simple para determinar si algo es un identificador:
Como se puede apreciar, dentro de esta característica entran varios de los elementos antes
mencionados, como ser, nombres de clases, variables, métodos, etc...
Hay otros elementos del lenguaje Java todavía no mencionados que son identificadores. Estos se
irán descubriendo como tales a medida que se aprenda más del lenguaje siguiendo la simple regla
que se formuló.
Es preciso aclarar que cualquier palabra que el lenguaje defina como reservada o clave, no podrá
ser utilizada como identificador.
Por otro lado, crear un identificador es asignarle un nombre a un elemento que permite definir un
lenguaje de programación. Esta asignación de nombres debe seguir ciertas normas prestablecidas
en el formato del mismo que variarán de lenguaje a lenguaje. En el caso de Java, las reglas a seguir
son las siguientes:
Además existen ciertas normas estandarizadas para crear identificadores, que si bien no son
obligatorias, han sido adoptadas por la mayoría de los programadores y seguirlas ayudan mucho a
la legibilidad del código. Algunas de ellas son las siguientes
Los tipos primitivos de Java permiten clasificarlos según su uso en los siguientes grupos:
Tipos enteros
• byte
• short
• int
• long
Tipos de punto flotante
• float
• double
Tipo texto
• char
Tipo lógico
• boolean
Las declaraciones de las variables se realizan con el formato UML que muestra el código 2-5.
Mientras que las variables locales usan el formato sintáctico definido en UML que muestra el
Código 2-6.
En otras palabras:
Nota: En este punto es bueno señalar que en Java toda sentencia termina con un “;”. El otro
símbolo que indica el fin de algo es la “}”, pero se utiliza para ciertas declaraciones a las que se
llaman bloques de sentencias. Sólo hay un caso especial, llamado inicializador, en el cual son
asignados un grupo de valores a un elemento, en el que se combinan ambos símbolos de la forma
“};”
Ejemplo
Código 2-7: Declaraciones e inicializaciones de tipos primitivos
int nroEmpleados=10;
int edad=20;
float sueldoFijo;
long documento;
Nota: Cuando a una variable se le asigna un valor numérico dentro del código, dicho número se lo
identifica como “literal de asignación”. El lenguaje toma esos caracteres y los convierte al valor
binario que debe almacenar en la memoria para dicha variable
Tipos referenciados
Cada vez que se crea una clase se define un nuevo tipo, pero para poder hacer uso de él, se debe
crear un objeto. Esto es similar a declarar una variable de un tipo base, con la diferencia que la
memoria requerida para la operación será determinada por los elementos declarados en dicha
clase.
Por otro lado, el lenguaje utiliza la definición de la clase como plantilla de la memoria a utilizar y
en base a esto se realiza la creación del objeto.
En Java cuando se declara un objeto se utiliza un operador diseñado para este fin: new. Este
operador es quien toma la clase como molde y reserva la memoria para la creación del objeto.
Sin entrar en detalles acerca de la manera en que esto se realiza, el operador efectúa las
operaciones necesarias en memoria y luego devuelve el valor de la dirección o referencia de la
memoria donde lo hizo, de ahí el nombre de las declaraciones de tipo referenciados.
Evidentemente el valor devuelto debe almacenarse en algún lugar para su posterior uso y ese
lugar es una variable de tipo referencia. Como este tipo de variables almacenan la dirección de
memoria donde se creó el objeto y como toda clase genera un nuevo tipo, es evidente que la
declaración debe efectuarse con la clase que la define.
De esta manera, con el nombre de la clase seguido del identificador elegido se crea la variable
referencia. Cuando esta deba almacenar el valor devuelto por el operador new, al identificador lo
seguirá un operador de asignación “=”, el operador new y por último en nombre de la clase que
indica el tipo de objeto a crear. El formato se puede apreciar en el Código 2-8.
Al igual que las variables, se pueden crear tipos referenciados sin necesidad de inicializarlos con un
valor (referencia al objeto creado por new), pero se debe usar el operador posteriormente para
crear un objeto y utilizarlo. Distintos ejemplo se pueden ver en el Código 2-9.
Strings
Las cadenas de caracteres o “strings” en Java se manejan con una clase interna del lenguaje, por lo
tanto, siempre será un tipo referenciado.
El lenguaje permite dos formas de asignar una cadena de caracteres: cuando se crea el objeto y
mediante el operador de asignación. El Código 2-10 muestra posibles usos de cadenas.
System.out.println(string1);
System.out.println(string2);
string3 = string1 + string2;
Tipos entero
Existen cuatro tipos enteros y se diferencian en su capacidad de almacenamiento como muestra la
Tabla 2-2. Un ejemplo de cómo declarar variables enteras se puede ver en el código 2-11.
El lenguaje por defecto convierte a todo literal de asignación en un tipo entero int, por lo tanto
cuando se asigna un literal a otro tipo entero diferente se debe especificar con una letra o un
modificador de tipo (cast), como se muestra en el Código 2-12.
Las formas utilizadas para p y n son análogas. La letra “L” utilizada en la asignación a la variable p
es un camino corto que provee el lenguaje. El lenguaje permite la omisión de las conversiones de
tipo en los primeros dos ejemplos debido a que long es de mayor tamaño que int. A esto se lo
denomina promoción automática.
Java toma la asignación de un literal numérico en punto flotante por defecto como un double, por
lo tanto si es un float hay que especificarlo de una de las formas que muestra el Código 2-13.
Tipo Texto
Este tipo se utiliza para almacenar un solo caracter. Tiene la capacidad de almacenar cualquier
caracter en formato Unicode (formato estándar de cualquiera de ellos en Java).
Se debe notar que sólo almacena uno, para almacenar una palabra o tan sólo más de un caracter,
se debe utilizar otro tipo de datos que provee el lenguaje, el tipo String.
Otro punto importante es que cuando se asigna en el código un literal caracter, este debe ir
rodeado de comillas simples, como se muestra a continuación:
Tipo booleano
Este tipo sólo puede almacenar dos valores: true o false (que son literales que internamente se
convierte en 0 y 1 respectivamente).
Los valores que almacenan son considerados palabras clave en el lenguaje y se deben utilizar para
cualquier asignación a variables de este tipo. Generalmente es utilizado para la toma de
decisiones. El Código 2-15 muestra un ejemplo de uso.
Ejemplo
Código 2-15: Asignación de un tipo booleano
boolean b = false;
Son importantes porque al almacenar el valor de las variables que pertenecen a un objeto en
tiempo de ejecución, poseen los datos que definen su estado.
Métodos en Java
Los métodos, o como se los llama en otros lenguajes “funciones”, son los elementos de una clase
mediante los cuales se define una operación que un objeto de su tipo puede realizar. La
declaración de un método en Java siempre se debe realizar dentro de una clase y adopta el
formato que muestra el Código 2-18.
Fin de ejecución de sentencias del método: Opcionalmente poner una sentencia return
para terminar la ejecución del método. Si se indicó que el método retorna un valor
(recordar que puede ser void), este se debe poner a continuación
Fin del bloque de sentencias: Poner obligatoriamente la llave de cierre
El Código 2-19 muestra un ejemplo de un método que es público, devuelve un entero y recibe tres
enteros como parámetros.
Código 2-19: Ejemplo de un método de una clase de Java
public int calculaVolumen(int ancho, int largo, int alto){
//bloque de sentencias
}
En el Código 2-20 se puede ver el uso de esta instrucción que se repite en el Código 2-21. Se pasa
como parámetro del método una variable para mostrar el valor almacenado.
Como no está definido que un programa deba comenzar en una clase en particular, esto indica
que puede haber muchas clases que posean el método main, pero sólo puede haber un método de
este tipo por clase. El intérprete de Java sabe por dónde arrancar el programa porque el primer
argumento que recibe para empezar a ejecutarlo debe ser la clase que posee el método main que
se desea utilizar como comienzo de programa. El Código 2-20 muestra un ejemplo de su uso.
Constructores
Las clases tienen un método especial que se denomina constructor. Cuando se crea un objeto
mediante la creación de una instancia de una clase, luego que se reserva en memoria los lugares
de almacenamiento necesarios para el objeto, se ejecuta siempre el constructor.
Cómo es un método especial se diferencia de los otros por las siguientes dos características:
Si la clase no posee uno, como en el ejemplo anterior, se ejecuta uno por defecto que el lenguaje
provee más allá que no se especifique en el código.
Clases en Java
En este punto se pueden unir los conceptos explicados para analizar a las clases como la
importante unidad de programación que resulta ser en los lenguajes orientados a objetos. Tiene el
formato mostrado en el Código 2-23.
El caso más simple para analizar es la declaración de una clase que no tiene constructores
declarados explícitos y sólo posee atributos y métodos, como muestran el Código 2-24.
Los objetos siempre se construyen a partir de clases, por lo tanto, si la anterior no posee uno,
¿cómo lo hace? Los lenguajes crean automáticamente un constructor por defecto que no recibe
parámetros ni posee sentencias en su interior.
No se debe olvidar que cuando se declara una clase se crea un nuevo tipo. En este caso dicho tipo
es Ejemplo. Las clases son sólo moldes o plantillas para los objetos de su tipo que se creen. Se
puede apreciar en ella las interfaces de la clase declaradas con el modificador public.
A continuación, se muestra en el Código 2-25, el caso en el cual con una pequeña modificación se
le agrega un constructor a la clase. De esta manera, si se le quiere poner a la clase anterior un
constructor que reciba un entero, quedaría con formato declarado en el ejemplo.
Sólo nos resta ver cómo utilizar un constructor sobrecargado con otros (hay más de uno) y
declarar un método. Esto se muestra en el Código 2-26. Notar el uso de la palabra clave this para
resolver visibilidad. Esto se explicará posteriormente.
Ejemplo
En el sistema de la biblioteca, se puede ver como la clase Socio que se obtiene como resultado del
análisis del mismo en UML codificado en Java que se muestra en la Figura 2-3.
Socio
- apellido: String
- celular: String
- dni: String
- email: String
- nombre: String
- segundoNombre: String
- tel: String
+ cantidadDePrestamos(): int
+ cantidadDeReservas(): int
+ getApellido(): String
+ getCelular(): String
+ getDetalles(): String
+ getDni(): String
+ getEmail(): String
+ getNombre(): String
+ getSegundoNombre(): String
+ getTel(): String
+ obtenerLibrosUsadosPorSocioEnElSalon(): void
+ obtienePrestamo(Prestamo): void
+ obtieneReserva(Reserva): void
+ setApellido(String): void
+ setCelular(String): void
+ setDni(String): void
+ setEmail(String): void
+ setNombre(String): void
+ setSegundoNombre(String): void
+ setTel(String): void
Sólo los elementos de un objeto, métodos y atributos, poseen asociada una referencia del tipo
this, por lo tanto se lo puede utilizar para resolver ambigüedades.
Normalmente, dentro del cuerpo de un método de un objeto se puede referir directamente a las
variables miembros del objeto. Sin embargo, algunas veces es necesario evitar algún tipo de
ambigüedad acerca del nombre de un atributo y uno o más de los argumentos del método que
tengan el mismo nombre.
Por ejemplo, si una clase tiene declaradas variables de instancia que tienen el mismo nombre que
los argumentos de un método, utilizando this se resuelve la ambigüedad porque los métodos
poseen parámetros y variables locales que se alojan en el stack, por lo tanto nunca podrán tener
estos elementos un this asociado.
Uso de un objeto
Para utilizar los servicios que presta un objeto se invocan los elementos declarados en su interfaz
pública. Por lo tanto, el primer paso es declarar una instancia de la clase (también llamado
declaración de un objeto) que será el que se quiera utilizar. En el Código 2-28 se pude apreciar el
primer paso, la declaración de un objeto en base al tipo que define la clase a que pertenece si no
tiene definido un constructor explícito.
En la clase Ejemplo el único elemento en dicha interfaz son los elementos públicos. Para poder
invocarlos se debe utilizar la notación de punto y la referencia almacenada en la variable obj1, ya
que esta indica el lugar de almacenamiento del mismo. La declaración de un objeto de esta clase
cuando usa un constructor explícito es como lo muestra el Código 2-29.
Una descripción general (sin entrar en detalles como la reserva de memoria) de lo que ocurre
cuando se declara un objeto de una clase que tiene constructor, como en el ejemplo anterior, es lo
siguiente:
El Código 2-30 muestra como declarar un objeto con diferentes declaraciones de constructores.
Notar que la clase siempre tiene el mismo nombre (lo cual se hizo adrede para notar las distintas
versiones) y que se usan los espacios de nombres que definen los paquetes para diferenciarlas
mediante el nombre totalmente calificado.
Código 2-30: Declaraciones de objetos de clases con el mismo nombre en diferentes paquetes
package inicio;
import constructor.defecto.Ejemplo;
Ocultamiento de la información
Para proteger los datos que se almacenan dentro de un objeto, la clase utiliza la declaración de
visibilidad private para que no se pueda acceder la variable, ya que esta declaración indica que la
variable no pertenece a la interfaz de la clase. Cuando un elemento no pertenece a la interfaz no
se puede acceder por notación de punto una vez creado un objeto, sólo lo podrán acceder
aquellos elementos que pertenezcan a la clase. Con este fin se colocan en la interfaz métodos
especiales de acceso y mutación, llamados “getters and setters” en inglés, para obtener y
modificar el contenido de una variable de instancia. Esto se puede ver en el Código 2-31.
public Persona() {
}
Encapsulado
Como se mostró con anterioridad, en toda clase existe una parte pública y una privada. La primera
define los elementos de la clase que son accesibles a través de su interfaz. Muchas veces se hace
referencia a este hecho como “accesible por el mundo exterior o el universo”. Esta frase puede
simplificarse de la siguiente manera:
Los elementos públicos de una clase serán accesibles por notación de punto una vez creado
un objeto de su tipo
En cambio, la parte privada, define todo lo contrario. Los elementos declarados como privados en
una clase no serán accesibles por ningún elemento salvo que este se encuentre en la misma clase.
Este último concepto es el que permite separar los servicios que brinda un objeto de la forma en
que lo hace, por lo tanto, en otras palabras, un objeto debe verse como una serie de servicios que
presta a través de sus interfaces y la forma en que lo hace se oculta del mundo exterior porque no
es accesible.
Cuando una clase oculta una serie de operaciones (métodos y variables de la clase que éstos usan)
declarándolos privados y los utiliza posteriormente para brindar un servicio, se dice que este
servicio está encapsulado dentro de la clase.
Otra forma común de denominar a las operaciones o métodos privados de una clase es servicio
privado.
Se puede decir que el ocultamiento de la información y los métodos privados son en conjunto
conocidos como “encapsulado”, estén presente uno de ellos o ambos. Se debe notar en este
punto que si los métodos se ocultan pero no así las variables de la clase, no existe encapsulado
porque un cambio de valor en una variable puede determinar un cambio de comportamiento en
los métodos privados.
Un ejemplo claro de esto es cuando en una clase se oculta la información pero se quiere brindar la
posibilidad de acceder a los datos almacenados, ya sea para guardar valores como para leerlos. En
este caso se deben crear métodos públicos que cumplan ese rol.
Otro ejemplo es el que se muestra en el Código 2-32, donde un servicio se encapsula y la única
forma de acceder a él es mediante otro método de la misma clase.
public Persona() {
}
Operadores
Los operadores realizan operaciones entre uno, dos o tres operandos. Sólo se van a presentar
aquellos que sean necesarios para operaciones básicas.
Los operadores que requieren un operador se llaman operadores unarios. Por ejemplo, ++ es un
operador unario que incrementa el valor su operando en uno.
Los operadores que requieren dos operandos se llaman operadores binarios. El operador = es un
operador binario que asigna un valor del operando derecho al operando izquierdo.
Existe un único operador ternario que trabaja con tres operandos y funciona como un condicional
y dependiendo de cómo evalúa la condición devuelve un valor u otro. Este operador es :?. Sin
embargo está fuera del alcance de los temas a tratar.
Los operadores unarios en Java pueden utilizar la notación de prefijo o de sufijo (también
conocidas como pre y post, por ejemplo, un pre incremento de la variable i es ++i, mientras que un
post incremento es i++). La notación de prefijo significa que el operador aparece antes de su
operando, por ejemplo,
operador operando
operando operador
Todos los operadores binarios de Java tienen la misma notación, es decir aparecen entre los dos
operandos:
Además de realizar una operación también devuelven un valor. El valor y su tipo dependen del
tipo del operador y del tipo de sus operandos. Por ejemplo, los operadores aritméticos (realizan
las operaciones de aritmética básica como la suma o la resta) devuelven números, el resultado
típico de las operaciones aritméticas.
El tipo de datos devuelto por los operadores aritméticos depende del tipo de sus operandos: si se
suma dos enteros, se obtiene un entero. Se dice que una operación evalúa su resultado.
Es muy útil dividir los operadores Java en las siguientes categorías: aritméticos, relacionales y
condicionales, lógicos, de desplazamiento y de asignación. Recordar que sólo veremos algunos de
ellos.
Operadores aritméticos
El lenguaje Java soporta varios operadores aritméticos, incluyendo los que presenta la Tabla 2-4.
Tabla 2-4: Operadores aritméticos
Operador Descripción
+ suma
- resta
* multiplicación
/ división
% módulo
En todos los números enteros y de coma flotante. Por ejemplo, se puede utilizar este código Java
para sumar dos números:
sumarEsto + aEsto
dividirEsto % porEsto
La Tabla 2-5 resume algunas de las operaciones aritméticas binarias más importantes en Java.
Ejemplos de uso se pueden apreciar en el Código 2-33.
Tabla 2-5: Uso de operadores aritméticos en operaciones binarias
Operador Uso Descripción
+ op1 + op2 Suma op1 y op2
- p1 - op2 Resta op2 de op1
* op1 * op2 Multiplica op1 y op2
/ op1 / op2 Divide op1 por op2
% op1 % op2 Obtiene el resto de dividir op1 por op2
Nota: El lenguaje Java extiende la definición del operador + para incluir la concatenación (una a
continuación de la otra) de cadenas (Strings).
Los operadores + y - tienen versiones unarias que seleccionan el signo del operando. La Tabla 2-6
los muestra.
Tabla 2-6: Los signos que indican positivo o negativo también son operadores, pero unarios (afectan un solo operando)
Operador Uso Descripción
+ +op Indica un valor positivo
- - op Niega el operando
Nota: el operador unario de incremento y decremento cambio su prioridad dependiendo del lugar
en el que se encuentre. Cuando se encuentra previo al operando al que afecta es uno de los
operadores de mayor prioridad. Sin embargo cuando esta post operando pasa a ser el de menor
prioridad, incluyendo la asignación. El tema de la prioridad de operadores está fuera del alcance
de lo expuesto.
Ejemplo
Código 2-34: El uso más simple de los operadores unarios
Operador de asignación
Se puede utilizar el operador de asignación =, para asignar un valor a otro.
Además del operador de asignación básico, Java proporciona varios operadores de asignación que
permiten realizar operaciones aritméticas, lógicas o de bits y una operación de asignación al
mismo tiempo, pero están fuera del alcance de los temas a explicar.
a = a + 1;
@SuppressWarnings("unused")
public static void main(String[] args) {
boolean resultado;
System.out.println("-----------------------------------------------");
System.out.println("Tabla de verdad del AND (Y)");
System.out.println("-----------------------------------------------");
resultado = true && true;
System.out.println("Verdadero Y Verdadero = " + resultado);
resultado = true && false;
System.out.println("Verdadero Y Falso = " + resultado);
resultado = false && true;
System.out.println("Falso Y Verdadero = " + resultado);
resultado = false && false;
System.out.println("Falso Y Falso = " + resultado);
System.out.println("-----------------------------------------------");
System.out.println("-----------------------------------------------");
Operadores relacionales
Los operadores relacionales comparan dos operandos y determinan la relación entre ellos,
retornando un valor de verdadero o falso. Por ejemplo, !=, devuelve true si los dos operandos
son distintos.
La Tabla 2-8 resume los operadores relacionales de Java y el Código 2-37 muestra su uso.
Tabla 2-9: Los operadores relacionales
Operador Uso Devuelve true si
> op1 > op2 op1 es mayor que op2
>= op1 >= op2 op1 es mayor o igual que op2
< op1 < op2 op1 es menor que op2
<= op1 <= op2 op1 es menor o igual que op2
== op1 == op2 op1 y op2 son iguales
!= op1 != op2 op1 y op2 son distintos
El compilador separa las sentencias o llamados a función por cada “;” que encuentre. Además, se
pueden utilizar los espacios en blanco que se necesiten sin que afecte al código.
Por otra parte, las sentencias del lenguaje se colocan dentro de bloques, los cuales se definen con
un par de llaves. Por lo tanto, se puede definir un bloque como una colección de sentencias
limitadas por la apertura y cierre de llaves, como muestra el Código 2-39.
Otra característica de los bloques es que definen sus propias visibilidades, por lo tanto las
variables declaradas dentro de ellos tienen alcance del bloque (se pueden ver o utilizar sólo dentro
de él).
Los bloques se pueden anidar, por lo tanto, cuando se anidan bloques los que están anidados ven
las variables de los bloques que los contienen.
Los bloques se utilizan para separaciones sintácticas, como por ejemplo, el contenido de una clase:
Palabras clave
Las palabras clave en Java son las que se muestran en la Tabla 2-1:
Sin embargo, algunas de las palabras clave son sólo reservadas y no las utiliza el lenguaje, como
por ejemplo:
const
goto
También, true y false para los tipos boolean, no son sentencias sino por el contrario, son
literales constantes que se utilizan como palabras reservadas.
Ejercicios
Los temas de los que tratan los ejercicios de este módulo son los siguientes:
Clases en Java
Tipos básicos
Ocultamiento de la información
Índice de Figuras
Figura 2-1: Diagrama de paquetes del sistema para la biblioteca ......................................................... 1
Figura 2-2: Estructura de paquetes del sistema para la biblioteca con las clases que les pertenecen 4
Figura 2-3 Diagrama UML de la clase Socio .......................................................................................... 17
Índice de Tablas
Tabla 2-1: Modificadores de visibilidad para los elementos de una clase ............................................ 8
Tabla 2-2: Los tipos enteros .................................................................................................................... 10
Tabla 2-3: Los tipos punto flotante ........................................................................................................ 10
Tabla 2-4: Operadores aritméticos ......................................................................................................... 24
Tabla 2-5: Uso de operadores aritméticos en operaciones binarias .................................................... 25
Tabla 2-6: Los signos que indican positivo o negativo también son operadores, pero unarios
(afectan un solo operando) ..................................................................................................................... 26
Tabla 2-7: Operadores unarios de incremento y decremento .............................................................. 26
Tabla 2-8: Los operadores condicionales ............................................................................................... 27
Tabla 2-9: Los operadores relacionales .................................................................................................. 28
Tabla 2-10: Palabras reservadas ............................................................................................................ 30
Índice de Código
Código 2-1: Formato UML de la declaración de un paquete .................................................................. 3
Código 2-2: Ejemplo del uso de la instrucción para declarar un paquete ............................................. 3
Código 2-3: Formato UML del uso de un paquete o una clase que le pertenezca ................................ 3
Código 2-4: Ejemplo del uso de un paquete con una clase que le pertenece ........................................ 3
Código 2-5: Formato de la declaración de variables de la clase en Java ............................................... 7
Código 2-6: Formato de la declaración de variables locales en Java ..................................................... 7
Código 2-7: Declaraciones e inicializaciones de tipos primitivos ............................................................ 8
Código 2-8: Formato en UML para declarar tipos referenciados ........................................................... 9
Código 2-9: Declaraciones e inicializaciones de tipos referenciados ..................................................... 9
Código 2-10: Uso de cadenas.................................................................................................................... 9
Código 2-11: Declaración e inicialización del tipo int......................................................................... 10
Código 2-12: Las conversiones de tipo (cast) en los tipos enteros ....................................................... 10
Código 2-13: Conversiones de tipo en el punto flotante ....................................................................... 10
Código 2-14: Asignación de un caracter ................................................................................................ 11
Código 2-15: Asignación de un tipo booleano ....................................................................................... 11
Código 2-16: Declaraciones de atributos ............................................................................................... 11
Código 2-17: La clase Lector en el ejemplo del sistema de la biblioteca ......................................... 12
Código 2-18: Formato de la declaración de un método........................................................................ 12
Código 2-19: Ejemplo de un método de una clase de Java ................................................................... 13