practicas de java

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

Transcript of practicas de java

Page 1: practicas de java

1- Cuestiones básicas de Java Concepto de programa

Un programa es un conjunto de instrucciones que indican a un procesador, que puedeo no estar en un ordenador, las acciones que debe ejecutar. Estas instrucciones estánexpresadas en lenguaje o código máquina, único lenguaje que entienden losprocesadores.

Cada procesador tiene su propio código máquina de modo que si a un procesador lellegan 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, noentiende lo que dice.

Estas instrucciones de código máquina son una serie de secuencias de bytes. Cadabyte se compone de 8 bits y un bit puede ser un 0 o un 1. Un bit es la unidad mínima deinformación con la que es capaz de trabajar un procesador. Un ejemplo de byte podría sereste: 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 seobtiene el resultado deseado por el programador. ¿Cómo se crea un programa oaplicación?. Con un lenguaje de programación.

Lenguajes de programación Un lenguaje de programación es la herramienta utilizada para crear programas. Es unconjunto de normas, instrucciones y códigos prefijados que permiten construir

Page 2: practicas de java

programas capaces de ser interpretados por procesadores.

Es como el alfabeto de una lengua: para que una persona pueda comunicarse yentenderse con otra debe aprender las vocales, las consonantes, su pronunciación, cómose unen letras para formar palabras inteligibles, cómo se agrupan palabras para formarfrases, 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 puedarelacionarse con un procesador a través de un programa es necesario que aprenda lasreglas 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ódigomáquina porque hay muchos tipos (tantos como procesadores) y, además, porque seprograma con un lenguaje muy distinto al que habitualmente se emplea (recordar que lasinstrucciones de código máquina se expresan en bytes). Para evitar estos dos problemasse 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, entendiblespor los humanos. Su principal característica es que las instrucciones asociadas a losprogramas creados con ellos no trabajan directamente con el procesador, sino quepreviamente deben pasar a través de un filtro o compilador que las preparaadecuadamente 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 directamenteinterpretables por un procesador.

Ejemplo: Ensamblador.

Las instrucciones asociadas a programas creados con lenguajes de alto nivel debentransformarse en instrucciones de código máquina para que el procesador puedainterpretarlas; 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 paraun determinado procesador no vale para otro (una novela española no se entiende enChina a no ser que se traduzca).

Page 3: practicas de java

Con los programas que se quieren ejecutar en máquinas que no tienen el mismoprocesador ocurre lo mismo. De esto se deduce que se deben tener tantos compiladorescomo 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 VirtualMachine) 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, querecibe el nombre de código de bytes o Java bytecode, el código máquina nativoasociado 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 detraducir 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 lenguajeu otro

Page 4: practicas de java

Arquitectura ordenador + sistema operativo Hablando a nivel de ordenador, además del procesador debe considerarse elsistema 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. quetenga instalado; así, si se dispone de dos ordenadores con el mismo procesador perocon dos s.o. distintos (Windows y Linux, por ejemplo) y se realiza un programa quese compila usando el compilador asociado al primer ordenador (monta Windows),este programa, ya compilado, no podría ejecutarse en el segundo ordenador (montaLinux).

Si se desea ejecutar debería compilarse con el compilador asociado al segundoordenador. Esto significa que el programa no es portable o multiplataforma. En Java,mediante la JVM, se ha conseguido que todos los programas sean portables omultiplataforma.

En cambio, si se utiliza Java:

Page 5: practicas de java

Plataforma Es todo entorno físico o lógico sobre el que se puede ejecutar un programa oaplicació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 unprograma Java, basta con diseñar máquinas virtuales adecuadas para esosdispositivos y un mecanismo para introducir el código de bytes (habitualmenteInternet). En la actualidad, la programación en entornos no PC ni Mac, es una partemuy importante de Java, y además en continua evolución y desarrollo. El nombre querecibe dicha parte es Jini. Para más información www.jini.org

