Está en la página 1de 89

1- Cuestiones básicas de Java

Concepto de programa
Un programa es un conjunto de instrucciones que indican a un procesador, que puede
o no estar en un ordenador, las acciones que debe ejecutar. Estas instrucciones están
expresadas en lenguaje o código máquina, único lenguaje que entienden los
procesadores.

Cada procesador tiene su propio código máquina de modo que si a un procesador le


llegan unas instrucciones asociadas a un programa no expresadas en su código máquina,
no es capaz de interpretarlas.

Analogía: el idioma. Si alguien se dirige a una persona en un idioma que desconoce, no


entiende lo que dice.

Estas instrucciones de código máquina son una serie de secuencias de bytes. Cada
byte se compone de 8 bits y un bit puede ser un 0 o un 1. Un bit es la unidad mínima de
información con la que es capaz de trabajar un procesador. Un ejemplo de byte podría ser
este: 10011010.

En resumen, un procesador se nutre de bytes o chorros de 0 y 1, agrupados de 8 en 8,


que representan las instrucciones de un programa. Cuando se interpretan y procesan se
obtiene el resultado deseado por el programador. ¿Cómo se crea un programa o
aplicación?. Con un lenguaje de programación.

Lenguajes de programación
Un lenguaje de programación es la herramienta utilizada para crear programas. Es un
conjunto de normas, instrucciones y códigos prefijados que permiten construir
programas capaces de ser interpretados por procesadores.

Es como el alfabeto de una lengua: para que una persona pueda comunicarse y
entenderse con otra debe aprender las vocales, las consonantes, su pronunciación, cómo
se unen letras para formar palabras inteligibles, cómo se agrupan palabras para formar
frases, etc. Este alfabeto y sus normas de aprendizaje cambian de una lengua a otra.

Ocurre lo mismo en los lenguajes de programación: para que un programador pueda


relacionarse con un procesador a través de un programa es necesario que aprenda las
reglas y características básicas del único idioma que entienden: su código máquina.

Lo que ocurre es que los programadores no suelen trabajar directamente con código
máquina porque hay muchos tipos (tantos como procesadores) y, además, porque se
programa con un lenguaje muy distinto al que habitualmente se emplea (recordar que las
instrucciones de código máquina se expresan en bytes). Para evitar estos dos problemas
se emplean los lenguajes de programación de alto nivel.

Leng de programación de alto nivel y de bajo nivel


Un lenguaje de alto nivel se compone de palabras, generalmente inglesas, entendibles
por los humanos. Su principal característica es que las instrucciones asociadas a los
programas creados con ellos no trabajan directamente con el procesador, sino que
previamente deben pasar a través de un filtro o compilador que las prepara
adecuadamente para que el procesador sepa interpretarlas.

Ejemplos: Java, Visual Basic, Visual Basic.NET, C, C++, C#, Pascal, Cobol, SmallTalk,
Delphi, Perl, Python, etc.

En cambio, un lenguaje de bajo nivel trabaja con instrucciones directamente


interpretables por un procesador.

Ejemplo: Ensamblador.

Las instrucciones asociadas a programas creados con lenguajes de alto nivel deben
transformarse en instrucciones de código máquina para que el procesador pueda
interpretarlas; esto se hace con un compilador (es el filtro mencionado anteriormente).

Así, un compilador es un programa que

• Comprueba el cumplimiento de una serie de normas que deben cumplir las


instrucciones de un programa.

• Transforma dichas instrucciones expresadas en lenguajes de alto nivel en


instrucciones de código máquina directamente ejecutables por un procesador.

Ocurre que cada procesador tiene distinto código máquina y un programa compilado para
un determinado procesador no vale para otro (una novela española no se entiende en
China a no ser que se traduzca).
Con los programas que se quieren ejecutar en máquinas que no tienen el mismo
procesador ocurre lo mismo. De esto se deduce que se deben tener tantos compiladores
como procesadores distintos se tengan y volver a compilar el programa.

Esto es un engorro y una limitación que Java ha resuelto mediante la JVM (Java Virtual
Machine) o Máquina Virtual de Java o Intérprete de Java.

La JVM es un programa capaz de crear, a partir de código Java compilado, que


recibe el nombre de código de bytes o Java bytecode, el código máquina nativo
asociado al procesador con el que se está trabajando.

En la analogía de la novela se podría decir que la JVM sería un traductor mágico capaz de
traducir una novela escrita en cualquier lengua, a nuestra lengua materna.

NOTA: la inclusión de la JVM entre el compilador y el micro va en detrimento de la velocidad de


ejecución y rapidez de interacción con el usuario, por lo que Java es un lenguaje lento en relación a
otros como C++, por ejemplo

En función de lo que se considere prioritario para una aplicación se optará por un lenguaje
u otro
Arquitectura ordenador + sistema operativo
Hablando a nivel de ordenador, además del procesador debe considerarse el
sistema operativo (s.o. a partir de ahora) que trabaja en él.

El código máquina asociado a un procesador de un ordenador depende del s.o. que


tenga instalado; así, si se dispone de dos ordenadores con el mismo procesador pero
con dos s.o. distintos (Windows y Linux, por ejemplo) y se realiza un programa que
se compila usando el compilador asociado al primer ordenador (monta Windows),
este programa, ya compilado, no podría ejecutarse en el segundo ordenador (monta
Linux).

Si se desea ejecutar debería compilarse con el compilador asociado al segundo


ordenador. Esto significa que el programa no es portable o multiplataforma. En Java,
mediante la JVM, se ha conseguido que todos los programas sean portables o
multiplataforma.

En cambio, si se utiliza Java:


Plataforma
Es todo entorno físico o lógico sobre el que se puede ejecutar un programa o
aplicación. La mayoría de plataformas actuales combinan un ordenador y un s.o.
Actualmente se cuenta con dos tipos:

• Entorno o plataforma PC: ordenadores con una arquitectura interna que


sigue unos parámetros de diseño creados por IBM hace 20 años y a un s.o.
(Windows 95, 98, 2000, NT, XP, Linux, Unix, Solaris, AIX de IBM, HP-UX de
Hewlett-Packard , etc.).

• Entorno o plataforma MAC: ordenadores con unas características de diseño


internas definidas por Apple y a un s.o. llamado Mac o.s., etc.

Hay que señalar que no es preciso disponer de un ordenador para ejecutar un


programa Java, basta con diseñar máquinas virtuales adecuadas para esos
dispositivos y un mecanismo para introducir el código de bytes (habitualmente
Internet). En la actualidad, la programación en entornos no PC ni Mac, es una parte
muy importante de Java, y además en continua evolución y desarrollo. El nombre que
recibe dicha parte es Jini. Para más información www.jini.org

Así, por ejemplo, existen televisores interactivos, teléfonos celulares, relojes, cadenas
de música, electrodomésticos, etc. en las que puede ejecutarse un programa Java.

Una cadena de música con este procesador y conectada a Internet permitiría


escuchar directamente archivos mp3 almacenados en páginas web o escuchar
conciertos en directo independientemente del lugar donde se desarrolle el mismo,
una lavadora podría ejecutar una secuencia de lavado indicada por el usuario estando
éste en otro país, un microondas podría ponerse en marcha de forma remota, un
aparato de aire acondicionado podría controlarse también remotamente etc.

<< ^ >>
1- Cuestiones básicas de Java Indice Software Java
Si desea obtener un acceso sin restricciones a los contenidos del curso y disfrutar de todas las
herramientas del aula virtual (Videos explicativos streaming, acceso a los foros, chat, ejercicios
resueltos, la ayuda del tutor, audioconferencia, estudio de grabación, test y actividades de
autoevaluación, etc...) puede inscribirse completamente gratis y comenzar a realizar de forma
inmediata el curso hasta la cuarta unidad.

Software Java
J2SE (Java 2 Standard Edition)

Es el conjunto de herramientas software que permite el desarrollo y la


ejecución de programas Java destinados al lado cliente. Se le suele llamar SDK
(Software Development Kit) o Kit de Desarrollo de Programas.

Es gratuito y de libre distribución. Se puede descargar desde la página oficial de


Sun Microsystems relacionada con Java http://java.sun.com.

Sun Mycrosystems es la empresa americana que creó el lenguaje de programación


Java allá por el año 1995. Se promocionan diciendo que son el punto en las empresas
puntocom y abogan por escribir código que cumpla la premisa "Write Once, Run
Anywhere" que podría traducirse como "Escribe código una vez donde tu quieras y
ejecútalo cuantas veces quieras donde tú quieras, sin ningún retoque ni
recompilación".

Dentro del J2SE se incluyen el compilador y la JVM (Java Virtual Machine) o


Máquina virtual de Java. También se la conoce como Intérprete de Java.
Cada plataforma tiene su propia versión. En la página de Java dentro de Sun puede
descargarse el J2SE para Windows, Linux, Solaris, etc. Si se trabaja con sistemas
operativos menos corrientes como MacOS de Apple, AIX de IBM, HP-UX de Hewlett-
Packard, etc. conviene ir a http://lopica.sourceforge.net/vm.html

Además, se tienen distintas versiones; la más moderna es la J2SE1.4.X. En el curso


se va a trabajar con la versión 1.4.1 (se recomienda un mínimo de 128 MB
de RAM). Si se cuenta con menos RAM, conviene instalarse cualquiera de las
versiones 1.3. El curso puede seguirse sin ningún problema con cualquiera de las
versiones. Ambas forman parte de la llamada plataforma Java2 (constituye la
versión moderna del lenguaje). Antes de estas versión se tuvieron la 1.2.2, la
1.2.1, la 1.1., etc.

Aparte del J2SE, se dispone de dos herramientas más para crear aplicaciones Java.
En vez de emplear la palabra herramientas, se va a utilizar la palabra plataforma ya
que es la recomendada por Sun. Pues bien, además de J2SE la comunidad Java
cuenta con las plataformas:
J2EE (Java 2 Enterprise Edition)

Plataforma del lenguaje Java destinada al desarrollo de aplicaciones


empresariales estructuradas típicamente en tres capas: capa de presentación
de datos, capa de lógica de negocio y capa de datos persistentes (bases de
datos). Se compone de un conjunto de estándares y bibliotecas Java que permiten la
creación de las aplicaciones empresariales anteriormente citadas. Esta plataforma se
utiliza sobre todo para programación en servidores. Sin conocer lo fundamental de
J2SE, resulta inviable introducirse en J2EE.

J2ME (Java 2 Micro Edition)

Plataforma del lenguaje Java destinada al desarrollo de aplicaciones para


pequeños dispositivos móviles de memoria limitada, poca capacidad de
procesamiento y con interfaces gráficas limitadas. Típicamente teléfonos móviles,
PDAs (Personal Assistent Digital), Pockets PCs, televisiones, relojes, sistemas de
ayuda para automóviles, tarjetas, etc. Como en J2EE, la base para programar
mediante J2ME, es J2SE.

Descarga del SDK


• Acceder a http://java.sun.com y pulsar el enlace J2SE (Core/Desktop) de la
sección central

• A continuación, Core Java de

• Después, se selecciona la versión más moderna que no sea beta

• Luego, el enlace indicado en rojo


• Finalmente, enlace Download J2SE SDK

• Se muestra un contrato, se acepta, botón Continue y en la sección Windows


Platform pulsar el enlace señalado

NOTA: el otro enlace "Windows Installation, Multi-language" es para instalarlo


estando conectado a Internet.

Si se trabaja con otras plataformas distintas de Windows se seleccionará la que


