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 [Link], 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 [Link]
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 [Link]
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 [Link]
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 [Link] 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 [Link] 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 [Link]
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 [Link]
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 "[Link]" 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 [Link]" 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 [Link] 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 [Link], 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:
[Link]("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
[Link], 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 [Link] "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
[Link](3000) por [Link](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:
[Link](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 [Link](i) por [Link](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 [Link] 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:
[Link]([Link](2.3);// muestra por consola 3.0
[Link]([Link](0.895);// muestra por consola 1.0
[Link]([Link](-1.87);// muestra por consola –1.0
[Link]([Link](-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:
[Link]([Link](2.3);// muestra por consola 2.0
[Link]([Link](0.895);// muestra por consola 0.0
[Link]([Link](-1.87);// muestra por consola –2.0
[Link]([Link](-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:
[Link]([Link](0.891));// muestra por consola 1.0
Si se quisiera aproximar a dos decimales:
[Link]([Link](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 [Link] 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:
[Link]. 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
[Link]([Link](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:
[Link]. 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 [Link], 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 <[Link]>
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 [Link]
NOTA 1: si se desea que aparezca el contenido de la etiqueta @author
javadoc -author <[Link]>
NOTA 2: los javadocs son mucho más elaborados que el asociado al código anterior. Un ejemplo
puede obtenerse de
[Link]
Luego, sección Downloads/Current Releases y descargar el fichero [Link]
Después, se descomprime y se abre el fichero [Link] 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\[Link]
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 [Link] 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
[Link]. 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 [Link]. De aquí en adelante [Link]. 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";
[Link](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 “[Link](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 [Link]. 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 [Link]. 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
[Link].
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 [Link]. 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á
[Link] 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 [Link].
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á [Link] 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 [Link] 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 [Link] 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([Link]));
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 [Link] para conocer el número de caracteres de
una cadena de texto.
Usar el método estático isLetter(char c) de [Link] para comprobar que
un carácter es una letra.
Usar el método estático isDigit(char c) de [Link] para comprobar que un
carácter es un dígito.
Usar el método substring(int inicio, int fin) de [Link] 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 [Link].
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