Así, por ejemplo, existen televisores interactivos, teléfonos celulares, relojes, cadenasde 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íaescuchar directamente archivos mp3 almacenados en páginas web o escucharconciertos 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

Page 6: practicas de java

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 laejecució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 deSun Microsystems relacionada con Java http://java.sun.com.

Sun Mycrosystems es la empresa americana que creó el lenguaje de programaciónJava allá por el año 1995. Se promocionan diciendo que son el punto en las empresaspuntocom y abogan por escribir código que cumpla la premisa "Write Once, RunAnywhere" que podría traducirse como "Escribe código una vez donde tu quieras yejecútalo cuantas veces quieras donde tú quieras, sin ningún retoque nirecompilación".

Dentro del J2SE se incluyen el compilador y la JVM (Java Virtual Machine) oMá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 puededescargarse el J2SE para Windows, Linux, Solaris, etc. Si se trabaja con sistemasoperativos 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 cursose va a trabajar con la versión 1.4.1 (se recomienda un mínimo de 128 MBde RAM). Si se cuenta con menos RAM, conviene instalarse cualquiera de lasversiones 1.3. El curso puede seguirse sin ningún problema con cualquiera de lasversiones. Ambas forman parte de la llamada plataforma Java2 (constituye laversión moderna del lenguaje). Antes de estas versión se tuvieron la 1.2.2, la1.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 yaque es la recomendada por Sun. Pues bien, además de J2SE la comunidad Javacuenta con las plataformas:

Page 7: practicas de java

J2EE (Java 2 Enterprise Edition)

Plataforma del lenguaje Java destinada al desarrollo de aplicacionesempresariales estructuradas típicamente en tres capas: capa de presentaciónde datos, capa de lógica de negocio y capa de datos persistentes (bases dedatos). Se compone de un conjunto de estándares y bibliotecas Java que permiten lacreación de las aplicaciones empresariales anteriormente citadas. Esta plataforma seutiliza sobre todo para programación en servidores. Sin conocer lo fundamental deJ2SE, resulta inviable introducirse en J2EE.

J2ME (Java 2 Micro Edition)

Plataforma del lenguaje Java destinada al desarrollo de aplicaciones parapequeños dispositivos móviles de memoria limitada, poca capacidad deprocesamiento y con interfaces gráficas limitadas. Típicamente teléfonos móviles,PDAs (Personal Assistent Digital), Pockets PCs, televisiones, relojes, sistemas deayuda para automóviles, tarjetas, etc. Como en J2EE, la base para programarmediante 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

Page 8: practicas de java

• 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 instalarloestando conectado a Internet.

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

Pulsado el enlace, aparecerá la ventanita de Guardar. Una vez descargado el exe, seejecutará y se abrirá un asistente de instalación. El proceso es muy sencillo: hay quedecir a todo que sí y seleccionar las opciones por defecto.

Finalizada la instalación, se creará colgando del disco duro un directorioc:\j2sdk1.4.X_XX

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

¿Cómo?

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

En Windows 2000, NT, Millenium y XP, picar con el derecho en Mi PC y seleccionarPropiedades. Luego, pestaña Opciones avanzadas, botón Variables de entorno y dobleclic en la variable del sistema Path. Hecho esto, se agrega la ruta indicada al final dela última existente, separada por un punto y coma.

Page 9: practicas de java

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ídeocorresponde a la descarga ya explicada y actualizada. Lo importante del vídeo vienedespués, es decir, en la instalación y configuración. Es fundamental la parte deCONFIGURACIÓN. Además, se explica como realizar la configuración enWindows 98.

<< ^ >>

Arquitectura ordenador + sistema operativo

Indice Programa Java

Programa Java Un programa o aplicación Java se compone de un conjunto de clases que contienenvariables de diversos tipos utilizadas para almacenar datos, y métodos queimplementan código capaz de manipular dichas variables y crear objetos oinstancias de clase, que permitan la interacción con otros métodos y variables deesas 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 seejecuta.

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 devariable debe escribirse un punto y coma (;). Se utilizan tabuladores para sangrar laslíneas de código con el fin de facilitar su legibilidad, aunque si se omiten no pasanada.

