Tema2 - Subrayado
Tema2 - Subrayado
Tema2 - Subrayado
Caso práctico
Todos los lenguajes de programación están constituidos
por elementos concretos que permiten realizar las
operaciones básicas del lenguaje, como tipos de datos,
operadores e instrucciones. Estos conceptos deben ser
dominados por la persona que desee incorporarse, con
ciertas garantías, a un equipo de programación. Debemos
tener en cuenta que los programas trabajan con datos, los
cuales almacenan en memoria y son posteriormente usados
para la toma de decisiones sen el programa.
María y Juan han formado equipo para desarrollar una aplicación informática para
una clínica veterinaria. Ada ha convocado una reunión con el cliente para concretar
los requerimientos de la aplicación, pero lo que está claro es que debe ser
multiplataforma. El lenguaje escogido ha sido Java.
—Lo que hace falta es entender bien los conceptos de programación orientada a
objetos —le comenta Juan a María. —Todo lo concerniente al mundo real puede
ser modelado a través de objetos. Un objeto contiene datos y sobre él se hacen
operaciones y gira toda la aplicación.
María está entusiasmada con el proyecto, cree que es una buena oportunidad para
aprender un lenguaje de la mano de Juan que se le da bastante bien todo el mundo
de la programación.
Para ello, vamos a tratar sobre cómo se almacenan y recuperan los datos de variables y cadenas
en Java, y cómo se gestionan estos datos desde el punto de vista de la utilización de operadores.
Trabajar con datos es fundamental en cualquier programa. Aunque ya hayas programado en este
lenguaje, échale un vistazo al contenido de esta unidad, porque podrás repasar muchos
conceptos.
Caso práctico
María y Juan han comprobado que una aplicación
informática es un trabajo de equipo que debe estar
perfectamente coordinado. El primer paso es la
definición de los datos y las variables que se van a
utilizar.
Las decisiones que se tomen pueden afectar a todo
el proyecto, en lo referente al rendimiento de la
aplicación y ahorro de espacio en los sistemas de
almacenamiento.
Después de la última reunión del equipo de proyecto ha quedado claro cuáles son
las especificaciones de la aplicación a desarrollar. Juan no quiere perder el tiempo y
ha comenzado a preparar los datos que va a usar el programa. Le ha pedido a María
que vean juntos qué variables y tipos de datos se van a utilizar, Juan piensa que le
vendrá bien como primera tarea para familiarizarse con el entorno de programación
y con el lenguaje en sí.
Un programa maneja datos para hacer cálculos, presentarlos en informes por pantalla o
impresora, solicitarlos al usuario, guardarlos en disco, etc. Para poder manejar esos datos, el
programa los guarda en variables.
Una variable es una zona en la memoria del computador con un valor que puede ser almacenado
para ser usado más tarde en el programa. Las variables vienen determinadas por:
Un nombre, que permite al programa acceder al valor que contiene en memoria. Debe ser
un identificador válido.
Un tipo de dato, que especifica qué clase de información guarda la variable en esa zona de
memoria
Un rango de valores que puede admitir dicha variable.
A partir de ahora es conveniente que utilices algún manual de apoyo para iniciarte a
la programación en Java. Te proponemos el de la serie de Libros “Aprenda
Informática como si estuviera en primero”, de la Escuela Superior de Ingenieros
Industriales de San Sebastián (Universidad de Navarra):
2.1.- Identificadores.
Un identificador en Java es una secuencia ilimitada sin espacios
de letras y dígitos Unicode, de forma que el primer símbolo de la
secuencia debe ser una letra, un símbolo de subrayado (_) o el
símbolo dólar ($). Por ejemplo, son válidos los siguientes
identificadores:
Esto quiere decir que en Java se pueden utilizar varios alfabetos como el Griego, Árabe o
Japonés. De esta forma, los programas están más adaptados a los lenguajes e idiomas locales,
por lo que son más significativos y fáciles de entender tanto para los programadores que
escriben el código, como para los que posteriormente lo tienen que interpretar, para introducir
alguna nueva funcionalidad o modificación en la aplicación.
El estándar Unicode originalmente utilizaba 16 bits, pudiendo
representar hasta 65.536 caracteres distintos, que es el
resultado de elevar dos a la potencia dieciséis. Actualmente
Unicode puede utilizar más o menos bits, dependiendo del
formato que se utilice: UTF-8, UTF-16 ó UTF-32. A cada
carácter le corresponde unívocamente un número
entero perteneciente al intervalo de 0 a 2 elevado a n, siendo
n
el número de bits utilizados para representar los caracteres. Por ejemplo, la letra ñ es el entero
164. Además, el código Unicode es “compatible” con el código ASCII, ya que para los
caracteres del código ASCII, Unicode asigna como código los mismos 8 bits, a los que les añade
a la izquierda otros 8 bits todos a cero. La conversión de un carácter ASCII a Unicode es
inmediata.
Recomendación
Una buena práctica de programación es seleccionar nombres adecuados para las
variables, eso ayuda a que el programa se autodocumente, y evita un número
excesivo de comentarios para aclarar el código.
Java distingue las mayúsculas de las minúsculas. Por ejemplo, Alumno y alumno son
variables diferentes.
No se suelen utilizar identificadores que comiencen con «$» o «_», además el símbolo
del dólar, por convenio, no se utiliza nunca.
No se puede utilizar el valor booleano (true o false) ni el valor nulo (null).
Los identificadores deben ser lo más descriptivos posibles. Es mejor usar palabras
completas en vez de abreviaturas crípticas. Así nuestro código será más fácil de leer y
comprender. En muchos casos también hará que nuestro código se autodocumente. Por
ejemplo, si tenemos que darle el nombre a una variable que almacena los datos de un
cliente sería recomendable que la misma se llamara algo así como FicheroClientes o
ManejadorCliente, y no algo poco descriptivo como Cl33.
Además de estas restricciones, en la siguiente tabla puedes ver otras convenciones, que no
siendo obligatorias, sí son recomendables a la hora de crear identificadores en Java.
Nombre de una
String, MiTipo
Comienza por letra mayúscula.
clase.
Nombre de modifica_Valor,
función. Comienza con letra minúscula.
obtiene_Valor
Autoevaluación
Un identificador es una secuencia de uno o más símbolos Unicode que cumple las
siguientes condiciones. Señala la afirmación correcta. Todos los identificadores
han de comenzar con una letra, el carácter subrayado (_) o el carácter dólar ($).
No puede incluir el carácter espacio en blanco.
Puede tener cualquier longitud, no hay tamaño máximo.
Todas las anteriores son correctas.
Palabras
boolean do if private this
clave en Java
catch break double implements protected throw
extends int
short byte else import public throws try
Normalmente, los editores y entornos integrados de desarrollo utilizan colores para diferenciar
las palabras reservadas del resto del código, los comentarios, las constantes y literales, etc. De
esta forma se facilita la lectura del programa y la detección de errores de sintaxis. Dependiendo
de la configuración del entorno se utilizarán unos colores u otros, es posible que los que utilice
tu versión de Netbeans se parezcan a éstos:
Puede que te interese cambiar los colores que utiliza Netbeans para la sintaxis de tus programas,
por ejemplo si quieres que los comentarios aparezcan en verde en lugar de en gris, o indicar que
tienes la autoría de los mismos, en lugar de que te aparezca el nombre de usuario del sistema
operativo. En la siguiente presentación puedes ver cómo se cambian los colores y las
propiedades de usuario en un proyecto Netbeans:
Variables. Sirven para almacenar los datos durante la ejecución del programa,
pueden estar formadas por cualquier tipo de dato primitivo o referencia. Su valor
puede cambiar varias veces a lo largo de todo el programa.
Constantes o variables finales. Son aquellas variables cuyo valor no cambia a lo
largo de todo el programa.
Autoevaluación
Relaciona los tipos de variables con la característica correspondiente,
escribiendo el número asociado a la característica en el hueco
correspondiente.
Ejercicio de relacionar
Las
Relación Tienen la característica de que …
variables...
El siguiente ejemplo muestra el código para la creación de varios tipos de variables. Como ya
veremos en apartados posteriores, las variables necesitan declararse, a veces dando un valor y
otras con un valor por defecto. Este programa crea una clase que contiene las siguientes
variables:
Variable constante llamada PI: esta variable por haberla declarado como constante no
podrá cambiar su valor a lo largo de todo el programa.
Variable miembro llamada x: Esta variable pertenece a la clase ejemplovariables. La
variable x puede almacenar valores del tipo primitivo int. El valor de esta variable podrá
ser modificado en el programa, normalmente por medio de algún otro método que se cree
en la clase.
Variable local llamada valorantiguo: Esta variable es local porque está creada dentro del
método obtenerX(). Sólo se podrá acceder a ella dentro del método donde está creada, ya
que fuera de él no existe.
En apartados posteriores veremos como darle más funcionalidad a nuestros programas, mostrar
algún resultado por pantalla, hacer operaciones, etc. Por el momento, si ejecutas el ejemplo
anterior simplemente mostrará el mensaje “GENERACIÓN CORRECTA”, indicando que todo
ha ido bien y el programa ha finalizado.
En la siguiente presentación puedes ver una demostración de cómo hemos creado este primer
programa:
Autoevaluación
El tipado fuerte de datos supone que:
A todo dato le corresponde un tipo que es conocido antes de que se ejecute el
programa.
El lenguaje hace un control muy exhaustivo de los tipos de datos. El
compilador puede optimizar mejor el tratamiento de los tipos de datos.
Todas las anteriores son correctas.
Debes conocer
En el siguiente enlace se muestran los tipos de datos primitivos en Java
con el rango de valores que pueden tomar, el tamaño que ocupan en
memoria y sus valores por defecto.
Hay una peculiaridad en los tipos de datos primitivos, y es que el tipo de dato char es
considerado por el compilador como un tipo numérico, ya que los valores que guarda son el
código Unicode correspondiente al carácter que representa, no el carácter en sí, por lo que puede
operarse con caracteres como si se tratara de números enteros.
Por otra parte, a la hora de elegir el tipo de dato que vamos a utilizar ¿qué criterio seguiremos
para elegir un tipo de dato u otro? Pues deberemos tener en cuenta cómo es la información que
hay que guardar, si es de tipo texto, numérico, … y, además, qué rango de valores puede
alcanzar. En este sentido, hay veces que aunque queramos representar un número sin decimales,
tendremos que utilizar datos de tipo real.
Por ejemplo, el tipo de dato int no podría representar la población mundial del planeta, ya que el
valor máximo que alcanza es de 2.147.483.647, siendo éste el número máximo de
combinaciones posibles con 32 bits, teniendo en cuenta que la representación de los números
enteros en Java utiliza complemento a 2. Si queremos representar el valor correspondiente a la
población mundial del planeta, cerca de 7 mil millones de habitantes, tendríamos que utilizar al
menos un tipo de dato long, o si tenemos problemas de espacio un tipo float. Sin embargo, los
tipos reales tienen otro problema: la precisión. Vamos a ver más sobre ellos en el siguiente
apartado.
Para saber más
Si quieres obtener información sobre cómo se lleva a cabo la
representación interna de números enteros y sobre la aritmética binaria,
puedes consultar el siguiente enlace:
Aritmética binaria
Entre cada dos números reales cualesquiera, siempre tendremos infinitos números reales, por lo
que la mayoría de ellos los representaremos de forma aproximada. Por ejemplo, en la aritmética
convencional, cuando dividimos 10 entre 3, el resultado es 3.3333333…, con la secuencia de 3
repitiéndose infinitamente. En el ordenador sólo podemos almacenar un número finito de bits,
por lo que el almacenamiento de un número real será siempre una aproximación.
Los números reales se representan en coma flotante, que consiste en trasladar la coma decimal a
la primera cifra significativa del valor, con objeto de poder representar el máximo de números
posible.
En concreto, sólo se almacena la mantisa y el exponente al que va elevada la base. Los bits
empleados por la mantisa representan la precisión del número real, es decir, el número de cifras
decimales significativas que puede tener el número real, mientras que los bits del exponente
expresan la diferencia entre el mayor y el menor número representable, lo que viene a ser el
intervalo de representación.
En Java las variables de tipo float se emplean para representar los números en coma flotante de
simple precisión de 32 bits, de los cuales 24 son para la mantisa y 8 para el exponente. La
mantisa es un valor entre -1.0 y 1.0 y el exponente representa la potencia de 2 necesaria para
obtener el valor que se quiere representar. Por su parte, las variables tipo double representan los
números en coma flotante de doble precisión de 64 bits, de los cuales 53 son para la mantisa y
11 para el exponente.
La mayoría de los programadores en Java emplean el tipo double cuando trabajan
con datos de tipo real, es una forma de asegurarse de que los errores cometidos por
las sucesivas aproximaciones sean menores. De hecho, Java considera los valores
en coma flotante como de tipo double por defecto.
Con el objetivo de conseguir la máxima portabilidad de los programas, Java utiliza el estándar
internacional IEEE 754 para la representación interna de los números en coma flotante, que es
una forma de asegurarse de que el resultado de los cálculos sea el mismo para diferentes
plataformas.
Autoevaluación
Relaciona los tipos primitivos con los bits y rango de valores
correspondientes, escribiendo el número asociado en el hueco
correspondiente.
Ejercicio de relacionar
Tipo Relación Característica
7
Entero de 8 bits, rango de valores de -128 (-2 ) a
int 7
+127 (+2 -1)
De esta forma, estamos declarando numAlumnos como una variable de tipo int, y otras dos
variables radio e importe de tipo double. Aunque no es obligatorio, hemos aprovechado la
declaración de las variables para inicializarlas a los valores 15, 3.14 y 102.95 respectivamente.
Si la variable va a permanecer inalterable a lo largo del programa, la declararemos como
constante, utilizando la palabra reservada final de la siguiente forma:
En ocasiones puede que al declarar una variable no le demos valor, ¿qué crees que ocurre en
estos casos? Pues que el compilador le asigna un valor por defecto, aunque depende del tipo de
variable que se trate:
Y también en este otro, ya que se intenta usar una variable local que podría no haberse
inicializado:
En el ejemplo anterior la instrucción if hace que si se cumple la condición que hay entre
paréntesis (cualquiera que indiquemos), entonces el programa asignará el valor 5 a la variable p;
sino se cumple la condición, p quedará sin inicializar. Pero si p no se ha inicializado, no tendría
valor para asignárselo a q. Por ello, el compilador detecta ese posible problema y produce un
error del tipo “La variable podría no haber sido inicializada”, independientemente de si se
cumple o no la condición del if.
Autoevaluación
De las siguientes, señala cuál es la afirmación correcta:
int[] arrayDeEnteros;
Cuenta cuentaCliente;
En la primera instrucción declaramos una lista de números del mismo tipo, en este caso, enteros.
En la segunda instrucción estamos declarando la variable u objeto cuentaCliente como una
referencia de tipo Cuenta.
Como comentábamos al principio del apartado de Tipos de datos, cualquier aplicación de hoy en
día necesita no perder de vista una cierta cantidad de datos. Cuando el conjunto de datos
utilizado tiene características similares se suelen agrupar en estructuras para facilitar el acceso a
los mismos, son los llamados datos estructurados. Son datos estructurados los arrays, listas,
árboles, etc. Pueden estar en la memoria del programa en ejecución, guardados en el disco como
ficheros, o almacenados en una base de datos.
Además de los ocho tipos de datos primitivos que ya hemos descrito, Java proporciona un
tratamiento especial a los textos o cadenas de caracteres mediante el tipo de dato String. Java
crea automáticamente un nuevo objeto de tipo String cuando se encuentra una cadena de
caracteres encerrada entre comillas dobles. En realidad se trata de objetos, y por tanto son tipos
referenciados, pero se pueden utilizar de forma sencilla como si fueran variables de tipos
primitivos:
Hemos visto qué son las variables, cómo se declaran y los tipos de datos que pueden adoptar.
Anteriormente hemos visto un ejemplo de creación de variables, en esta ocasión vamos a crear
más variables, pero de distintos tipos primitivos y los vamos a mostrar por pantalla. Los tipos
referenciados los veremos en la siguiente unidad.
Para mostrar por pantalla un mensaje utilizamos System.out, conocido como la salida estándar
del programa. Este método lo que hace es escribir un conjunto de caracteres a través de la línea
de comandos. En Netbeans esta línea de comandos aparece en la parte inferior de la pantalla.
Podemos utilizar System.out.print o System.out.println. En el segundo caso lo que hace el
método es que justo después de escribir el mensaje, sitúa el cursor al principio de la línea
siguiente. El texto en color gris que aparece entre caracteres // son comentarios que permiten
documentar el código, pero no son tenidos en cuenta por el compilador y, por tanto, no afectan a
la ejecución del programa.
La forma de declararlos es con la palabra reservada enum, seguida del nombre de la variable y
la lista de valores que puede tomar entre llaves. A los valores que se colocan dentro de las llaves
se les considera como constantes, van separados por comas y deben ser valores únicos.
La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una
especie de clase en Java, y todas las clases llevan su contenido entre llaves.
Al considerar Java este tipo de datos como si de una clase se tratara, no sólo podemos definir los
valores de un tipo enumerado, sino que también podemos definir operaciones a realizar con él y
otro tipo de elementos, lo que hace que este tipo de dato sea más versátil y potente que en otros
lenguajes de programación.
En el siguiente ejemplo puedes comprobar el uso que se hace de los tipos de datos enumerados.
Tenemos una variable Dias que almacena los días de la semana. Para acceder a cada elemento
del tipo enumerado se utiliza el nombre de la variable seguido de un punto y el valor en la lista.
Más tarde veremos que podemos añadir métodos y campos o variables en la declaración del tipo
enumerado, ya que como hemos comentado un tipo enumerado en Java tiene el mismo
tratamiento que las clases.
Tipos de Datos Enumerados en Java (14.00 KB)
Sin embargo, también podemos escribir varias líneas usando una única sentencia. Así lo
hacemos en la instrucción número 20, la cual imprime como resultado tres líneas de texto. Para
ello hemos utilizado un carácter especial, llamado carácter escape (\). Este carácter sirve para
darle ciertas órdenes al compilador, en lugar de que salga impreso en pantalla. Después del
carácter de escape viene otro carácter que indica la orden a realizar, juntos reciben el nombre de
secuencia de escape. La secuencia de escape \n recibe el nombre de carácter de nueva línea.
Cada vez que el compilador se encuentra en un texto ese carácter, el resultado es que mueve el
cursor al principio de la línea siguiente. En el próximo apartado vamos a ver algunas de las
secuencias de escape más utilizadas.
Caso práctico
Ada se encuentra con María y Juan.
A Ada le satisface la eficacia con que trabajan María y Juan, apenas ha comenzado
con el proyecto y pronto podrá ver resultados inmediatos.
Un literal, valor literal o constante literal es un valor concreto para los tipos de datos primitivos
del lenguaje, el tipo String o el tipo null.
Los literales booleanos tienen dos únicos valores que puede aceptar el tipo: true y false. Por
ejemplo, con la instrucción boolean encontrado = true; estamos declarando una variable de tipo
booleana a la cual le asignamos el valor literal true.
Las constantes literales de tipo long se le debe añadir detrás una l ó L, por ejemplo 873L, si no
se considera por defecto de tipo int. Se suele utilizar L para evitar la confusión de la ele
minúscula con 1.
Los literales reales o en coma flotante se expresan con coma decimal o en notación científica, o
sea, seguidos de un exponente e ó E. El valor puede finalizarse con una f o una F para indica el
formato float o con una d o una D para indicar el formato double (por defecto es double). Por
ejemplo, podemos representar un mismo literal real de las siguientes formas: 13.2, 13.2D,
1.32e1, 0.132E2. Otras constantes literales reales son por ejemplo: .54, 31.21E-5, 2.f,
6.022137e+23f, 3.141e-9d.
Un literal carácter puede escribirse como un carácter entre comillas simples como 'a', 'ñ', 'Z', 'p',
etc. o por su código de la tabla Unicode, anteponiendo la secuencia de escape ‘\’ si el valor lo
ponemos en octal o ‘\u’ si ponemos el valor en hexadecimal. Por ejemplo, si sabemos que tanto
en ASCII como en Unicode, la letra A (mayúscula) es el símbolo número 65, y que 65 en octal
es 101 y 41 en hexadecimal, podemos representar esta letra como '\101' en octal y '\u0041' en
hexadecimal. Existen unos caracteres especiales que se representan utilizando secuencias de
escape:
Secuencia de escape
Significado
Secuencia de escapeSignificado
Carácter comillas
\t Tabulador \''
dobles
Carácter comillas
\n Salto de línea
\'
simples
\f Salto de página
\\ Barra diagonal
Normalmente, los objetos en Java deben ser creados con la orden new. Sin
embargo, los literales String no lo necesitan ya que son objetos que se crean
implícitamente por Java.
Los literales de cadenas de caracteres se indican entre comillas dobles. En el ejemplo anterior
“El primer programa” es un literal de tipo cadena de caracteres. Al construir una cadena de
caracteres se puede incluir cualquier carácter Unicode excepto un carácter de retorno de carro,
por ejemplo en la siguiente instrucción utilizamos la secuencia de escape \’’ para escribir dobles
comillas dentro del mensaje:
Caso práctico
María y Juan tienen definidas las variables y tipos
de datos a utilizar en la aplicación. Es el momento
de ponerse a realizar los cálculos que permitan
manipular esos datos, sumar, restar, multiplicar,
dividir y mucho más. En definitiva se trata de
llevar los conocimientos matemáticos al terreno de
la programación, ver cómo se pueden hacer
operaciones aritméticas, lógicas o de comparación
en el
lenguaje Java. También necesitarán algún operador que permita evaluar una
condición y decidir las acciones a realizar en cada caso. Es importante conocer bien
cómo el lenguaje evalúa esas expresiones, en definitiva, cuál es la precedencia que
tiene cada operador.
El resultado de una expresión puede ser usado como parte de otra expresión o en una sentencia
o instrucción. Las expresiones, combinadas con algunas palabras reservadas o por sí mismas,
forman las llamadas sentencias o instrucciones. Por ejemplo, pensemos en la siguiente
expresión Java:
i+1
Con esta expresión estamos utilizando un operador aritmético para sumarle una cantidad a la
variable i, pero es necesario indicar al programa qué hacer con el resultado de dicha expresión:
suma = i + 1;
Que lo almacene en una variable llamada suma, por ejemplo. En este caso ya tendríamos una
acción completa, es decir, una sentencia o instrucción.
Más ejemplos de sentencias o instrucciones los tenemos en las declaraciones de variables, vistas
en apartados anteriores, o en las estructuras básicas del lenguaje como sentencias condicionales
o bucles, que veremos en unidades posteriores.
Como curiosidad comentar que las expresiones de asignación, al poder ser usadas como parte de
otras asignaciones u operaciones, son consideradas tanto expresiones en sí mismas como
sentencias.
Operador OperaciónExpresión
Java Java
Resultado
Resultado
--(decremental)
5-- // el resultado es 4
En el ejemplo vemos un programa básico que utiliza operadores aritméticos. Observa que
usamos System.out.printf para mostrar por pantalla un texto formateado. El texto entre dobles
comillas son los argumentos del método printf y si usamos más de uno, se separan con comas.
Primero indicamos cómo queremos que salga el texto, y después el texto que queremos mostrar.
Fíjate que con el primer %s nos estamos refiriendo a una variable de tipo String, o sea, a la
primera cadena de texto, con el siguiente %s a la segunda cadena y con el último %s a la
tercena. Con %f nos referimos a un argumento de tipo float, etc.
programa darle un valor a una variable, y ya hemos utilizado varias ocasiones en esta
unidad. Además de este operador, Java proporciona otros operadores de
asignación combinados con los operadores aritméticos, que permiten abreviar o
reducir ciertas expresiones.
Por ejemplo, el operador “+=” suma el valor de la expresión a la derecha del operador con el
valor de la variable que hay a la izquierda del operador, y almacena el resultado en dicha
variable. En la siguiente tabla se muestran todos los operadores de asignación compuestos
que podemos utilizar en Java
Orden printf
(x>y)?x:y;
Autoevaluación
Señala cuáles son los operadores relacionales en Java.
= =, ! =, >, <, > =, < =.
=, !=, >, <, >=, <=.
== , =!, >, <, =>, =<.
== , !=, >, <, >=, <=.
5.5.- Operadores lógicos.
Los operadores lógicos realizan operaciones sobre valores
booleanos, o resultados de expresiones relacionales, dando como
resultado un valor booleano.
& op1 & op2 Devuelve true si op1 y op2 son true
&& op1 && op2 Igual que &, pero si op1 es false ya no se evalúa op2
Ejemplo en
Operador Significado
Java
Realiza el complemento
~ ~op binario de op (invierte el valor
de cada bit)
Realiza la operación OR
| op1 | op2
binaria sobre op1 y op2
Realiza la operación
^ op1 ^ op2ORexclusivo (XOR) binaria
sobre op1 y op2
Operadores de bits
Para aplicar una operación a una variable de tipo String, escribiremos su nombre seguido de la
operación, separados por un punto. Entre las principales operaciones que podemos utilizar para
trabajar con cadenas de caracteres están las siguientes:
Creación. Como hemos visto en el apartado de literales, podemos crear una variable de
tipo String simplemente asignándole una cadena de caracteres encerrada entre comillas
dobles.
Obtención de longitud. Si necesitamos saber la longitud de un String, utilizaremos el
método length().
Concatenación. Se utiliza el operador + o el método concat() para concatenar cadenas de
caracteres.
Comparación. El método equals() nos devuelve un valor booleano que indica si las
cadenas comparadas son o no iguales. El método equalsIgnoreCase() hace lo propio,
ignorando las mayúsculas de las cadenas a considerar.
Obtención de subcadenas. Podemos obtener cadenas derivadas de una cadena original con
el método substring(), al cual le debemos indicar el inicio y el fin de la subcadena a
obtener.
Cambio a mayúsculas/minúsculas. Los métodos toUpperCase() y toLowerCase()
devuelven una nueva variable que transforma en mayúsculas o minúsculas,
respectivamente, la variable inicial.
Valueof. Utilizaremos este método para convertir un tipo de dato primitivo (int, long, float,
etc.) a una variable de tipo String.
A continuación varios ejemplos de las distintas operaciones que podemos realizar concadenas de
caracteres o String en Java:
10 / 2 * 5
Operador Tipo
Asociatividad
++ -- Unario, notación
Derecha
postfija
++ -- + -
Unario, notación
Derecha
prefija
(cast) ! ~
* / % Aritméticos Izquierda
+- Aritméticos Izquierda
== != Relacionales Izquierda
|| Lógico Izquierda
?: Operador condicional
Derecha
= += -= *=
Asignación Derecha
/= %=
Reflexiona
¿Crees que es una buena práctica de programación utilizar paréntesis en expresiones
aritméticas complejas, aún cuando no sean necesarios?
Caso práctico
María ha avanzado mucho en sus conocimientos
sobre Java y ha contado con mucha ayuda por
parte de Juan. Ahora mismo tiene un problema con
el código, y le comenta —Estoy atrancada en el
código. Tengo una variable de tipo byte y quiero
asignarle un valor de tipo int, pero el compilador
me da un error de posible pérdida
de precisión ¿tú sabes qué significa eso?. —Claro —le contesta Juan, —es un
problema de conversión de tipos, para asignarle el valor a la variable de tipo byte
debes hacer un casting. —¡Ah! —dice María, —¿y cómo se hace eso?
Imagina que queremos dividir un número entre otro ¿tendrá decimales el resultado de esa
división? Podemos pensar que siempre que el denominador no sea divisible entre el divisor,
tendremos un resultado con decimales, pero no es así. Si el denominador y el divisor son
variables de tipo entero, el resultado será entero y no tendrá decimales. Para que el resultado
tenga decimales necesitaremos hacer una conversión de tipo.
Las conversiones de tipo se realizan para hacer que el resultado de una expresión sea del tipo
que nosotros deseamos, en el ejemplo anterior para hacer que el resultado de la división sea de
tipo real y, por ende, tenga decimales. Existen dos tipos de conversiones:
Conversiones explícitas. Cuando hacemos una conversión de un tipo con más bits a un
tipo con menos bits. En estos casos debemos indicar que queremos hacer la conversión de
manera expresa, ya que se puede producir una pérdida de datos y hemos de ser
conscientes de ello. Este tipo de conversiones se realiza con el operador cast. El operador
cast es un operador unario que se forma colocando delante del valor a convertir el tipo de
dato entre paréntesis. Tiene la misma precedencia que el resto de operadores unarios y se
asocia de izquierda a derecha.
Debemos tener en cuenta que un valor numérico nunca puede ser asignado a una variable de un
tipo menor en rango, si no es con una conversión explícita. Por ejemplo:
int a; byte b; a = 12; // no se realiza conversión alguna b = 12; // se permite por del rango
permitido de valores para b b = a; // error, no permitido (incluso aunq almacenarse en un
byte) byte b = (byte) a; // Correcto, forzamos conversión ex
En el ejemplo anterior vemos un caso típico de error de tipos, ya que estamos intentando
asignarle a b el valor de a, siendo b de un tipo más pequeño. Lo correcto es promocionar a al
tipo de datos byte, y entonces asignarle su valor a la variable b.
Debes conocer
En el siguiente enlace viene información importante sobre cómo se
producen las conversiones de tipos en Java, tanto automáticas como
explícitas:
7.- Comentarios.
Caso práctico
Juan ha podido comprobar los avances que
ha hecho María con la programación. Ya
domina todos los aspectos básicos sobre
sintaxis, estructura de un programa, variables
y tipos de datos. Ada le acaba de comunicar
Los comentarios son muy importantes a la hora de describir qué hace un determina programa.d
A lo largo de la unidad los hemos utilizado para documentar los ejemplos mejorar lad
comprensión del código. Para lograr ese objetivo, es normal que ca programa comience conv
unas líneas de comentario que indiquen, al menos, una bre descripción del programa, el autorh
del mismo y la última fecha en que se modificado.
Comentarios Javadoc. Utilizaremos los delimitadores /** y */. Al igual que con l
comentarios tradicionales, el texto entre estos delimitadores será ignorado poro
compilador. Este tipo de comentarios se emplean para generar documentaci automática
del programa. A través del programa javadoc, incluido en JavaSE se recogen todos estos
comentarios y se llevan a un documento formato .html.
Reflexiona
Una buena práctica de programación es añadir en la última llave que
delimita cada bloque de código, un comentario indicando a qué clase o
método pertenece esa llave.
double N C C C C C C -
En cualquier caso, las conversiones de números en coma flotante a números enteros siempre
necesitarán un Casting, y deberemos tener mucho cuidado debido a la pérdida de precisión
que ello supone.
Cuando en una expresión hay datos o variables de distinto tipo, el compilador realiza la
promoción de unos tipos en otros, para obtener como resultado el tipo final de la expresión.
Esta promoción de tipos se hace siguiendo unas reglas básicas en base a las cuales se realiza
esta promoción de tipos, y resumidamente son las siguientes:
Tabla sobre
Conversiones de números en Coma flotante (float, double) a
Co enteros (int)
Cuando convertimos números en coma flotante a números enteros, Como un tip la parte
decimal se trunca (redondeo a cero). Si queremos hacer carácter, los otro tipo de redondeo,
podemos utilizar, entre otras, las siguientes sin signo.
funciones:
Ejemplo:
Math.round(num): Redondeo al siguiente número entero.
Math.ceil(num): Mínimo entero que sea mayor o igual a num.
Math.floor(num): Entero mayor, que sea inferior o igual a num.
double num=3.5; x=Math.round(num); // x = 4 int nu
y=Math.ceil(num); // y = 4 z=Math.floor(num); // z = 3 ‘A’ c =
Licencias de rec
Autoría: RambergMediaImages
Licencia: CC-by-sa
Procedencia:
7
http://www.flickr.com/photos/rmgimages/46602
Autoría: ytueresburroyyomemonto
Licencia: Uso educativo-nc
Procedencia: Montaje sobre
http://www.flickr.com/photos/ytueresburroyyomemonto/2
6947
Autoría: dullhunk
Licencia: Uso educativo-nc
Procedencia: Montaje sobre
http://www.flickr.com/photos/dullhunk/4833512699/
Autoría: 姒儿喵喵
Licencia: Uso educativo-nc
Procedencia: Montaje sobre
http://www.flickr.com/photos/crystaljingsr/3915512726/si
zes/z
Licencia: CC-by.
Procedencia: 7
http://www.flickr.com/photos/pschadler/493273
Autoría: aldoaldoz
Licencia: Uso educativo-nc-sa
Procedencia: Montaje sobre
http://www.flickr.com/photos/aldoaldoz/4165811238/
Autoría: HB
Licencia: CC-by-sa
Procedencia:
http://commons.wikimedia.org/wiki/File:Order_of_operations.svg