corresponda

Pulsado el enlace, aparecerá la ventanita de Guardar. Una vez descargado el exe, se


ejecutará y se abrirá un asistente de instalación. El proceso es muy sencillo: hay que
decir a todo que sí y seleccionar las opciones por defecto.

Finalizada la instalación, se creará colgando del disco duro un directorio


c:\j2sdk1.4.X_XX

Con esto no basta para poder compilar y ejecutar código Java. Es necesario
configurar adecuadamente el sistema.

¿Cómo?

Hay que agregar a la variable del sistema Path, la ruta del directorio
c:\j2sdk1.4.X_XX\bin

En Windows 2000, NT, Millenium y XP, picar con el derecho en Mi PC y seleccionar


Propiedades. Luego, pestaña Opciones avanzadas, botón Variables de entorno y doble
clic en la variable del sistema Path. Hecho esto, se agrega la ruta indicada al final de
la última existente, separada por un punto y coma.
En mi máquina (monta WXP Professional) el valor de la variable Path es

%SYSTEMROOT%\SYSTEM32;%SYSTEMROOT%;%SYSTEMROOT%\SYSTEM32\WBEM
;C:\J2SDK1.4.1_01\BIN

Todo este proceso se explica en el siguiente vídeo. La primera parte del vídeo
corresponde a la descarga ya explicada y actualizada. Lo importante del vídeo viene
después, es decir, en la instalación y configuración. Es fundamental la parte de
CONFIGURACIÓN. Además, se explica como realizar la configuración en
Windows 98.

<< ^ >>
Arquitectura ordenador + Indice Programa Java
sistema operativo

Programa Java
Un programa o aplicación Java se compone de un conjunto de clases que contienen
variables de diversos tipos utilizadas para almacenar datos, y métodos que
implementan código capaz de manipular dichas variables y crear objetos o
instancias de clase, que permitan la interacción con otros métodos y variables de
esas clases.

El punto de inicio de todo programa Java es el código asociado al método main


(principal en inglés), es como la puerta de entrada del programa, lo primero que se
ejecuta.

A la clase que contiene al método main se la llama clase principal.

Las clases y métodos van entre llaves {} y al final de una instrucción o declaración de
variable debe escribirse un punto y coma (;). Se utilizan tabuladores para sangrar las
líneas de código con el fin de facilitar su legibilidad, aunque si se omiten no pasa
nada.

Ejemplo:
Este programa consta de una clase de nombre PrimerSaludo, no declara ninguna
variable y cuenta con dos métodos de nombres main y mostrarMensaje. En
programas más complejos, se tendrán varias clases, en cada clase habrá muchos
métodos y declaraciones de variables, dentro de los métodos se declararán también
variables, etc. Por el momento, con esta sencilla clase nos conformaremos. Se va a
explicar ahora cada una de sus líneas.

La primera línea es la definición de una clase, la segunda es el método main o punto de


entrada del programa (siempre se define de esta forma), la tercera es una instrucción
o sentencia que muestra por la consola del DOS el mensaje entrecomillado, la cuarta
sirve para crear un objeto de la clase llamado ps mediante el que se llama o invoca a
otros métodos de la clase, la quinta es la llamada mediante el objeto ps al método
mostrarMensaje(), la sexta muestra por consola el mensaje entrecomillado. Luego
aparece la definición del método mostrarMensaje() cuyo código hace que se muestre
por consola el mensaje entrecomillado. Después de compilar y ejecutar este programa
va a mostrarse por consola lo siguiente:

Por consola:

Hola Jesus

Primera clase del curso de Java

FIN DEL PROGRAMA

A continuación se van a explicar qué son los métodos:

Es una de las herramientas fundamentales de cualquier lenguaje orientado a objetos.


Contienen código que persigue una serie de objetivos. En el ejemplo anterior, la clase
contenía dos métodos y sus objetivos eran:

• Objetivos del método main: mostrar un mensaje por consola, crear un objeto
de la clase PrimerSaludo, invocar al método mostrarMensaje mediante el objeto
anterior y mostrar otro mensaje por consola. Aparte de estos objetivos, el
fundamental y más importante es servir como punto de inicio de la ejecución
del programa.

• Objetivos del método mostrarMensaje: mostrar un mensaje por consola.

El programador, aparte de crear sus propios métodos como en el código anterior,


puede utilizar los que forman parte de la API (Application Programming
Interface) estándar de Java. La API se estudiará en siguiente sección.

DECLARACIÓN GENÉRICA DE UN MÉTODO: tiene la siguiente estructura

<modificadores de acceso> <tipo de dato de retorno> <nombre del método>(tipo1


arg1,tipo2 arg2,...){

Cuerpo del método;


}

Explicación de cada uno de los componentes de un método:

• Nombre del método: el que desee el programador.

• Número y tipo de argumentos asociados al método (tipo1 arg1,tipo2


arg2,...): constituye su firma. Los argumentos pueden ser tanto variables
primitivas como variables referenciadas. Más adelante se estudiarán estos dos
tipos de variables. Por el momento, basta saber que las variables primitivas se
emplean para almacenar números, caracteres o valores lógicos, mientras que
las referenciadas están asociadas a objetos de clases.

• Tipo de dato de retorno o tipo de dato que devuelve el método:

• Dato asociado a una variable primitiva.

• Dato asociado a una variable referenciada.

• void. Es lo que debe ponerse cuando el método no devuelve nada y, por


ejemplo, simplemente muestra por consola un mensaje. Es el caso del método
"void mostrarMensaje()" del código anterior.

• Modificadores de acceso: public, private, protected y sin modificador. Sirven


para fijar el grado de accesibilidad de un método. Además de los de acceso, se
tienen otros como static, synchronized, final, abstract, etc. que afectan de un
determinado modo al método. Todos se irán estudiando a lo largo del curso.

• Cuerpo del método: código asociado al método.

NOTA 1: los argumentos asociados a un método se consideran variables locales, es


decir, accesibles sólo desde el cuerpo del método.

NOTA 2: la palabra clave o reservada return se emplea para truncar la ejecución de


un método cuando el tipo de dato que devuelve es void o para obtener lo que
devuelve en el caso de que no sea void. Suele aparecer al final del método. En Java,
las palabras clave tienen un significado especial para el compilador y no pueden
utilizarse como nombres de clases, métodos o variables. Se irán viendo durante el
curso. Hay unas 50. A título de ejemplo, todos los nombres de variables primitivas
como byte, short, int, long, etc. son palabras clave. También los modificadores de
acceso, la palabra class, etc.

Escribir un programa Java


Se usará un editor de texto cualquiera que no aplica ningún formato al texto
escrito. Para seguir el curso se recomienda el Bloc de Notas
(Inicio/Programas/Accesorios/Bloc de notas). Su ejecutable es notepad.exe y se
encuentra en la carpeta Windows tanto en W98 como en WXP. Se creará una
carpeta cursojava colgando del disco duro para guardar todos los ejemplos y
ejercicios. Colgando de cursojava se creará, para este primer tema, una
subcarpeta tema1 donde se almacenarán los códigos fuente de este tema. Más
adelante se explicará cómo utilizar un IDE (Integrated Development
Environment o Entorno de Desarrollo Integrado), que facilita la escritura de
código, además de su compilación y ejecución. Se empleará JCreator. Como digo, se
introducirá más adelante.

1) Escritura del código asociado al programa usando el editor:

Luego, se guarda con el mismo nombre que la clase principal, si dicha clase va
precedida del modificador de acceso "public" o con el que se quiera, si la clase
principal no tiene modificador de acceso. Después del nombre se le añade la
extensión java. Al fichero de extensión java guardado se le llama código fuente.

2) Compilación del código fuente:

Desde la consola del DOS y estando en la carpeta o directorio donde se ha guardado


el código fuente se teclea

javac <nombre del código fuente incluyendo su extensión>

Ejemplo: si el código fuente está guardado en C:\cursojava\tema1

C:\cursojava\tema1>javac PrimerSaludo.java

Después de compilar hay dos posibilidades:

• Se producen errores de compilación: en este caso aparecen por consola


todos los errores indicando el nombre del código fuente, el número de línea
donde se ha producido el error, el mensaje asociado al error y la línea de código
causante del mismo (el indicador ^ señala el lugar exacto del error).

¿Qué se hace?

Se vuelve al código fuente, se tratan de subsanar todos los errores y se recompila


hasta que no se produzca ningún error.

• No se producen errores de compilación: en este caso el código fuente


está disponible para ser ejecutado. Se habrán generado en la misma
carpeta donde se ha guardado el código fuente tantos ficheros de
extensión class como clases tenga dicho código y con el mismo nombre
(estos class constituyen el código de bytes o Java bytecode). De estos
ficheros class se nutre la JVM o máquina virtual de Java para generar el código
máquina nativo del procesador de trabajo. El class más importante es el
asociado a la clase principal, es decir, aquella que contiene el método main,
ya que se utiliza para la ejecución del código

3) Ejecución del código compilado:

Desde la consola del DOS y estando en la misma carpeta en la que se guardó el


código fuente (en ella también están todos los class) se teclea
java <nombre de la clase principal sin incluir su extensión>

En el caso del ejemplo anterior:

C:\cursojava\tema1>java PrimerSaludo

Justo después de hacer esto, se genera el código nativo, el procesador lo interpreta y


procesa y se obtiene el resultado de la ejecución.

Esquema gráfico del proceso:

Si, después de haber compilado un código fuente sin errores y obtener los
correspondientes ficheros class, se ejecuta y aparece por consola el siguiente
mensaje:

Exception in thread main java.lang.NoClassDefFoundError

significa que se ha producido un error de ejecución. A la máquina virtual no le


llega el class asociado a la clase principal del código fuente

Posibles causas:

• Nombre del fichero class que debe ejecutarse no tiene el mismo nombre que la
clase principal (aquella que contiene al método main, es decir, al punto de
entrada al programa).

• Se ha escrito la extensión class a continuación del nombre de la clase principal


al tratar de ejecutar el programa.

• El fichero class que se pretende ejecutar no tiene clase principal.


Notas básicas de Java
NOTA 1 BÁSICA

Un código fuente Java sólo puede tener una clase con el modificador de
acceso public. Si el modificador de la clase es public, el código fuente debe
tener el mismo nombre que la clase.

Todos los códigos se guardarán en c:\cursojava\tema1

Ejemplo 1:

Si se guarda el código Java en un fichero con un nombre distinto al de la clase y se


intenta compilar, se produce error.

Ejemplo 2:

Si se guarda el código Java en un fichero con el nombre de una de las clases y se


intenta compilar, se produce error.

NOTA 2 BÁSICA

Si un código fuente Java tiene varias clases, lo habitual es que sólo una de
ellas cuente con método main. Se verá en el tema de sockets que, a veces,
puede resultar cómodo contar con dos métodos main en dos clases de un
mismo código fuente. Por el momento, se trabajará con un sólo método
main. Si hubiera varios definidos en clases del mismo código fuente, sólo se
ejecuta uno de ellos; el resto no se ejecuta.

La pregunta es: ¿qué método main va a ejecutarse?


La respuesta es: el asociado a la clase principal; esta clase principal la define el
programador cuando ejecuta el código con: java <clase_principal>.

Ejemplo:

El fichero donde se guarda el código Java debe llamarse "Primera.java" pues es la


clase pública del código. El programador puede controlar qué clase va a ser la
principal, es decir, qué clase va a contener el método main, desde la consola del DOS
. El resto de métodos main no se tendrán en cuenta.