Ejemplo:

Page 10: practicas de java

Este programa consta de una clase de nombre PrimerSaludo, no declara ningunavariable y cuenta con dos métodos de nombres main y mostrarMensaje. Enprogramas más complejos, se tendrán varias clases, en cada clase habrá muchosmétodos y declaraciones de variables, dentro de los métodos se declararán tambiénvariables, etc. Por el momento, con esta sencilla clase nos conformaremos. Se va aexplicar 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 deentrada del programa (siempre se define de esta forma), la tercera es una instruccióno sentencia que muestra por la consola del DOS el mensaje entrecomillado, la cuartasirve para crear un objeto de la clase llamado ps mediante el que se llama o invoca aotros métodos de la clase, la quinta es la llamada mediante el objeto ps al métodomostrarMensaje(), la sexta muestra por consola el mensaje entrecomillado. Luegoaparece la definición del método mostrarMensaje() cuyo código hace que se muestrepor consola el mensaje entrecomillado. Después de compilar y ejecutar este programava 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 clasecontení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 ProgrammingInterface) 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>(tipo1arg1,tipo2 arg2,...){

Cuerpo del método;

Page 11: practicas de java

}

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, esdecir, accesibles sólo desde el cuerpo del método.

NOTA 2: la palabra clave o reservada return se emplea para truncar la ejecución deun método cuando el tipo de dato que devuelve es void o para obtener lo quedevuelve 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 puedenutilizarse como nombres de clases, métodos o variables. Se irán viendo durante elcurso. Hay unas 50. A título de ejemplo, todos los nombres de variables primitivascomo byte, short, int, long, etc. son palabras clave. También los modificadores deacceso, 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

Page 12: practicas de java

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

Page 13: practicas de java

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.

Page 14: practicas de java

Notas básicas de Java NOTA 1 BÁSICA

Un código fuente Java sólo puede tener una clase con el modificador deacceso public. Si el modificador de la clase es public, el código fuente debetener 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 seintenta 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 seintenta compilar, se produce error.

NOTA 2 BÁSICA

Si un código fuente Java tiene varias clases, lo habitual es que sólo una deellas 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 unmismo código fuente. Por el momento, se trabajará con un sólo métodomain. Si hubiera varios definidos en clases del mismo código fuente, sólo seejecuta uno de ellos; el resto no se ejecuta.

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

Page 15: practicas de java

La respuesta es: el asociado a la clase principal; esta clase principal la define elprogramador 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 laclase pública del código. El programador puede controlar qué clase va a ser laprincipal, 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 quecontiene el método main o punto de entrada del programa).

Ocurrirá lo siguiente: se podrá compilar pero no ejecutar (error deejecución). El programa carece de punto de entrada.

Se utilizan para recibir llamadas de otras clases, mediante la creación desdela clase llamante de un objeto de la clase a la que se invoca.

Ejemplo:

Page 16: practicas de java

NOTA 4 BÁSICA

Una clase Java puede comunicarse con clases que no se encuentran en sucó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 accederutilizando el nombre de la clase y la palabra reservada new.

Mediante este objeto se tiene acceso a los métodos y variables de instanciano privadas de esa clase. Se verá en los siguientes temas las característicasde una "variable de instancia" y el modificador de acceso aplicable avariables y métodos "private". Por el momento, sobre las variables deinstancia, bastará con saber que se declaran después de la clase y fuera decualquier 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

Page 17: practicas de java

FIN DEL PROGRAMA

NOTA 5 BÁSICA

Para acceder a los métodos y variables de instancia definidos en una clasedesde su metodo main se hace lo mismo que en la nota anterior, es decir, secrea un objeto de esa clase y mediante ese objeto se llama a los métodos yvariables 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 elmétodo main:

Ejemplo:

Page 18: practicas de java

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. Lohabitual es que un programa se componga de varias clases en distintos códigosfuente y que cada clase tenga varios métodos y variables de instancia. Para explicartipos de variables, bucles, estructuras condicionales y conceptos básicos deprogramación se empleará una clase y sólo el método main. Cuando se haganprogramas más complejos se emplearán varias clases y varios métodos en cadaclase. 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 "intcalcularCuadrado(int numero)" calcula un entero siempre y cuando reciba a través desu argumento otro.

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

SUN (Standford University Network), empresa creadora de Java, pone adisposición de los programadores, con el objetivo de que les sirva de apoyo para eldesarrollo de sus propias aplicaciones, una biblioteca de clases e interfaces,estructuradas en paquetes (packages), con multitud de métodos y variables decampo estáticas.

Esta biblioteca recibe el nombre de API (Application Programming Interface oInterfaz de programación para crear aplicaciones), y todo programador tieneque aprender a trabajar con ella porque es fundamental para poder desarrollaraplicaciones 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áticasde la API.

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

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

Page 19: practicas de java

• 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, apartir de ahora. Hecho esto, aparecerá un directorio docs colgando de j2sdk_home.Dentro de docs, abrir el index.html, luego enlace "API & Language" y, acontinuación, enlace "Java 2 Platform API Specification (NO FRAMES)".

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

Page 20: practicas de java

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:

Page 21: practicas de java

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

Page 22: practicas de java

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

1

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:

Page 23: practicas de java

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

Page 24: practicas de java

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

Page 25: practicas de java

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:

Page 26: practicas de java

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:

Page 27: practicas de java

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, secreará colgando del Workspace JavaCliente un proyecto vacío denombre tema2 y se agregará al proyecto, el fichero java mostradoabajo. Por tanto, este código se guardará en

Page 28: practicas de java

jcreator_home\MyProjects\tema2.

El modo de trabajo con el IDE a partir de ahora será crear unproyecto nuevo vacío por cada tema y agregar a ese proyecto todoslos 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

Page 29: practicas de java

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

Page 30: practicas de java

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:

Page 31: practicas de java

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:

Page 32: practicas de java

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

Page 33: practicas de java

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

Page 34: practicas de java

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

Page 35: practicas de java

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

5

1

6

1

1

Page 36: practicas de java

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

Page 37: practicas de java

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:

Page 38: practicas de java

• == 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:

Page 39: practicas de java

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:

Page 40: practicas de java

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.

Page 41: practicas de java

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:

Page 42: practicas de java

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:

Page 43: practicas de java

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:

Page 44: practicas de java

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:

Page 45: practicas de java

Por consola:

0

1

2

3

4

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

Page 46: practicas de java

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:

0 1 2

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:

0 1 2

Ejemplo 2:

Page 47: practicas de java

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.

Page 48: practicas de java

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:

Page 49: practicas de java

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:

0

1

2

3

4

5

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:

Page 50: practicas de java

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

Page 51: practicas de java

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:

Page 52: practicas de java

Por consola:

Jesus tiene 28 años

Sus ojos son azules

Jesus es mayor de edad

Page 53: practicas de java

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 devariables. Así, en las variables primitivas enteras (byte, short, int y long) dichoelemento nulo es 0, en las reales (float y double) es 0.0, en las booleanas es false yen 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

Page 54: practicas de java

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

Para invocar a una variable estática no se necesita crear un objeto de la clase enla 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:

Page 55: practicas de java

Por consola:

Jesus tiene 28 años

Sus ojos son azules

Su planeta es la Tierra

Jesus es mayor de edad

Page 56: practicas de java

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

Page 57: practicas de java

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:

Page 58: practicas de java

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:

Page 59: practicas de java

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

Page 60: practicas de java

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:

Page 61: practicas de java

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.

Page 62: practicas de java

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:

Page 63: practicas de java

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:

Page 64: practicas de java

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

Page 65: practicas de java

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

Page 66: practicas de java

true

false

true