Si desde la consola, y después de compilar con "javac Primera.java" se ejecuta con:

java Primera =>Por consola: Esta es la clase Primera

Si java Segunda => Por consola: Esta es la clase Segunda

Si java Tercera => Por consola: Esta es la clase Tercera

NOTA 3 BÁSICA

Un código fuente Java no tiene por qué tener clase principal (aquella que
contiene el método main o punto de entrada del programa).

Ocurrirá lo siguiente: se podrá compilar pero no ejecutar (error de


ejecución). El programa carece de punto de entrada.

Se utilizan para recibir llamadas de otras clases, mediante la creación desde


la clase llamante de un objeto de la clase a la que se invoca.

Ejemplo:
NOTA 4 BÁSICA

Una clase Java puede comunicarse con clases que no se encuentran en su


código fuente mediante la creación de objetos adecuados.

Lo que debe hacerse es crear un objeto de la clase a la que se quiere acceder


utilizando el nombre de la clase y la palabra reservada new.

Mediante este objeto se tiene acceso a los métodos y variables de instancia


no privadas de esa clase. Se verá en los siguientes temas las características
de una "variable de instancia" y el modificador de acceso aplicable a
variables y métodos "private". Por el momento, sobre las variables de
instancia, bastará con saber que se declaran después de la clase y fuera de
cualquier método, y que tienen alcance global.

Ejemplo: cada clase se guardará en un código fuente distinto.

Por consola:

225

Has calculado el cuadrado de un numero


FIN DEL PROGRAMA

NOTA 5 BÁSICA

Para acceder a los métodos y variables de instancia definidos en una clase


desde su metodo main se hace lo mismo que en la nota anterior, es decir, se
crea un objeto de esa clase y mediante ese objeto se llama a los métodos y
variables de instancia que interesen. No importa que sean privados.

Ejemplo:

Por consola:

225

Has calculado el cuadrado de un numero

FIN DEL PROGRAMA

NOTA 6 BÁSICA

El anterior programa también se puede codificar utilizando únicamente el


método main:

Ejemplo:
Por consola:

225

Has calculado el cuadrado de un numero

FIN DEL PROGRAMA

Esta última forma de programar se emplea cuando el programa es sencillo. Lo


habitual es que un programa se componga de varias clases en distintos códigos
fuente y que cada clase tenga varios métodos y variables de instancia. Para explicar
tipos de variables, bucles, estructuras condicionales y conceptos básicos de
programación se empleará una clase y sólo el método main. Cuando se hagan
programas más complejos se emplearán varias clases y varios métodos en cada
clase. El enfoque más orientado a objetos del programa desarrollado en las notas 4,
5 y 6 es, sin duda, el de la nota 4. La clase SinMetodoMain, mediante el método "int
calcularCuadrado(int numero)" calcula un entero siempre y cuando reciba a través de
su argumento otro.

Esta clase puede ser utilizada por cualquier programador Java en el momento que lo
necesite el desarrollo de su programa. Es una práctica habitual en el diseño de una
aplicación Java utilizar clases creadas por otros programadores.

SUN (Standford University Network), empresa creadora de Java, pone a


disposición de los programadores, con el objetivo de que les sirva de apoyo para el
desarrollo de sus propias aplicaciones, una biblioteca de clases e interfaces,
estructuradas en paquetes (packages), con multitud de métodos y variables de
campo estáticas.

Esta biblioteca recibe el nombre de API (Application Programming Interface o


Interfaz de programación para crear aplicaciones), y todo programador tiene
que aprender a trabajar con ella porque es fundamental para poder desarrollar
aplicaciones en Java.

A continuación, tres vídeos en los que se explican la descarga e instalación de la API,


la estructura y manejo de la API y el uso de métodos y variables de campo estáticas
de la API.

Respecto a la descarga de la API, los pasos a seguir son los mismos que cuando se
descarga el SDK

• Acceder a http://java.sun.com y pulsar el enlace J2SE (Core/Desktop) de la


sección central
• A continuación, Core Java de

• Después, se selecciona la versión más moderna que no sea beta

• Luego, el enlace indicado en rojo

• Finalmente, sección Documentation, enlace DOWNLOAD, se acepta el contrato y


se descarga el .zip asociado a la API

Este zip se suele descomprimir en el directorio de instalación del SDK, j2sdk_home, a


partir de ahora. Hecho esto, aparecerá un directorio docs colgando de j2sdk_home.
Dentro de docs, abrir el index.html, luego enlace "API & Language" y, a
continuación, enlace "Java 2 Platform API Specification (NO FRAMES)".

Finalmente, se agregará a Favoritos una entrada que apunte al htm anterior.


Esto mismo, es lo que se cuenta en el vídeo "Descarga e Instalación de la API".

Este vídeo es muy importante. Se recomienda reproducirlo íntegramente

Este otro también.

Si desea obtener un acceso sin restricciones a los contenidos del curso y disfrutar de todas las
herramientas del aula virtual (Videos explicativos streaming, acceso a los foros, chat, ejercicios
resueltos, la ayuda del tutor, audioconferencia, estudio de grabación, test y actividades de
autoevaluación, etc...) puede inscribirse completamente gratis y comenzar a realizar de forma
inmediata el curso hasta la cuarta unidad.

NOTA 7 BÁSICA

Reglas para los nombres de clases, métodos y variables:

• El primer carácter debe ser una letra, el carácter subrayado (_) o el símbolo $ y
no otra cosa. Tras el primer carácter, el nombre puede estar compuesto de
letras o de números pero no de espacios en blanco ni tabuladores.

• En las clases, por convenio, el nombre comienza con mayúscula. Si tiene varias
palabras la primera letra de cada palabra será también mayúscula.

• En los métodos y variables, por convenio, el nombre comienza con minúscula.


Si tienen varias palabras la primera letra de la segunda, tercera... palabras
llevará mayúscula.

• Java diferencia entre mayúsculas y minúsculas, es case-sensitive.

• No pueden usarse como nombre palabras reservadas o clave de Java (Java las
emplea para los tipos de variables, instrucciones, modificadores de acceso,
operadores, etc. propios del lenguaje). Tampoco se permite la ñ.

• No suelen utilizarse acentos (provocan error de ejecución).

• Los nombres deben ser lo mas representativos de las tareas que ejecutan y de
los valores que almacenan, para que resulte cómoda la lectura del código a
otras personas o incluso a los propios programadores creadores del código una
vez transcurrido un cierto tiempo.

NOTA 8 BÁSICA

Dentro de una clase, para acceder a un método desde otro que no es el main
o no es un método estático, basta con llamar al método directamente. No es
necesario crear un objeto o instancia de la clase.

Ejemplo:
Por consola:

Estas en el método mostrarSaludo

Estas en el método saludoBienvenida

Bienvenido amig@

Has vuelto al método mostrarSaludo

FIN DEL PROGRAMA

Empleo del operador +


Ejemplo 1: en este código, una cadena de texto se concatena con un número entero
almacenado en una variable primitiva de tipo int. Internamente lo que ocurre es que
el número 10 asociado a la variable entera se convierte automáticamente en la
cadena de texto "10", y lo que hace el + es sumar dos cadenas de texto

Por consola:

El valor de entero1 es 10

Ejemplo 2: las líneas 5 y 6 habitualmente se escriben en una sola línea. Aquí se ha


optado por desdoblarla en dos por cuestiones de diseño del formato interno del curso.
Así, la línea que se muestra a continuación equivale a las dos citadas:

System.out.println("El valor de entero1 es "+entero1+" y el de entero2 es


"+entero2);
Por consola:

El valor de entero1 es 10 y el de entero2 es 25

Ejemplo 3: las líneas en verde son comentarios. Se utilizan para explicar y aclarar
líneas de código. Se analizarán en temas posteriores. El compilador no los tiene en
cuenta.

Por consola:

La suma de 10 y 25 es 35

Ejercicios

Ejercicio 1
Realizar un programa Java que calcule el cuadrado de una suma, el de una diferencia
y que muestre el mensaje siguiente: "Has calculado el cuadrado de una suma y el de
una diferencia. Eres un mossstruo". Utilizar los números 3 y 2 para los cálculos.

Por consola en las tres soluciones:

25

Has calculado el cuadrado de una suma y el de una diferencia. Eres un mossstruo

Debéis hacerlo de las tres formas distintas que se explicaron en las notas 4, 5 y 6:
1. Utilizando cuatro clases públicas asociadas a otros tantos códigos fuente con los
siguientes nombres:

Clase principal: EjercicioBasico01. Contendrá al método main y dentro del mismo se


crearán los objetos adecuados para acceder a los métodos de otras clases.

Clase segunda: CuadradoSuma. Deberá tener un método llamado


calcularCuadradoSuma que devolverá un entero y recibirá dos enteros a través de
dos argumentos. Para obtener el valor que devuelve un método se empleará la
palabra reservada return.

Clase tercera: CuadradoDiferencia. Deberá tener un método llamado


calcularCuadradoDiferencia que devolverá un entero y recibirá dos enteros a través
de sus dos argumentos.

Clase cuarta: Conclusion. Deberá tener un método llamado mostrarConclusion que


mostrará por consola el mensaje del enunciado.

2. Utilizando una clase principal que llamaréis EjercicioBasico02 que, aparte del
método main, incluya los métodos descritos anteriormente.

3. Utilizando una clase principal que llamaréis EjercicioBasico03 que sólo contenga
al método main.

Todos los códigos se guardarán en c:\cursojava\tema1

2-Tipos y alcance de variables. Casting. Estructuras de


programación. Clases envoltorio
NOTA: antes de continuar, se va a aconsejar un IDE para escribir, compilar y ejecutar código Java.
Conviene no olvidar que el objetivo del curso es aprender Java, no el manejo de un software que
permite trabajar con código Java de un modo más o menos automático. No obstante, es una
opinión bastante compartida que un IDE facilita la realización de estas tareas y hace perder menos
tiempo al programador en cuestiones no directamente relacionadas con la creación de código,
como teclear javac ... cada vez que se quiere compilar, teclear java ... cada vez que se quiere
ejecutar, consultar la API porque no se recuerda el nombre de un método, etc.

IDE de trabajo recomendado: JCreator. Hay dos versiones:

• JCreator LE version: versión limitada. Es gratuita y descargable desde


www.jcreator.com, sección Download

• JCreator PRO versión: versión profesional. Es de pago. Dispone de


herramientas que permite la autocompletación de código

Concepto de variable
Una variable es un contenedor de bits que representan a un valor. Se emplean
para almacenar datos que pueden cambiar durante la ejecución de un
programa. En función de los datos que almacenan se clasifican en:

• Variables primitivas: almacenan datos numéricos, valores lógicos o


caracteres.

• Variables referenciadas: asociadas a objetos o instancias de una clase. Por


ejemplo, para almacenar cadenas de caracteres se empleará una variable
referenciada asociada a la clase String, para almacenar información sobre la
fecha actual, otra asociada a la clase Date, etc. Se estudiarán más adelante.

Además de estos dos tipos de variables se estudiarán los arrays de variables


primitivas y de variables referenciadas. Un array, como se verá en el tema
correspondiente, es una variable referenciada asociada a la clase Object (clase madre
de todos los objetos Java).

Se va a profundizar un poco más en el concepto de variable: como se ha comentado


anteriormente, no es nada más que un contenedor de bits que representan a un
valor. Ocurre lo siguiente:

• En el caso de variables primitivas, los bits representan un número


entero que coincide con el valor de la variable, con lo que se va a trabajar
a lo largo del programa. Por ejemplo, se tienen variables de tipo byte (utilizan 8
bits en memoria) que pueden almacenar números enteros comprendidos entre -
128 y 127, de tipo int (utilizan 32 bits en memoria) para almacenar enteros
entre, aproximadamente, -2150 millones y 2150 millones, de tipo float para
números decimales, etc.

• En el caso de variables referenciadas o asociadas a objetos, los bits


representan un numerajo que permite acceder al valor de la variable,
es decir, al objeto, pero no es el valor u objeto en sí.
Todos los nombres empleados para hacer referencia a variables deben cumplir lo
siguiente:

• Su primer carácter debe ser una letra, el símbolo del subrayado o el carácter
dólar $.

• No son válidos las palabras reservadas de Java.

• No se admiten espacios en blanco.

• Son case-sensitive (sensibles a mayúsculas).

Aparte de estas normas conviene que los nombres de las variables indiquen qué dato
almacenan con el fin de facilitar la lectura del programa y, por otra parte, si un
nombre tiene más de dos palabras la primera letra de la primera palabra irá en
minúscula, la primera letra de la segunda palabra en mayúscula, ídem con la tercera
y así sucesivamente.

Ejemplo:

int miVariableEntera=100;

Variables primitivas
• De tipo entero:

Son variables que almacenan números enteros. Se pueden dividir en los


siguientes tipos:
NOTA: el tipo de variable en que se almacena por defecto un numero entero es int. El
valor por defecto asociado a cualquier variable entera no inicializada es 0.

• De tipo real o de coma flotante:

Son variables que almacenan datos numéricos con decimales. Se pueden dividir
en los siguientes tipos:

NOTA: el tipo de variable en que se almacena por defecto un numero decimal es double.
El valor por defecto asociado a cualquier variable real no inicializada es 0.0.

• De tipo lógico o booleanas:

Son variables que almacenan dos posibles valores: true o false. No se


corresponden con ningún valor numérico.

Ejemplo:

boolean tienesCalor=true;

NOTA: el valor por defecto asociado a cualquier variable booleana no inicializada es


false.

• De tipo char o de carácter:


Son variables que almacenan caracteres individuales (letra, numero, signo ?,
etc...). El carácter que se inicializa debe ir entre apóstrofes o comillas simples 'a'.

El código de caracteres empleado por Java es Unicode y recoge los caracteres


de prácticamente todos los idiomas importantes del mundo (son unos 65.536). Los
caracteres Unicode del alfabeto occidental corresponden a los primeros 256
enteros; es decir van desde [0, 255].

A cada carácter le corresponde unívocamente un número entero perteneciente al


intervalo [0, 65536] o a [0, 255] si se trabaja sólo con el alfabeto occidental. Por
ejemplo, la letra ñ es el entero 164. Más adelante se verá que el casting entre
variables primitivas enteras y la variable char está permitido.

Ejemplo:

char miCaracter='n';

char miCaracter1=110; (ídem antes, pero mediante el entero que le corresponde


según Unicode)

char miCaracter2='\u006E'; (ídem antes, pero según notación Unicode. La notación


Unicode, en general, es así: \uXXXX siendo X un dígito o cifra fundamental del
sistema de numeración hexadecimal (0,1,2,...,9,A,B,...,F))

Asociado a este tipo de variable se tienen las secuencias de escape. Se emplean


para representar caracteres especiales (por ejemplo, unas comillas dentro de una
instrucción que exige una cadena entrecomillada) y caracteres no imprimibles como
el tabulador, salto de línea, etc. Van precedidos de la contrabarra. Algunos de ellos se
detallan en la tabla siguiente:

NOTA: el valor por defecto asociado a cualquier variable char no inicializada es


'\u0000'

Ejemplo: todos los códigos de este tema se guardarán en c:\cursojava\tema2 si no


se emplea IDE.

NOTA MUY IMPORTANTE:

El profesor aconseja usar JCreator como IDE. En este caso, se


creará colgando del Workspace JavaCliente un proyecto vacío de
nombre tema2 y se agregará al proyecto, el fichero java mostrado
abajo. Por tanto, este código se guardará en
jcreator_home\MyProjects\tema2.

El modo de trabajo con el IDE a partir de ahora será crear un


proyecto nuevo vacío por cada tema y agregar a ese proyecto todos
los códigos java del mismo.

Por consola:

Comienza programa

El valor de tengoCalor es true

El valor de letra es n

El valor de letra1 es n

El valor de letra2 es n

Eso es

un mensaje

de tres lineas

Me llamo "Jesus"

Me llamo \Jesus\

Variables referenciadas
Asociadas a objetos o instancias de una clase. Se irán estudiando durante el curso.

Casting o transformaciones de tipo


El casting es un procedimiento para transformar una variable primitiva de un
tipo a otro, o transformar un objeto de una clase a otra clase siempre y
cuando haya una relación de herencia entre ambas (este último casting es el
más importante y se verá más adelante).

Dentro del casting de variables primitivas se distinguen dos clases:

• Implícito: no se necesita escribir código para que se lleve a cabo. Ocurre


cuando se realiza una conversión ancha (widening casting), es decir, cuando se
coloca un valor pequeño en un contenedor grande.

Ejemplo 1:

Ejemplo 2: similar al anterior.

En cambio,

• Explícito: sí es necesario escribir código. Ocurre cuando se realiza una


conversión estrecha (narrowing casting), es decir, cuando se coloca un valor
grande en un contenedor pequeño. Son susceptibles de pérdida de datos.

Ejemplo 1:

NOTA: si se sustituyera la primera línea int num1=100 por int num1=1000000, el código compilar
bien, pero habría pérdida de datos, pues el 1000000 se sale del rango de short [-32768, 32767].
mostrar por consola el valor se obtendría un resultado incongruente.

Ejemplo 2:

Ejemplo 3: continuación del Ejemplo 2 del casting implícito


Para que la línea

compile debe hacerse un casting explícito a long

pero no

porque, en la línea anterior, 10000000000 es considerado int, mientras que en las de


arriba, double.

Dicho esto, se va a analizar un ejemplo un tanto extraño.

Ejemplo extraño:

Dado que cualquier entero, por defecto, se almacena en un int (4 bytes), con la línea
anterior se pretende colocar un valor grande (el int 10) en un contenedor pequeño
(una primitiva de tipo byte con capacidad para 1 byte). Esto, según lo expuesto
anteriormente, precisa de casting explícito.

Pero, resulta que no hace falta, ya que el compilador, cuando se trabaja con
enteros, digamos que, provoca un "casting implícito contranatura" y transforma
automáticamente a byte el int 10. Ocurriría lo mismo si se trabajara con short y char.

Lo que pasa (y esto es lo que resulta un tanto extraño) es que no ocurre lo anterior
con los decimales: por eso, una línea como

provoca error de compilación. Recordar que cualquier decimal, por defecto, se


almacena en un double (8 bytes) y que un tipo float tiene capacidad para 4 bytes. En
los decimales, el compilador no fuerza el casting implícito contranatura. De ahí que
sea necesario un casting explícito a float para evitar el fallo de compilación.

NOTA: quizá se evitarían estas situaciones, si el compilador no forzara el casting implícito


contranatura a byte, short o char de un int y provocara error de compilación, del mismo modo que
cuando se declara un float y no se castea explícitamente. Pero, de momento, esto es lo que hay.

Código de partida para explicar el casting entre variables primitivas que


almacenan datos numéricos:
Las líneas 3 y 4 almacenan al número 10 mediante una variable primitiva de tipo
byte vía "casting implícito contranatura", el 3000 mediante una de tipo short,
también vía "casting implícito contranatura". Lo más intuitivo es definirlas mediante
un casting explícito, pero tal y como están también se puede.

Supuestamente, la línea 5, almacena el 3000000000 mediante una variable de tipo


long, vía casting implícito, pero es falso. Ocurre lo que se ha comentado en el
Ejemplo 2 del casting implícito: 3000000000 no es considerado como long sino como
int y 3000 millones no pertenece al rango asociado a int (aprox. [-2150 millones,
2150 millones]). Si se intenta compilar, se produciría error.

Supuestamente, la línea 6, almacena el 256.5 mediante una variable de tipo float


(ocupa 4 bytes en memoria), vía "casting implícito contranatura", pero, como se ha
comentado en el Ejemplo extraño, es falso, ya que en decimales nunca se produce.
Debe castearse explícitamente a float.

El código correcto sería:


• Una cuestión a tener en cuenta relacionada con el casting entre
variables primitivas es la siguiente:

En Java se realizan automáticamente conversiones de una variable primitiva de un


tipo a otra de otro, de igual o mayor precisión, siempre y cuando se respeten los
rangos asociados al tipo convertido.

La precisión depende del número de bytes ocupados en memoria y del rango de


valores asociado: a mayor número de bytes ocupados, mayor precisión y mayor
rango asociado.

Así, pasar de byte a short, de short a int, de byte a int, … es automático siempre y
cuando el entero a convertir no supere el rango del tipo convertido; en definitiva,
pasar de una variable primitiva de un tipo de la cadena de la siguiente línea a otra
que se encuentre a su derecha es automático.

byte-->short-->int-->long-->float-->double

Así, por ejemplo, si un método necesita un long como argumento y se le pasa


un entero perteneciente al rango de int, promociona automáticamente a long
y no es necesario casting.

En cambio, si se le pasa un entero que se sale fuera del rango de int, es


necesario realizar un casting para que la llamada al método no provoque
error al compilar.

Un ejemplo de esto ocurre con el método estático de java.lang.Thread "void


sleep(long retardo)" que introduce un retardo en la ejecución del código, coincidente
con el entero, en milisegundos, que se le pasa al argumento. Este método se
estudiará más adelante.

Por consola:

Hola

-- Después de tres segundos --

Adios

En cambio, si se sustituye

Thread.sleep(3000) por Thread.sleep(3000000000)


no compila ya que el entero que se le pasa no pertenece al rango de int y no puede
promocionar a long automáticamente.

Para que compile es necesario hacer un casting explícito:

Thread.sleep(3000000000L)

• Para finalizar con el casting entre primitivas, conviene tener en cuenta


lo siguiente:

• No es posible realizar casting entre una variable primitiva booleana y cualquier


otra variable primitiva.

• Sí es posible realizar casting entre una variable primitiva char y una variable
primitiva que almacene enteros.

Ejemplo:

Por consola:

Estructuras básicas de programación


NOTA IMPORTANTE:

El estudio de esta sección del tema se recomienda a personas que no conocen las
estructuras típicas de programación comunes a la mayoría de lenguajes, tales como
los condicionales, los bucles for, los bucles while, las sentencias de ruptura break y
continue, etc.

Primero se realiza una somera explicación de los operadores y expresiones que más
frecuentemente se utilizan en cualquier lenguaje de programación y, a continuación,
se explican las estructuras mencionadas anteriormente.

Es una sección optativa.

Expresiones

Una expresión es una instrucción o sentencia que devuelve un valor llamado valor de
retorno y que asigna a una variable un

• Dato numérico
• Valor lógico

• Carácter

• Cadena de caracteres o dato textual

Ejemplo 1:

NOTA: los listados que no tienen número de línea no son códigos completos. Sólo muestran las
líneas asociadas a la explicación.

Ejemplo 2:

Operadores

Un operador permite relacionar dos datos en una expresión y evaluar el


resultado de una operación.

Tipos:

• Aritméticos

• De asignación

• De comparación

• Lógicos

ARITMÉTICOS

Manipulan datos numéricos. Son los siguientes:

• Suma +
• Resta –
• Producto *
• División /
• Resto de la división entera o módulo %
• Incremento unitario ++
• Decremento unitario –
• Incremento de cien en cien +=100
• Decremento de cien en cien -=100

NOTA: se muestran algunos ejemplos del operador módulo o resto de la división entera de dos
números. Debe tenerse en mente que Dividendo=(Divisor*Cociente)+Resto

Ejemplo 1: 20%7 es igual a 6 ya que 20=7*2+6

Ejemplo 2: 1%3 es igual a 1 ya que 1=3*0+1

Este operador puede aplicarse a números decimales: verificar que

75%3.5=1.5

7.5%35=7.5

7.5%3.5=0.5

Ejemplo 1: muestra por consola una serie de resultados asociados a cálculos


sencillos realizados con los operadores aritméticos. Todos los códigos en
c:\cursojava\tema2 o en jcreator_home\MyProjects\tema2 si se emplea
JCreator.

Por consola:

1
NOTA: sólo aparece la parte entera de la división por que se trabaja con dos números
almacenados en variables enteras. Si se quiere obtener la división incluyendo decimales, bien el
numerador o el denominador, deberían declararse como double o float.

Ejemplo 2: se muestra el uso del operador de incremento unitario

Por consola:

Valor de x: 11

Ejemplo 3: se analiza el empleo de los operadores de incremento o decremento


cuando se emplean para asignar valores a otras variables

Por consola:

Valor de x: 11

Valor de y: 10

Ejemplo 4:

Por consola:

Valor de x: 11
Valor de y: 11

DE ASIGNACIÓN

Transfieren datos de una variable a otra. Son los siguientes:

• x+=y x=x+y
• x-=y x=x-y
• x*=y x=x*y
• x/=y x=x/y
• x%=y x=x%y Es el módulo o resto de una división

Ejemplo 1:

Por consola:

Valor de z: 8

FIN DE PROGRAMA

Ejemplo 2:

Por consola:

El valor de a es 9 y el de b es 27

FIN DE PROGRAMA

DE COMPARACIÓN

Comparan dos datos y devuelven un valor booleano. Son los siguientes:


• == igual (no confundir con el = de asignación)
• != distinto
• < mayor que
• < menor que
• >= mayor o igual que
• <= menor o igual que

Ejemplo:

Por consola:

Valor de z: true

FIN DE PROGRAMA

LÓGICOS

Concatenan expresiones lógicas con objeto de evaluar si es cierto o falso el


conjunto de las expresiones. Son los siguientes:

• && (Y lógico): si todas las expresiones lógicas que se evalúan son verdaderas
se devuelve un valor booleano true; si alguna es falsa, devuelve false.

• || (O lógico): si alguna de las expresiones lógicas que se evalúa es verdadera,


se devuelve un valor booleano true; si todas son falsas, devuelve false.

• ! (NOT): invierte el valor de una expresión booleana.

Ejemplo 1:
Por consola:

Valor de z: true

FIN DE PROGRAMA

Ejemplo 2:

Por consola:

Valor de z: true

FIN DE PROGRAMA

Condicional simple if .. else

Se emplea cuando se quiere ejecutar un bloque de código siempre y cuando


se cumplan una o varias condiciones. Estas condiciones devuelven un valor
booleano, es decir true o false.

Sintaxis:

Ejemplo:
Por consola:

Luis es mayor de edad y puede votar.

Luis tiene 24 años.

FIN DE PROGRAMA

NOTA 1: si el bloque de código del if tienen una sola línea de código no es necesario utilizar llave,
aunque si se escribe, no da error. Lo mismo ocurre con el bloque de código alternativo
NOTA 2: si no se escribe el else opcional y no se cumple la condición del if, el programa continúa
ejecutándose pasando a las siguientes líneas de código
NOTA 3: si se cambia el valor de la variable int edadLuis a 16, entonces se ejecutará el bloque de
código del else. Es decir, por consola se mostrará:

Luis no es mayor de edad y no puede votar

Luis tiene 16 años

Operador ternario

Se emplea para asignar valores a una variable en función del cumplimiento o no de


una condición. Su sintaxis se basa en tres términos.

Sintaxis: los paréntesis son opcionales

algunaVariable=(condición que devuelve un valor booleano) ? (valor si devuelve true)


: (valor si devuelve false)

NOTA: los valores que se devuelven deben ser compatibles con los que admite la variable que se
inicializa

Ejemplo: en este ejemplo se muestra el funcionamiento del operador ternario y se


introduce la variable referenciada String, que se utiliza para almacenar cadenas de
texto. Se estudiará en profundidad más adelante.
Por consola:

Pedro es mayor de edad y puede votar

Condicional compuesto if .. else if .. else if .. etc .. else

Admite tantas condiciones como necesite el programador. MUY USADO

Sintaxis:

NOTA: si el bloque de código de los if tienen una sola línea de código no es necesario utilizar
llaves, aunque si se escriben, no da error. Lo mismo ocurre con el bloque de código alternativo

Ejemplo:
Por consola:

BIENVENIDO AL PROGRAMA

Pedro y Luis son mayores de edad

Pedro y Luis pueden votar

FIN DE PROGRAMA

Condicional switch

Es parecido o similar a la estructura if()...else if()...else if()...else, pero con ciertas


limitaciones:

• Limitación 1: sólo admite una condición. No son validos los operadores && y
||.

• Limitación 2: en esa condición se presupone que el operador de relación es la


igualdad (==).

• Limitación 3: la variable asociada a la condición sólo puede ser de tipo byte,


short, int o char, ninguna otra es válida.

Ejemplo 1:
Por consola:

El operador es +

El operador es *

El operador es /

Operador desconocido

FIN DE PROGRAMA

Explicación:

Se ejecutan todas las instrucciones a partir del segundo case (es el que coincide con
la variable operador). Si no hay ningún case coincidente, se ejecuta el código
asociado a default.

NOTA 1: no se puede repetir ningún case con el mismo valor. Se produce error de compilación
NOTA 2: si se quiere que el programa, cuando encuentre el primer case coincidente con el valor de
la variable evaluada, salga del switch, debe agregarse a cada case la instrucción break del
siguiente modo:

Ejemplo 2:
Por consola:

El operador es +

FIN DE PROGRAMA

Bucle for

Estructura utilizada para ejecutar una o varias líneas de código un


determinado número de veces. Este número de veces depende del cumplimiento
de una condición fijada por el programador.

Sintaxis:

Ejemplo 1: se quiere desarrollar un programa que muestre por consola los números
del 0 al 4. En este momento sólo se podría hacer de la siguiente manera:
Por consola:

FIN DE PROGRAMA

Este ejemplo se hace mucho mejor y con menos trabajo para el programador
mediante un bucle for:

Si se modifica la línea System.out.println(i) por System.out.print(i) no se insertará


una línea vacía después de cada número, aparecerán todos en la misma línea.

Por consola:

01234FIN DE PROGRAMA
Sentencias break, return y continue

Break

Aplicable dentro de bucles y estructuras condicionales de tipo switch. Su


ejecución provoca que se salga del bucle o etiqueta que se esté ejecutando sin
finalizar el resto de las sentencias asociadas al mismo.

Return

Se utiliza para truncar la ejecución de un método o para almacenar el dato que


devuelven. Puede emplearse para truncar bucles cuando no haya más código después
del bucle

Ejemplo 1:

Por consola:

012

Fuera del bucle

NOTA: se sale del bucle en el momento en que i llega a 3.

Si se sustituye break por return, se trunca la ejecución del método main

Por consola:

012

Ejemplo 2:
Por consola:

Primera linea de unMetodo

Has introducido 10

FIN DE PROGRAMA

Continue:

Aplicable sólo a bucles. Finaliza la iteración "i" que en ese momento se está
ejecutando (significa que no ejecuta el resto de sentencias hasta el final del bucle) y
vuelve a analizar la condición del bucle, pero con la siguiente iteración "i+1".

Por consola:

0 1 2 4 5 6 7 8 9 10

Fuera del bucle

Bucles anidados

Es uno o más bucles for dentro de otro. Se pueden poner los que se consideren
necesarios.
Ejemplo 1:

Por consola:

INICIO DEL PROGRAMA

1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 4.1 4.2 4.3

FIN DE PROGRAMA

Ejemplo 2:

Por consola:

11 12 13 14 15

21 22 23 24 25

31 32 33 34 35

41 42 43 44 45

51 52 53 54 55

Bucle while

Estructura utilizada para repetir una o varias líneas de código siempre y cuando se
cumpla una condición.

Sintaxis:
NOTA: si el bloque de código que se repite tiene una sola línea no son necesarias las llaves

Ejemplo: realizar un programa que muestre por consola los números enteros
comprendidos entre el 0 y el 5 ambos incluidos.

Por consola:

FIN DEL PROGRAMA

Bucle do .. while

Es casi igual al anterior: la diferencia estriba en que un bucle do...while se


ejecuta, al menos una vez, el bloque de código encerrado dentro del bucle,
independientemente del valor booleano que devuelva la condición del while.

Sintaxis:
NOTA: si el bloque de instrucciones que se repite tiene una sola línea no son necesarias las llaves

Ejemplo: realizar un programa que muestre por consola los números enteros
comprendidos entre el 0 y el 5 ambos incluidos.

Código de caracteres Unicode

Ya se especificó cuando se estudió la variable primitiva char, que Java emplea para
representar caracteres este código. Se trata ahora de mostrar por consola los
caracteres Unicode del alfabeto occidental sabiendo que están contenidos en el
intervalo [0,255]. Para ello se utilizará un bucle for

Alcance de variables
El alcance de una variable indica la parte del programa donde puede utilizarse.
En base al alcance, las variables se clasifican en:

• Variables locales

• Variables de instancia

Cada una de las variables anteriores puede ser estática o no. Durante el desarrollo
del tema se irán viendo las características que definen a los diversos tipo de
variables. Todos los códigos en c:\cursojava\tema2 o en
jcreator_home\MyProjects\tema2 si se emplea JCreator.

Variables locales
Se declaran dentro de métodos o de instrucciones asociadas a bucles for,
estructuras condicionales, etc. Su alcance se restringe al código del método o de la
instrucción. No admiten modificadores de acceso salvo "final" y deben estar
inicializadas antes de ser empleadas.

Ejemplo:

Variables de instancia
Se declaran después de la clase y fuera de cualquier método. Los valores que
asumen para cada objeto constituyen el estado o conjunto de atributos del objeto.

Su alcance es global, es decir, las pueden utilizar directamente todos lo métodos no


estáticos de la clase.

Para acceder desde el método main o desde cualquier otro método estático a
una variable de instancia es necesario crear un objeto de la clase.

Al hecho de crear un objeto de una clase se le conoce también como instanciar


la clase. Si no se inicializan explícitamente, asumen el valor nulo por defecto, una
vez instanciada la clase.

Ejemplo:
Por consola:

Jesus tiene 28 años

Sus ojos son azules

Jesus es mayor de edad


Tiene 28 años

---------------------

Rebeca tiene 27 años

Sus ojos son verdes

Rebeca es mayor de edad

Tiene 27 años

---------------------

FIN DEL PROGRAMA

NOTA: si las variables de instancia no se inicializan explícitamente bien mediante un objeto de la


clase bien en la misma línea donde se declaran, qué ocurrirá?

Se mostrará el elemento nulo asociado a los valores iniciales de los diversos tipos de
variables. Así, en las variables primitivas enteras (byte, short, int y long) dicho
elemento nulo es 0, en las reales (float y double) es 0.0, en las booleanas es false y
en las referenciadas (asociadas a objetos de clases) es null.

En este caso se tendría:

null tiene 0 años

Sus ojos son null

null es menor de edad

Tiene 0 años

---------------------

null tiene 0 años

Sus ojos son null

null es menor de edad

Tiene 0 años

---------------------

FIN DEL PROGRAMA


Variables estáticas o de clase
Son propias únicamente de la clase y no de los objetos que pueden crearse de
la misma, por lo tanto, sus valores son compartidos por todos los objetos de la
clase. Van precedidas del modificador static.

Para invocar a una variable estática no se necesita crear un objeto de la clase en


la que se define:

• Si se invoca desde la clase en la que se encuentra definido, basta con escribir


su nombre.

• Si se le invoca desde una clase distinta, debe anteponerse a su nombre, el de la


clase en la que se encuentra seguido del operador punto (.)
<NombreClase>.variableEstatica

Suelen emplearse para definir constantes comunes a todos los objetos de la clase.

Ejemplo 1:
Por consola:

Jesus tiene 28 años

Sus ojos son azules

Su planeta es la Tierra

Jesus es mayor de edad


Tiene 28 años

---------------------

Rebeca tiene 27 años

Sus ojos son verdes

Su planeta es la Tierra

Rebeca es mayor de edad

Tiene 27 años

---------------------

FIN DEL PROGRAMA

Ejemplo 2:

Por consola:

Area circulo de radio 10.3= 333.2915646193412

Métodos estáticos o de clase


Se cargan en memoria en tiempo de compilación y no a medida que se ejecutan las
líneas de código del programa. Van precedidos del modificador static. Para
invocar a un método estático no se necesita crear un objeto de la clase en la
que se define:

• Si se invoca desde la clase en la que se encuentra definido, basta con escribir


su nombre.

• Si se le invoca desde una clase distinta, debe anteponerse a su nombre, el de la


clase en la que se encuentra seguido del operador punto (.)
<NombreClase>.metodoEstatico

Suelen emplearse para realizar operaciones comunes a todos los objetos de


la clase. No afectan a los estados de los mismos (a los valores de sus variables de
instancia). Por ejemplo, si se necesita un método para contabilizar el número de
objetos creados de una clase, tiene sentido que sea estático ya que su función
(aumentar el valor de una variable entera) se realizaría independientemente del
objeto empleado para invocarle.

No conviene usar muchos métodos estáticos, pues si bien se aumenta la rapidez de


ejecución, se pierde flexibilidad, no se hace un uso efectivo de la memoria y no se
trabaja según los principios de la Programación Orientada a Objetos.

Ejemplo:
Por consola:

Ahorros=2500.0

Ahorros=4500.0

Numero de huchas=2

NOTA: muchas clases de la API disponen de métodos estáticos. Por ejemplo, la clase Math del
paquete java.lang cuenta con multitud de ellos. Estos métodos se emplean para realizar
operaciones matemáticas. La clase Thread, del mismo paquete, cuenta con varios: uno que se
emplea para retardar la ejecución de código es “void sleep(long retardo)”. Consultar la API. Lo
importante de estos métodos es que para su utilización no es necesario instanciar un objeto de las
clases en las que se encuentran ya que son estáticos.

Ejemplo 2:
Por consola:

La raiz cuadrada de 100 es 10.0

La potencia de 2 elevado a 8 es 256.0

Clase Math
Esta clase contiene variables de campo y métodos estáticos utilizados para
realizar operaciones matemáticas que van desde el cálculo de una raíz cuadrada
hasta el de funciones trigonométricas. Se van a comentar los menos conocidos. Para
familiarizarse con el resto ir a la API.

• static double ceil(double num): devuelve el double de tipo entero (double-


entero, a partir de ahora) más cercano al argumento que se le pasa, yéndose
hacia + infinito. Un double-entero es un número decimal cuya parte decimal es
siempre 0.

Ejemplo:

System.out.println(Math.ceil(2.3);// muestra por consola 3.0

System.out.println(Math.ceil(0.895);// muestra por consola 1.0

System.out.println(Math.ceil(-1.87);// muestra por consola –1.0

System.out.println(Math.ceil(-0.9);// muestra por consola –0.0

• static double floor(double num): ídem anterior, pero devolviendo el double-


entero más cercano al argumento que se le pasa, yéndose hacia – infinito.

Ejemplo:

System.out.println(Math.floor(2.3);// muestra por consola 2.0

System.out.println(Math.floor(0.895);// muestra por consola 0.0


System.out.println(Math.floor(-1.87);// muestra por consola –2.0

System.out.println(Math.floor(-0.9);// muestra por consola –1.0

• static double rint(double num): devuelve el double-entero redondeado y


asociado al argumento que se le pasa, tomando como cifra base para el
redondeo, la primera después de la coma del argumento, y siguiendo los
criterios habituales de redondeo

NOTA: si la cifra base para el redondeo es mayor o igual que 5, se aumenta en una
unidad la cifra anterior; si la cifra base es menor que 5, no se modifica la cifra anterior.

Si se quiere redondear a partir de una determinada cifra decimal, se multiplicará por


la potencia de 10 que corresponda, se aplicará el método y, después, se dividirá
entre la potencia de 10 por la que anteriormente se ha multiplicado.

Ejemplo:

System.out.println(Math.rint(0.891));// muestra por consola 1.0

Si se quisiera aproximar a dos decimales:

System.out.println(Math.rint(0.891*100)/100);// muestra por consola 0.89

Ahora conviene hacer los ejercicios 1, 2 y 3.

Clases envoltorio de las variables primitivas o


wrapper classes
Estas clases pertenecen al paquete java.lang y son las siguientes: Byte, Short,
Integer, Long, Float, Double, Boolean y Character. Uno de los usos más
habituales de la clases envoltorio es la utilización de métodos estáticos que permiten
obtener a partir de una String que almacena un número en forma de texto, el
correspondiente valor numérico almacenado en la variable primitiva que interese.

Así, la clase Integer dispone del método "static int parseInt(String)" que transforma
la String del argumento en un número que se almacena en la variable primitiva int.

Para el resto de las clases envoltorio se tienen los siguientes métodos:


Si se quiere almacenar la String 250 en una variable int se utilizaría el siguiente
código:

Ejemplo:

Por consola:

135

125125

11

Clase Integer
Se va a estudiar la clase Integer. El estudio del resto de clases envoltorio es similar
exceptuando Character y Boolean.
CLASE ASOCIADA:

java.lang.Integer. Es una clase "final", es decir, no puede heredarse de ella (la


herencia se tratará en temas posteriores).

CONSTRUCTORES:

Los constructores son métodos especiales del mismo nombre que la clase a
la que pertenecen y sin tipo de retorno, que se emplean para crear e
inicializar objetos de una clase y que no admiten tipo de retorno. Cada clase
perteneciente a la API de Java tiene los suyos propios y pueden estudiarse sin más
que consultarla. Para crear un objeto de una clase se utilizará un constructor
de la misma y la palabra reservada de Java new. Además de los constructores
de clases de la API, pueden definirse constructores de clases propias realizadas por el
programador, que no forman parte de la API (se verán más adelante).

• Integer(int num): crea un objeto Integer en base al entero que se le pasa a


su argumento.

• Integer(String num): ídem anterior pero pasándole un entero almacenado en


forma de String. Si el argumento no es un número almacenado en una String se
lanza una NumberFormatException (se verá qué es una excepción más
adelante)

Ejemplo de creación de un objeto Integer usando el segundo constructor:

Antes de estudiar los principales métodos de la clase se recuerdan los sistemas de


numeración más extendidos para representar datos numéricos:
MÉTODOS INTERESANTES:

Hay muchísimos métodos en cada clase de la API. En el curso se van a tratar en


profundidad unos cuantos, abarcar todos sería imposible. La consulta a la API, aparte
de la explicación que se haga, es fundamental para entender la funcionalidad de un
método. Por eso, cada vez que se explique un método conviene consultarlo en la API.
Un programador sin API está perdido.

• static int parseInt(String num): convierte en un entero la cadena de texto


que se le pasa al argumento. Si la cadena no es un número se produce una
NumberFormatException. MUY USADO.

• static int parseInt(String num, int base): ídem anterior, pero indicando en
el segundo argumento el sistema de numeración (base 2, base 8, base 10, base
16, etc.) en el que se expresa el primer argumento.

Ejemplo:

String num="1001"; //Esto es un número binario o en base 2 almacenado en forma


de String

System.out.println(Integer.parseInt(num,2)); //Por consola va a mostrarse 9.

• static Integer valueOf(String num): crea un objeto Integer en base a la


cadena de texto que se le pasa. Si la cadena no es un número se produce una
NumberFormatException.

• static String toHexString(int num): devuelve una cadena de texto cuyo


contenido es el entero expresado en hexadecimal del entero expresado en
decimal que se le pasa al argumento.

• static String toOctalString(int num): ídem, pero ahora el contenido es un


entero expresado en octal.

• static String toBinaryString(int num): ídem, pero ahora el contenido es un


entero expresado en binario.

• int intValue(): devuelve el entero asociado al contenido de un objeto Integer.


Los métodos anteriores, al ser estáticos, no precisan de un objeto Integer sobre
el que aplicarlos; en cambio, este método sí.

Ejemplo 1:
Por consola:

Suma de 125 y 20 vale 145

126

Ejemplo 2:

Por consola:

47

47

47

47

Ahora se recomienda realizar el Ejercicio 4


Clase Character
CLASE ASOCIADA:

java.lang.Character. Al igual que Integer es una clase "final" y, por tanto, no puede
heredarse de ella.

CONSTRUCTORES:

• Character(char ch): crea un objeto Character pasándole a su argumento un


carácter.

MÉTODOS INTERESANTES:

• static boolean isLetter(char ch): devuelve true si el carácter del argumento


es una letra. False en caso contrario.

• static boolean isDigit(char ch): devuelve true si el carácter del argumento


es un dígito (0,1,2,…,9). False en caso contrario.

• static boolean isLowerCase(char ch): devuelve true si el carácter del


argumento es una letra minúscula. False en caso contrario.

• static boolean isUpperCase(char ch): devuelve true si el carácter del


argumento es una letra mayúscula. False en caso contrario.

• char charValue(): devuelve el carácter asociado al objeto Character sobre el


que se aplica.

Ejemplo:

Por consola:

b
true

false

true

☺☻♥♦♣♠♫☼►◄↕‼§▬↨↑↓→←∟↔▲▼!"#$%&'()*
+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx
yz{|}~⌂????????????????????????????????áíóú
ñѪº¿®½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ
╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙ
ýݯ´ ±‗¾§÷¸°¨•¹³²■

Comentarios
Un comentario es un conjunto de línea/s de código que no se tienen en cuenta en
tiempo de compilación ni de ejecución. Se utilizan para facilitar la lectura y
comprensión del código. Hay tres tipos:

• Tipo //: es un comentario de línea

Ejemplo:

Por consola:

Adios

FIN DE PROGRAMA

• Tipo /* y */: es un comentario de varias líneas. Todo lo que está contenido


entre estos dos símbolos se considera comentario. Permite comentar parte de
una línea de código.

Ejemplo:
Por consola:

0 1 2 3 4 5 FIN DE PROGRAMA

• Tipo /** y */: es un comentario de documento. Soporta varias líneas y en


ellas se puede emplear código html y unas etiquetas especiales que comienzan
por @. Se crean una serie de ficheros, la mayoria html, que muestran
información sobre las clases del código, sus métodos públicos, información
sobre los argumentos asociados a los métodos, información de las excepciones
que pueden causar, etc. En resumidas cuentas, se crea una API particular para
nuestro código, similar a la API oficial, que recibe el nombre de javadoc. Si se
abre index.html, se muestra el javadoc generado.

¿Cómo se generan los ficheros asociados al javadoc?

Tecleando en el DOS y desde el directorio donde se encuentra el código fuente

javadoc <NombreCodigoFuente.java>

Ejemplo: el código que se presenta es muy simple y el javadoc generado ridículo. En


general, los javadocs contienen muchas clases, muchos métodos y mucho más de
todo. Se trata de tener un primer contacto con un código susceptible de generar
javadoc.
Por consola:

Llamando al metodo mostrarAtributos

Esto es un perro macho de color negro

Su nombre es Yako
Yako esta hambriento

-------------

Alimentando al perrito

Hum, que bueno

--------------

Llamando al metodo mostrarAtributos

Esto es un perro macho de color negro

Su nombre es Yako

Yako no tiene hambre

--------------

Alimentando al perrito

No gracias, ya he comido

Para generar el javadoc:

javadoc Perro.java

NOTA 1: si se desea que aparezca el contenido de la etiqueta @author

javadoc -author <NombreCodigoFuente.java>

NOTA 2: los javadocs son mucho más elaborados que el asociado al código anterior. Un ejemplo
puede obtenerse de

http://jcharts.sourceforge.net

Luego, sección Downloads/Current Releases y descargar el fichero jcharts-0.7.5.zip

Después, se descomprime y se abre el fichero index.html de la carpeta javadocs.

Los códigos fuentes de la aplicación se encuentran en src\org\jCharts

Resulta interesante observar los comentarios de un fuente cualquiera, por ejemplo


src\org\jCharts\axisChart\axisChart.java

y comprobar que son lo que aparecen en la explicación de la clase AxisChart cuando


se consulta esa clase en el javadoc o API particular

NOTA 3: desde http://www.jotobjects.com se puede consultar una API para desarrollo de


aplicaciones web basadas en servlets y javabeans.

Localizar la sección API JAVADOC


Ejercicios

Ejercicio 1
Resolver una ecuación de segundo grado y realizar una serie de cálculos con sus
soluciones reales, tomando como punto de partida el siguiente código comentado:

Por consola:

Las soluciones son: -0.5657414540893352 y -1.7675918792439982

Solucion mayor: -0.5657414540893352

La exponencial elevada a la solucion mayor vale: 0.5679388899930863

El coseno de la solucion menor vale: -0.19552774420923652


Soluciones redondeadas hasta cuatro decimales: -0.5657 y -1.7676

El arcoseno de la solucion mayor en radianes: -0.601332163575292

El arcoseno de la solucion mayor en grados sexagesimales: -34.453795058334684

Ejercicio 2
A) Dado el siguiente código, averiguar si va a producirse error de compilación.

Si consideráis que se produce dicho error, indicar la causa.

Si consideráis que la compilación se realiza con éxito, indicar qué se mostrará por
consola al ejecutarlo.

B) Si se elimina el modificador static del método mostrarEdad(..), qué modificaciones


deben hacerse en el código para que se muestre por consola lo mismo

Ejercicio 3
Qué se mostrará por consola al compilar y ejecutar el siguiente código?
Ejercicio 4
Realizar un código que convierta un número entero positivo almacenado en una
variable de tipo int en su correspondiente valor expresado en el sistema hexadecimal,
octal y binario.

Por consola:

Numero 47 en sistema decimal: 47

Numero 47 en hexadecimal: 2f

Numero 47 en octal: 57

Numero 47 en binario: 101111

3 - Clase String. Introducción a los flujos

Clase String
Una String es una variable referenciada asociada a un objeto de la clase
java.lang.String. Se emplea para almacenar cadenas de caracteres.
Las Strings tienen una característica que las diferencia del resto de objetos:
son inmutables, es decir, cuando se intenta modificarlas, por ejemplo al aplicarles
un método, no se modifican sino que se crea otra String nueva.

Ejemplo 1 (inmutabilidad): se observa que siendo una String una variable


referenciada no se emplea constructor para crearla sino que se siguen las mismas
pautas que en la variables primitivas. Cuando se vean los constructores de String se
explicará el motivo.

NOTA: los listados que no tienen número de línea no son códigos completos. Sólo muestran
las líneas asociadas a la explicación.

Por consola:

Jesus Fernandez

Gráficamente:

Se verá más adelante que los objetos desreferenciados son candidatos a ser
eliminados de la memoria mediante un recolector de basura o garbage collector,
que trabaja en un segundo plano de forma transparente para el programador. Esto
hace que la gestión dinámica de la memoria no sea una preocupación de primer nivel
para un programador Java y que pueda focalizar toda su atención en desarrollar
buenos códigos.

Ejemplo 2 (inmutabilidad): todos los códigos de este tema se guardarán en


c:/cursojava/tema3 o en jcreator_home\MyProjects\tema3 si se emplea JCreator.

Código fuente

Por consola:

Jesus

Jesus Fernandez

11

Gráficamente:
Otras dos características de las Strings son:

• Una String está indexada, es decir, cada uno de sus caracteres tiene asociado
un índice: 0 para el primero, 1 para el segundo, etc.

• La cadena de caracteres almacenada por una String siempre se escribe


entre comillas dobles.

CLASE ASOCIADA:

String, que pertenece al paquete java.lang. De aquí en adelante java.lang.String. Los


paquetes se introducirán más adelante.

CONSTRUCTORES:

• String(): construye un objeto de la clase String sin inicializar.

Ejemplo:

Se crea un objeto de la clase String sin inicializar, al que se asigna la variable


referenciada, cadena. Luego, se inicializa con "Me llamo Jesus".

• String(String texto): contruye una String con otra que se le pasa al


argumento del constructor. Resulta un poco paradójico que para construir una
String se necesite otra String. Ocurre lo siguiente:

NOTA IMPORTANTE: toda variable referenciada debe crearse con un


constructor.

Pues bien, la variable referenciada String es la única que tiene la


propiedad de poder construirse como una variable primitiva. En este
constructor se aprovecha esta peculiaridad.

Ejemplo:

Se crea una String llamada cadenaBis pasándole al argumento del constructor otra,
pero creada como si fuera una variable primitiva.

CONCLUSIÓN: cuando se trabaja con Strings no suele emplearse ningún constructor sino que se
hace uso de la propiedad anteriormente comentada. Así, si se desea crear una String y mostrarla
por consola, el código habitual sería:

String cadena="Esto es una cadena de texto";

System.out.println(cadena);

Así es como se ha trabajado en el ejemplo inicial del tema. Es la forma habitual de


crear Strings.

MÉTODOS PRINCIPALES:

Para poder aplicar estos métodos es necesario crear un objeto String. Además de
estos métodos, la clase String cuenta con otros muchos. Consultar la API para más
información.

• int length(): devuelve la longitud de la String, incluyendo espacios en blanco.


La longitud siempre es una unidad mayor que el índice asociado al último
carácter de la String.

Ejemplo:

Por consola:

• int indexOf(String str, int indice): devuelve el índice en el que aparece por
primera vez la String del primer argumento en la que se aplica el método, a
partir del índice especificado en el segundo argumento. Recordar que una String
está indexada. Si el índice a partir del que se inicia la búsqueda no existe o la
String no aparece, devuelve –1. MUY USADO.

Ejemplo:
Por consola:

–1 porque la búsqueda se inicia a partir de un índice que no existe ya que el índice


mayor es la longitud de la String –1.

• int indexOf(char ch): devuelve el índice en el que aparece por primera vez el
carácter que se le pasa al argumento. Si no se encuentra el carácter devuelve –
1. Se observa que el nombre de este método es igual al anterior aunque su
número de argumentos es distinto además de su tipo. A esto, en Java, se le
llama sobrecarga de métodos: mismo nombre pero distinto nº de
argumentos o distinto tipo de argumentos o distinto orden. Ir a la API
para comprobar que hay más con este mismo nombre. Este concepto se tratará
más en profundidad en temas posteriores.

• String replace (char viejoChar, char nuevoChar): cambia el carácter


asociado al primer argumento por el que se le pasa al segundo, de la String
sobre la que se aplica el método generando una nueva. La String sobre la que
se aplica el método no cambia, simplemente se crea otra nueva en base a la
String sobre la que se aplica el método.

Ejemplo:

Por consola:

cucu

coco

• String toLowerCase(): devuelve una nueva String convirtiendo todos los


caracteres de la String sobre la que se aplica el método, en minúsculas.

• String toUpperCase(): devuelve una nueva String convirtiendo todos los


caracteres de la String sobre la que se aplica el método, en mayúsculas.

• boolean equals(String str): investiga si dos String tienen los mismos


caracteres y en el mismo orden. Si es así devuelve true y si no false. MUY
USADO

• boolean equalsIgnoreCase(String str): investiga si dos String tienen los


mismos caracteres y en el mismo orden sin tener en cuenta las mayúsculas. Si
es así devuelve true y si no false. MUY USADO

• boolean startsWith(String str): devuelve true si la String sobre la que se


aplica comienza por la del argumento; false si esto no ocurre.
• boolean startsWith(String str, int indice): devuelve true si la String sobre
la que se aplica comienza por la del argumento a partir de un determinado
índice asociado al segundo argumento; false si esto no ocurre.

• boolean endsWith(String str): devuelve true si la String sobre la que se


aplica acaba en la del argumento; false si esto no ocurre.

• String trim(): devuelve una String en base a la que se le pasa al argumento,


pero sin espacios en blanco al principio ni al final. No elimina los espacios en
blanco situados entre las palabras.

Ejemplo:

Por consola:

14

12

• String substring(int indiceIni, int indiceFin): devuelve una String obtenida


a partir del índice inicial incluido y del índice final excluido; es decir, se
comporta como un intervalo semiabierto [indiceIni, indiceFin). Si el índice final
sobrepasa la longitud de la String, lanza una IndexOutOfBoundsException.
MUY USADO.

Ejemplo:

Por consola:

rrucu

• char charAt (int indice): devuelve el carácter asociado al índice que se le


pasa como argumento de la String sobre la que se aplica el método. Si el índice
no existe se lanza una StringIndexOutOfBoundsException que hereda de
IndexOutOfBoundsException. MUY USADO.

NOTA 1: los métodos anteriores que devuelven una String NO MODIFICAN la String sobre la
que se aplican; lo que hacen es crear otra nueva, en base a la que se emplea para aplicar el
método. Recordar la inmutabilidad de las Strings
NOTA 2: ahora que ya se está un poco más familiarizado con los objetos, métodos y variables
usados en Java se puede entender mejor la línea de código que se ha venido empleando para
mostrar mensajes por consola “System.out.println(String str)”. La explicación para esta línea
sería la siguiente:

Se está aplicando a un objeto de la clase PrintStream el método “void


println(String str)”. El objeto de PrintStream se obtiene mediante la variable de
campo estática out (representa la salida estándar del sistema, es decir, la consola del
DOS en el caso de que el sistema sea un PC) de la clase System.

En la API se observa que el método está sobrecargado (este concepto


fundamental de la Programación Orientada a Objetos, se estudiará más adelante) y
por ello no va a ser necesario transformar sus argumentos en String ya que, en base
a lo que le llegue se empleara una versión del método u otra. Por eso no se producen
errores cuando se pasa al método una variable primitiva ya sea booleana, entera o
real. El programador no debe preocuparse por el tipo de dato que le pasa al
método ya que existen múltiples versiones del mismo.

Otra cuestión que se va a introducir y cuyo uso se verá más adelante es la siguiente:
si se quiere convertir a String un objeto de cualquier clase, puede emplearse el
método “void toString()” de java.lang.Object. Ojo pues este método sólo es
aplicable a objetos, NO a variables primitivas.

Ahora conviene realizar los cuatro primeros ejercicios del tema. El número 4
tiene carácter obligatorio: si no se envía al tutor, al alumno no podrá acceder
al siguiente tema del curso.

Introducción a los flujos o streams


Los flujos surgen por la necesidad de las aplicaciones Java de interaccionar con el
exterior de dos posibles formas:

• Generando salida a la consola del DOS, a un fichero, etc.

• Capturando datos procedentes del teclado, de ficheros, de páginas web, etc.

Concepto de flujo: es como un río. El agua en movimiento es el flujo, su


contenido son los datos. Lo que permite que esos datos viajen de un origen a
un destino es el agua en movimiento, es decir, el flujo. En el caso de la
captura, desde un programa Java, de datos introducidos por un usuario
mediante teclado, el origen es el teclado, el destino, el programa Java y los
datos, lo tecleado por el usuario.

Java modela flujos mediante clases del paquete java.io. Este paquete se
estudiará más adelante, por el momento se va a explicar cómo una aplicación Java
captura datos introducidos por el usuario a través del teclado y cómo realiza todo tipo
de operaciones sobre los mismos.
Captura de datos desde teclado
Se necesita lo siguiente:

• Obtener un objeto que modele la fuente de entrada de datos “teclado”


en un programa Java. Más adelante se estudiarán otras fuentes de entrada
de datos como ficheros o conexiones a sockets.

Para ello, lo primero que debe tenerse presente es que el teclado es la


entrada estándar de datos en un PC.

A continuación, debe tenerse en cuenta, que cualquier entrada genérica de datos


a un programa Java, se modela mediante un objeto de la clase abstracta
java.io.InputStream.

Bueno, pues en la API se observa que un objeto de esta clase es lo que devuelve
la variable de campo estática "in" de la clase java.lang.System. Además, la
explicación API de esta variable nos dice que representa la entrada estándar de
datos de un programa Java. Pues ya está.

CONCLUSIÓN: en los códigos que capturen datos procedentes del teclado, se empleará
System.in para modelar el teclado.

Para la salida es lo mismo: la salida estándar de datos en un PC es la consola


del DOS. La salida genérica de datos de un programa Java se modela
mediante un objeto de la clase abstracta java.io.OutputStream.

En la API, se observa que un objeto PrintStream (hereda de OutputStream y,


por tanto, es un objeto OutputStream) es lo que devuelve la variable de
campo estática "out" de System. Además, la explicación API de esta variable dice
que representa la salida estándar de datos de un programa Java.

CONCLUSIÓN: en los códigos que generen salida a través de la consola del DOS, se
empleará System.out para modelar la consola del DOS.

¿Cómo se escribe en la consola?

A través de métodos adecuados de PrintStream. Concretamente se han


empleado print(..) y println(..) durante el tiempo que se lleva de curso

No es esta la única forma de interaccionar con el exterior que tiene un código Java.
Más adelante se verá cómo se puede generar salida creando un fichero, por ejemplo.

• Crear un flujo que permita al programador leer datos del teclado. Este
flujo va a ser de entrada o lectura de datos y va a modelarse con una objeto
de la clase InputStreamReader. Ir al API y estudiar sus constructores.

• Crear un filtro encargado de leer los datos de forma óptima mediante la


aplicación de un método de lectura adecuado. El filtro se modela con un
objeto de la clase java.io.BufferedReader y el método de lectura
adecuado va a ser String readLine() que, ya se verá, lanza una excepción
del tipo IOException que debe ser gestionada correctamente. En un
principio, se gestionará mediante la cláusula throws IOException a
continuación del método main.

CONCLUSIÓN GENERAL:

• El flujo u objeto InputStreamReader es lo que permite leer datos.

• El System.in u objeto InputStream es el argumento del constructor de


InputStreamReader y modela el origen de los datos que se leen, es decir, el
teclado.

• El filtro u objeto BufferedReader permite, mediante la utilización del método


String readLine(), leer de forma óptima del flujo.

Vídeo explicativo del proceso de lectura de datos desde teclado.

Ejemplo: muestra cómo se programa un código Java que tiene que capturar datos
introducidos por el usuario desde teclado.

Al ejecurlo, se mostrará por consola un mensaje indicando al usuario que introduzca


un número. El usuario lo tecleará y pulsará enter. Después, se mostrará otro mensaje
invitándole a que teclee otro número. El usuario lo tecleará y pulsará de nuevo enter.
Finalmente, el código calculará la suma de los dos números introducidos. Todos los
códigos en c:\cursojava\tema3 si no se emplea IDE o en
jcreator_home\MyProjects\tema3 si se emplea

Ejemplo:
Código fuente

Vídeo explicativo del programa.

Por consola:

Teclea el primer numero: 10

Teclea el segundo numero: 23

Suma de 10 y 23 es 33

NOTA: la creación del filtro podría hacerse en una sola línea de este modo:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));


Ejercicios

Ejercicio 1
Crear una clase pública de nombre EjercicioString1 que contenga sólo al método
main y partiendo de la String "En mi proxima vida, creere en la reencarnacion"
declarada e inicializada como variable primitiva, mostrar por consola lo siguiente:

1. Su longitud
2. El carácter asociado al índice 7
3. La subcadena "creere"
4. El índice que ocupa el carácter 'x'
5. La String transformada en mayúsculas
6. Por último, comprobar si el primer carácter de la String es 'E' y mostrar por
consola un mensaje que lo indique.

Todos los código se guardarán en c:\cursojava\tema3 o en


jcreator_home\MyProjects\tema3 si se realiza con JCreator

Por consola:

Longitud de la cadena: 46

Indice 7 asociado al caracter r

La subcadena generada desde 20 incluido hasta 26 excluido es creere

El indice del caracter x es 9

La cadena en mayusculas es: EN MI PROXIMA VIDA, CREERE EN LA REENCARNACION

La String comienza por E

Ejercicio 2
Crear una clase pública de nombre EjercicioString2 que contenga sólo al método
main y que muestre por consola el número de veces que aparece la letra "a" en la
siguiente String "Mañana es sabado sabadete y voy a irme a tomar unas copillas por
los barrios bajos de Logroño"

Por consola:

La letra a aparece 14 veces


Ejercicio 3
Crear una clase pública de nombre EjercicioString3 que contenga sólo al método
main y mostrar por consola el número de veces que aparecen las letras a, o y e en la
String del ejercicio anterior. Además, si el número de veces que se repite la a es
superior a 10 debe aparecer el mensaje "Exceso de a", si el número de veces que se
repite la o es superior a 5 debe mostrarse "Exceso de o" y si se repite más de 3 veces
la letra e debe mostrarse "Exceso de e"

Por consola:

La letra a aparece 14 veces

La letra o aparece 11 veces

La letra e aparece 5 veces

Exceso de letra a

Exceso de letra o

Exceso de letra e

FIN DE PROGRAMA

Ejercicio 4 (obligatorio)
Verificar si una cadena de texto almacenada en la String nif, es un NIF correcto o no.
Si lo es, se mostrará por consola su parte numérica; si no lo es se mostrará el
mensaje "NIF no valido". Se tendrá en cuenta lo siguiente:

Suponer que los NIFs tienen 8 dígitos y, a continuación, una letra (no importa que
sea mayúscula o minúscula).

PISTAS: dos condiciones que debe cumplir el NIF: tener 9 caracteres y que el último
sea una letra. Comprobado esto, verificar que el resto de caracteres son dígitos.

RECOMENDACIONES:

Usar el método length() de java.lang.String para conocer el número de caracteres de


una cadena de texto.

Usar el método estático isLetter(char c) de java.lang.Character para comprobar que


un carácter es una letra.

Usar el método estático isDigit(char c) de java.lang.Character para comprobar que un


carácter es un dígito.
Usar el método substring(int inicio, int fin) de java.lang.String para obtener la parte
numérica del nif

Esqueleto del código:

Por consola dos posibilidades:

• Si NIF correcto:

16156159B es un NIF valido

Parte numerica del NIF= 16156159

FIN DE PROGRAMA

• Si NIF incorrecto:

16156159 no es un NIF valido

FIN DE PROGRAMA

Ejercicio 5
Calcular el volumen de un cilindro y el de una esfera previa introducción de la altura
y radio del cilindro, así como del radio de la esfera. Se definirá un método para el
cálculo del volumen del cilindro y otro para el de la esfera. Se emplearán métodos
estáticos de la clase Math y la variable de campo estática que almacena el valor de
pi.

Volumen esfera=(4/3)*PI*R^3 Volumen cilindro=PI*R^2*H

NOTA: cuidado con las fórmulas que contienen fracciones. Java considera (4/3) como
1 ya que, por defecto, los numeros enteros se almacenan en una variable int y el
cociente de dos enteros para el programa es otro entero. Habría que hacer que el
numerador fuera un double para que el cociente también lo fuera. Cómo?

Por ejemplo sustituyendo (4/3) por (4.0/3). De este modo se tiene un cociente entre
un double y un entero. Es decir, un double.

Por consola:

Introduce la altura del cilindro: 2.5

Introduce el radio del cilindro: 3

Introduce el radio de la esfera: 5

Volumen cilindro=70.68583470577035

Volumen esfera=523.5987755982989

FIN DE PROGRAMA

Esqueleto del código:

Ejercicio 6
Realizar un programa Java compuesto de una clase pública de nombre
AdivinarNumero que contenga sólo al método main. Su objetivo será permitir que el
usuario averigüe un número entero generado aleatoriamente y comprendido entre
[0,100] que se almacenará, dentro del código del programa, en una variable int a la
que se llamará numero.

El programa pedirá un número por teclado e informará de si el número que introduce


el usuario es mayor o menor que el que se trata de averiguar. Si no se acierta a la
primera, no importa porque tiene que dejar introducir números de forma
ininterrumpida. Cuando el usuario acierte, se mostrará un mensaje de felicitación y el
número de intentos empleados. A tener en cuenta:

• Si el usuario introduce un numero no comprendido entre [0,100], el programa


mostrará un mensaje informativo

• Si el usuario teclea asterisco, el programa deberá finalizar

• La generación aleatoria del número a adivinar se realizará con el método


estático “void random()” de java.lang.Math.

Por consola:

---------------------------------------

Adivina un numero entero entre 0 y 100

---------------------------------------

Introduce un numero o pulsa * para salir

50

El numero buscado es menor

Introduce un numero o pulsa * para salir

100000

Fuera de rango. Intentalo de nuevo

Introduce un numero o pulsa * para salir

40

El numero buscado es mayor

Introduce un numero o pulsa * para salir


45

El numero buscado es menor

Introduce un numero o pulsa * para salir

42

El numero buscado es menor

Introduce un numero o pulsa * para salir

41

HAS ACERTADO!! despues de 6 intentos

FIN DE PROGRAMA

También podría gustarte