☺ ☻ ♥ ♦ ♣ ♠ ♫ ☼ ► ◄ ↕ ‼ § ▬ ↨ ↑ ↓ → ← ∟ ↔ ▲ ▼ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ⌂ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? á í ó ú ñ Ñ ª º ¿ ® ½ ¼ ¡ « » ░ ▒ ▓ │ ┤ Á Â À © ╣ ║ ╗ ╝ ¢ ¥ ┐ └ ┴ ┬ ├ ─ ┼ ã Ã ╚ ╔ ╩ ╦ ╠ ═ ╬ ¤ ð Ð Ê Ë È ı Í Î Ï ┘ ┌ █ ▄ ¦ Ì ▀ Ó ß Ô Ò õ Õ µ þ Þ Ú Û Ù ý Ý ¯ ´ ± ‗ ¾ § ÷ ¸ ° ¨ • ¹ ³ ² ■

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:

Page 67: practicas de java

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.

Page 68: practicas de java

Por consola:

Llamando al metodo mostrarAtributos

Esto es un perro macho de color negro

Su nombre es Yako

Page 69: practicas de java

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 ejemplosrc\org\jCharts\axisChart\axisChart.java

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

Page 70: practicas de java

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

Page 71: practicas de java

Ejercicios Ejercicio 1

Resolver una ecuación de segundo grado y realizar una serie de cálculos con sussoluciones 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

Page 72: practicas de java

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á porconsola al ejecutarlo.

B) Si se elimina el modificador static del método mostrarEdad(..), qué modificacionesdeben 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?

Page 73: practicas de java

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.

Page 74: practicas de java

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,

Page 75: practicas de java

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:

Page 76: practicas de java

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

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

Page 77: practicas de java

propiedad de poder construirse como una variable primitiva. En esteconstructor 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 decrear 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:

4

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

Page 78: practicas de java

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.

Page 79: practicas de java

• 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

Page 80: practicas de java

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 decampo estática out (representa la salida estándar del sistema, es decir, la consola delDOS 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 conceptofundamental de la Programación Orientada a Objetos, se estudiará más adelante) ypor ello no va a ser necesario transformar sus argumentos en String ya que, en basea lo que le llegue se empleara una versión del método u otra. Por eso no se producenerrores cuando se pasa al método una variable primitiva ya sea booleana, entera oreal. 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 elmé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.

Page 81: practicas de java

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

Page 82: practicas de java

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:

Page 83: practicas de java

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

Page 84: practicas de java

Ejercicios Ejercicio 1

Crear una clase pública de nombre EjercicioString1 que contenga sólo al métodomain 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 enjcreator_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étodomain y que muestre por consola el número de veces que aparece la letra "a" en lasiguiente String "Mañana es sabado sabadete y voy a irme a tomar unas copillas porlos barrios bajos de Logroño"

Por consola:

La letra a aparece 14 veces

Page 85: practicas de java

Ejercicio 3 Crear una clase pública de nombre EjercicioString3 que contenga sólo al métodomain y mostrar por consola el número de veces que aparecen las letras a, o y e en laString del ejercicio anterior. Además, si el número de veces que se repite la a essuperior a 10 debe aparecer el mensaje "Exceso de a", si el número de veces que serepite la o es superior a 5 debe mostrarse "Exceso de o" y si se repite más de 3 vecesla 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á elmensaje "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 quesea mayúscula o minúscula).

PISTAS: dos condiciones que debe cumplir el NIF: tener 9 caracteres y que el últimosea 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 deuna cadena de texto.

Usar el método estático isLetter(char c) de java.lang.Character para comprobar queun carácter es una letra.

Usar el método estático isDigit(char c) de java.lang.Character para comprobar que uncarácter es un dígito.

Page 86: practicas de java

Usar el método substring(int inicio, int fin) de java.lang.String para obtener la partenumé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

Page 87: practicas de java

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) como1 ya que, por defecto, los numeros enteros se almacenan en una variable int y elcociente de dos enteros para el programa es otro entero. Habría que hacer que elnumerador 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 entreun 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

Page 88: practicas de java

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

Page 89: practicas de java

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