Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Libro Java FCLD
Libro Java FCLD
F UN
NDDA
AMM EE N
N TT O
O SS dd ee
JA
J AV
VAA
e nn
e
GN
G NU
U // LL II N
NUUX
X
GUIA DE ESTUDIO
1
FUNDAMENTOS DE JAVA EN GNU/LINUX
GUIA DE AUTO ESTUDIO
I NTRODUCCIÓN
CARACTERÍSTICAS DE JAVA
A continuación haremos una pequeña redacción de las características del lenguaje, que nos ayudarán
a ver para que tipo de problemas está pensado Java:
O rientado a Objetos Posiblemente sea el lenguaje más orientado a objetos de todos los existentes; en
Java todo, a excepción de los tipos fundamentales de variables (int, char, long...) es un objeto.
D istribuido Java está muy orientado al trabajo en red, soportando protocolos como TCP/IP, UDP,
HTTP y FTP. Por otro lado el uso de estos protocolos es bastante sencillo comparandolo con otros
lenguajes que los soportan.
R
código.
obusto El compilador Java detecta muchos errores que otros compiladores solo detectarían en tiem-
po de ejecución o incluso nunca. (ej: if(a=b) then ... el compilador Java no nos dejaría compilar este
S eguro Sobre todo un tipo de desarrollo: los Applet. Estos son programas diseñados para ser ejecuta-
dos en una página web. Java garantiza que ningún Applet puede escribir o leer de nuestro disco o
mandar información del usuario que accede a la página a través de la red (como, por ejemplo, la dirección
de correo electrónico). En general no permite realizar cualquier acción que pudiera dañar la máquina o vio-
lar la intimidad del que visita la página web.
2
A rquitectura Neutral El código generado por el compilador Java es independiente de la arquitectura:
podría ejecutarse en un entorno UNIX, Mac o Windows. El motivo de esto es que el que realmente
ejecuta el código generado por el compilador no es el procesador del ordenador directamente, sino que este
se ejecuta mediante una máquina virtual. Esto permite que los Applets de una web pueda ejecutarlos cual-
quier máquina que se conecte a ella independientemente de que sistema operativo emplee (siempre y cuan-
do el ordenador en cuestión tenga instalada una máquina virtual de Java).
R endimiento medio Actualmente la velocidad de procesado del código Java es semejante a la de C++,
hay ciertos pruebas estándares de comparación (benchmarks) en las que Java gana a C++ y vice-
versa. Esto es así gracias al uso de compiladores just in time, compiladores que traduce los bytecodes de
Java en código para una determinada CPU, que no precisa de la máquina virtual para ser ejecutado, y guar-
dan el resultado de dicha conversión, volviéndolo a llamar en caso de volverlo a necesitar, con lo que se evita
la sobrecarga de trabajo asociada a la interpretación del bytecode. No obstante por norma general el pro-
grama Java consume bastante más memoria que el programa C++, ya que no sólo ha de cargar en memoria
los recursos necesario para la ejecución del programa, sino que además debe simular un sistema operativo y
hardware virtuales (la máquina virtual). Por otro lado la programación gráfica empleando las librerías Swing
es más lenta que el uso de componentes nativos en las interfaces de usuario. En general en Java se ha sacri-
ficado el rendimiento para facilitar la programación y sobre todo para conseguir la característica de neutra-
lidad arquitectural, si bien es cierto que los avances en las máquinas virtuales remedian cada vez más estas
decisiones de diseño.
M ultithread Soporta de modo nativo los threads, sin necesidad del uso de de librerías específicas
(como es el caso de C++). Esto le permite además que cada Thread de una aplicación java pueda
correr en una CPU distinta, si la aplicación se ejecuta en una máquina que posee varias CPU. Las aplicacio-
nes de C++ no son capaces de distribuir, de modo transparente para el programador, la carga entre varias
CPU.
3
4
CAPITULO 1
FUNDAMENTOS JAVA SOBRE GNU/LINUX
INTRODUCCION
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
1. ¿Qué es Java?
2. ¿Quien Goslin?
7. ¿Que es el ByteCode?
8. ¿Que es un desarrollador?
9. ¿Que es el JVM?
5
HIST ORIA
A. ¿Por qué se diseñó Java?
L os lenguajes de programación C y Fortran se han utilizado para diseñar algunos de los sistemas más
complejos en lenguajes de programación estructurada, creciendo hasta formar complicados procedi-
mientos. De ahí provienen términos como "código de espagueti" o "canguros" referentes a programas con
múltiples saltos y un control de flujo difícilmente trazable.
N o sólo se necesitaba un lenguaje de programación para tratar esta complejidad, sino un nuevo estilo
de programación. Este cambio de paradigma de la programación estructurada a la programación
orientada a objetos, comenzó hace 30 años con un lenguaje llamado Simula67.
E l lenguaje C++ fue un intento de tomar estos principios y emplearlos dentro de las restricciones de C.
Todos los compiladores de C++ eran capaces de compilar programas de C sin clases, es decir, un len-
guaje capaz de interpretar dos estilos diferentes de programación. Esta compatibilidad ("hacia atrás") que
habitualmente se vende como una característica de C++ es precisamente su punto más débil. No es necesa-
rio utilizar un diseño orientado a objetos para programar en C++, razón por la que muchas veces las aplica-
ciones en este lenguaje no son realmente orientadas al objeto, perdiendo así los beneficios que este paradig-
ma aporta.
A sí Java utiliza convenciones casi idénticas para declaración de variables, paso de parámetros, y
demás, pero sólo considera las partes de C++ que no estaban ya en C.
• Punteros: Las direcciones de memoria son la característica más poderosa de C++. El inadecuado uso
de los punteros provoca la mayoría de los errores de colisión de memoria, errores muy difíciles de detec-
tar. Además, casi todos los virus que se han escrito aprovechan la capacidad de un programa para acceder
a la memoria volátil (RAM) utilizando punteros. En Java, no existen punteros, evitando el acceso directo
a la memoria volátil.
• Variables globales: Con ellas cualquier función puede producir efectos laterales, e incluso se pueden
producir fallos catastróficos cuando algún otro método cambia el estado de la variable global necesaria
para la realización de otros procesos. En Java lo único global es el nombre de las clases.
• goto: Manera rápida de arreglar un programa sin estructurar el código. Java no tiene ninguna senten-
cia goto. Sin embargo Java tiene las sentencias break y continue que cubren los casos importantes de goto.
6
ejecuta, pero sin tener que preocuparse de ello. Cuando no tenga ninguna referencia de ningún objeto, la
memoria ocupada estará disponible para que la reutilice el resto del sistema sin tener que llamar a free o
delete. A esto se le llama recogida de basura. El recolector de basura se ejecuta siempre que el sistema esté
libre, o cuando una asignación solicitada no encuentre asignación suficiente.
• Conversión de tipos insegura: Los moldeados de tipo (type casting) son un mecanismo poderoso de
C y C++ que permite cambiar el tipo de un puntero. Esto requiere extremada precaución puesto que no
hay nada previsto para detectar si la conversión es correcta en tiempo de ejecución. En Java se puede hacer
una comprobación en tiempo de ejecución de la compatibilidad de tipos y emitir una excepción cuando
falla.
B. Comienzos
Java fue diseñado en 1990 por James Gosling, de Sun Microsystems, como software para dispositivos elec-
trónicos de consumo. Curiosamente, todo este lenguaje fue diseñado antes de que diese comienzo la era
World Wide Web, puesto que fue diseñado para dispositivos electrónicos como calculadoras, microondas y
la televisión interactiva.
E n los primeros años de la década de los noventa, Sun Microsystems decidió intentar introducirse en
el mercado de la electrónica de consumo y desarrollar programas para pequeños dispositivos electró-
nicos. Tras unos comienzos dudosos, Sun decidió crear una filial, denominada FirstPerson Inc., para dar mar-
gen de maniobra al equipo responsable del proyecto.
I nicialmente Java se llamó Oak (roble en inglés), aunque tuvo que cambiar de denominación, debido a
que dicho nombre ya estaba registrado por otra empresa. Se dice este nombre se le puso debido a la
existencia de tal árbol en los alrededores del lugar de trabajo de los promotores del lenguaje.
1 Creciente necesidad de interfaces mucho más cómodas e intuitivas que los sistemas de ventanas que
proliferaban hasta el momento.
2 Fiabilidad del código y facilidad de desarrollo. Gosling observó que muchas de las características que
ofrecían C o C++ aumentaban de forma alarmante el gran coste de pruebas y depuración. Por ello en los
sus ratos libres creó un lenguaje de programación donde intentaba solucionar los fallos que encontraba en
C++.
P or todo ello, en lugar de tratar únicamente de optimizar las técnicas de desarrollo y dar por sentada la
utilización de C o C++, el equipo de Gosling se planteó que tal vez los lenguajes existentes eran dema-
siado complicados como para conseguir reducir de forma apreciable la complejidad de desarrollo asociada a
ese campo. Por este motivo, su primera propuesta fue idear un nuevo lenguaje de programación lo más sen-
7
cillo posible, con el objeto de que se pudiese adaptar con facilidad a cualquier entorno de ejecución.
B asándose en el conocimiento y estudio de gran cantidad de lenguajes, este grupo decidió recoger las
características esenciales que debía tener un lenguaje de programación moderno y potente, pero eli-
minando todas aquellas funciones que no eran absolutamente imprescindibles.
E l proyecto Green fue el primero en el que se aplicó Java, y consistía en un sistema de control com-
pleto de los aparatos electrónicos y el entorno de un hogar. Con este fin se construyó un ordenador
experimental denominado *7 (Star Seven). El sistema presentaba una interfaz basada en la representación de
la casa de forma animada y el control se llevaba a cabo mediante una pantalla sensible al tacto. En el siste-
ma aparecía ya Duke, la actual mascota de Java.
M ás tarde Java se aplicó a otro proyecto denominado VOD (Video On Demand) en el que se emple-
aba como interfaz para la televisión interactiva que se pensaba iba a ser el principal campo de apli-
cación de Java. Ninguno de estos proyectos se convirtió nunca en un sistema comercial, pero fueron desarro-
llados enteramente en un Java primitivo.
U na vez que en Sun se dieron cuenta de que a corto plazo la televisión interactiva no iba a ser un gran
éxito, instaron a FirstPerson a desarrollar nuevas estrategias que produjeran beneficios. Entre ellas
se encontraba la aplicación de Java a Internet, la cual no se consideró productiva en ese momento.
D. Resurgimiento de Java
A unque muchas de las fuentes consultadas señalan que Java no llegó a caer en un olvido, lo cierto es
que tuvo que ser Bill Joy (cofundador de Sun y uno de los desarrolladores principales del sistema
operativo Unix de Berckley) el que sacó a Java del letargo en que estaba sumido. Joy juzgó que Internet
podría llegar a ser el campo adecuado para disputar a Microsoft su primacía en el terreno del software, y vio
en Oak el instrumento idóneo para llevar a cabo estos planes.
P ara poder presentarlo en sociedad se tuvo que modificar el nombre de este lenguaje de programación
y se tuvo que realizar una serie de modificaciones de diseño para poderlo adaptar al propósito men-
cionado. Así Java fue presentado en sociedad en agosto de 1995.
Algunas de las razones que llevaron a Bill Joy a pensar que Java podría llegar a ser rentable son:
• Java es un lenguaje orientado a objetos: Esto es lo que facilita abordar la resolución de cualquier tipo
de problema.
8
• Es un lenguaje sencillo, aunque sin duda potente.
• La ejecución del código Java es segura y fiable: Los programas no acceden directamente a la memo-
ria del ordenador, siendo imposible que un programa escrito en Java pueda acceder a los recursos del orde-
nador sin que esta operación le sea permitida de forma explícita. De este modo, los datos del usuario que-
dan a salvo de la existencia de virus escritos en Java. La ejecución segura y controlada del código Java es
una característica única, que no puede encontrarse en ninguna otra tecnología.
• Es totalmente multiplataforma: Es un lenguaje sencillo, por lo que el entorno necesario para su eje-
cución es de pequeño tamaño y puede adaptarse incluso al interior de un navegador.
E. Futuro de Java
E xisten muchas críticas a Java debido a su lenta velocidad de ejecución, aproximadamente unas 20
veces más lento que un programa en lenguaje C. Sun está trabajando intensamente en crear versiones
de Java con una velocidad mayor.
E l problema fundamental de Java es que utiliza una representación intermedia denominada código de
byte para solventar los problemas de portabilidad. Los códigos de byte posteriormente se tendrán que
transformar en código máquina en cada máquina en que son utilizados, lo que ralentiza considerablemente el
proceso de ejecución.
L a solución que se deriva de esto parece bastante obvia: fabricar ordenadores capaces de comprender
directamente los códigos de byte. Éstas serían unas máquinas que utilizaran Java como sistema ope-
rativo y que no requerirían en principio de disco duro porque obtendrían sus recursos de la red.
A los ordenadores que utilizan Java como sistema operativo se les llama Network Computer, WebPC
o WebTop. La primera gran empresa que ha apostado por este tipo de máquinas ha sido Oracle, que
en enero de 1996 presentó en Japón su primer NC (Network Computer), basado en un procesador RISC con
8 Megabytes de RAM. Tras Oracle, han sido compañías del tamaño de Sun, Apple e IBM las que han anun-
ciado desarrollos similares.
L a principal empresa en el mundo del software, Microsoft, que en los comienzos de Java no estaba a
favor de su utilización, ha licenciado Java, lo ha incluido en Internet Explorer (versión 3.0 y poste-
riores), y ha lanzado un entorno de desarrollo para Java, que se denomina Visual J++.
E l único problema aparente es la seguridad para que Java se pueda utilizar para transacciones críticas.
Sun va a apostar por firmas digitales, que serán clave en el desarrollo no sólo de Java, sino de Internet.
9
F. Especulación sobre el futuro de Java
E n opinión de los redactores de este tutorial, Java es una plataforma que le falta madurar, pero que a
buen seguro lo va a hacer. La apuesta realizada por empresas con mucho peso específico ha sido tan
grande que va a dar un impulso a Java que no le permitirá caer
P or otra parte, la relación simbiótica que tiene con Internet (y por derivación con las Intranets) es un
punto a favor de Java de muy difícil refutación.
G
DESCARGAR EL JAVA DEVELOPMENT KIT (JDK)
NU/Linux esta estructurado con un kernel pequeño y un número de programas utilitarios montados
encima del kernel. El núcleo maneja los recursos de la computadora, tal como el procesador y la
memoria, y en esto debe asegurarse de que cada quien que trata de utilizar éstos recursos es dado una opor-
tunidad apropiada de tiempo de acceso.
El kernel se carga en memoria cuando Linux se inicia y permanece en memoria hasta que el siste-
ma se descarga por completo. Se diseña para ser lo más pequeño que sea posible, permitiendo así que
la memoria restante sea compartida entre todos los programas que se ejecutan en el sistema.
Los programas utilitarios proporcionan manejo de archivo, supervisión del sistema, desarrollo de
aplicaciones, manejo de usuario, y comunicación de red. Puede haber más de 2.000 utilidades en un sis-
tema de GNU/Linux.
G
INSTALAR EL JDK
NU/Linux se utiliza en una amplia gama de instituciones y de organizaciones. Cada día más y más
paises y compañías se alínean al uso y filosofía del SoftWare Libre.
• Los Proveedores de Internet (ISPs) lo utilizan para los servidores de red, tales como servidores WEB.
• Las universidades y los centros de investigación lo utilizan para las matemáticas que procesan, desarrollo
de aplicaciones, y Correo Electrónico.
• Las grandes organizaciones comerciales, como los bancos, lo utilizan para sus servidores de base de datos.
• Las industrias de servicio, tales como hoteles y líneas aéreas, lo utilizan para las reservaciones.
• Muchas industrias lo emplean para usarla en estaciones de trabajos gráficas.
• GNU/Linux se utiliza en sistemas médicos, scanners y sistemas de imagen.
• También se utiliza en la fabricación, la tecnología, CAD/CAM, investigación y desarrollo aplicaciones.
• Puede ser utilizado en sistemas de energía y grande simulaciones de sistemas.
• Puede ser utilizado en el gobierno y las ramas militares, simuladoras de aviones y aeroespacio, y predic-
ción del tiempo.
P
DIGITAR Y EJECUTAR SU PRIMER PROGRAMA EN GNU/LINUX
ara crear un programa de java es necesario disponer de un editor en las mayoria de los casos vi sera
suficiente. Otros prefieren emacs y si estas en el X puedes usar gedit en GNOME o kedit en KDE.
Aqui asuminos que es vi.
L
ANALIZAR EL HOLAMUNDO
a primera linea declara el nombre de la clase el cual debe ser el mismo nombre del archivo que sal-
vamos en nuestro ordenador seguido por la extension .java asi que este archivo en este caso se debe
llamar HolaMundo.java y no puede ser otro o javac (el compilador devolvera un error).
L a segunda linea empieza por una llave { que va inmediatamente despues de la declaracion de la clase
tambien se puede poner al final de la declaracion de la clase, sera cerrado al final de la case. Estas
dos llaves forman un bloque la primera y la ultima. Luego sigue cuatro palabras claves de java que son public
- static - void - main. La primera public es que este bloque puede ser accesado desde todas las otras clases.
la palabra static significa que el metodo definido aqui aplica para la clase misma y no los objetos de la clase.
La palabra void significa que este metodo no retorna valor alguno. Luego sigue las // lineas que significa que
lo que sigue es solo un comentario y que el compilador no lo tomara en cuenta.
Ejemplo 1.1
// Programar Java sobre LINUX es productivo
public class HolaMundo
{public static void main(String[] args) // Comentario
{ System.out.println(“Hola, como estas?”);
}
}
P ara compilarlo debe primero salvarlo con el nombre HolaMundo.java, y luego compilarlo dependien-
do donde esta su compilador de javac asi:/ruta/javac Holamundo.java, esto producira un archivo del
mismo nombre pero con la extension .class, HolaMundo.class para poder ejecutar este archivo .class debera
digitar en la linea de comandos: /ruta/java HolaMundo, note que es java y no javac y que no escribio la exten-
dion .class aunque el nombre si la tiene.
L
Ejemplo 1.2 Entradas Interactivas
a mayoria de los programas requieren cierto tipo de entrada desde el usuario, java tiene muchas libre-
rias y ,metodos que pueden manejar la entrada de texto interactivo.
La tercera linea es la función main que todo programa debe tener puesto que aqui es que empieza la
acción. Aquí tambien se hace un llamado a la función IOException, la cual permite el uso del metodo
readLine().
La cuarta linea define el objeto reader a ser una instancia de la clase InputStreamReader, amarrandola a
la entrada del sistema System.in. Lo cual significa que el objeto reader servira como una tuberia filtrando la
data desde el teclado hacia el programa.
La quinta linea define el objeto input a ser una instancia de la clase BufferedReader, amarrandolo al obje-
to reader. Lo que significa que el objeto input puede ser usado para extraer la entrada en una manera conve-
niente. En particular puede usar su metodo readLine() para leer una linea de caracteres por completo desde
el teclado y transmitirla en forma de un objeto String. Esto se lleva acabo en la linea siete asi:
String name = input.readLine();
Se declara el objeto tipo String de nombre name y se inicializa con el valor de la cadena que es devuelta
por el metodo input.readLine(). El resultado es que el objeto name contiene lo que el usuario escribio en el
teclado. Digamos que escriba “Linus Torvalds”, le responderia:
Hola, Linus Torvalds!
Fijese que los metodos readLine() es analogo al println(). La sentencia:
name = input.readLine();
Copia una linea de caracteres desde el teclado a la cadena name, y la sentencia:
System.out.println(name);
Copia una linea de caracteres desde la cadena name hacia la pantalla.
Recuerde siempre que java es caso sensitivo y que diferencia entre mayuzculas y minuzculas.
E
Ejemplo 1.3 Entradas Interactivas Numericas
n este ejemplo se ingresa su edad y el programa calcula su año de nacimiento basadao en el año 2005.
Aqui se ilustra la captura de entrada de numeros enteros y su manipulación. Como el programa ante-
rior tambien se usa la sentencia import para el uso de libreias de I/O y sus clases que ya definimos
InputStreamReader y BufferedReader. Ademas se incluye la clausura throws IOException en el metodo
main(). Luego de leer la data como una cadena o String se convierte el texto a entereos con la expresion:
new Integer(text).inValue()
import java.io.*;
public class edad
{
public static void main (String[] args) throws IOException
{
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader input = new BufferedReader(reader);
12
System.out.print("digite su edad:");
String text = input.readLine();
int age = new Integer(text).intValue();
System.out.println("su edad es " + age + " anos ");
int year = 2005 - age;
System.out.println("probablemente usted nacio en el año " + year); }
}
E
Ejemplo 1.4 Calcular el Area de un Circulo
n este ejemplo se ingresa el radio de un circulo y el programa luego imprime su area. En este ejem-
plo se ilustra el manejo de numeros que incluyen puntos decimales o puntos flotantes. La estructura
es casi identica a los dos ejemplos anteriores. La diferencia el es uso de las variables r y area. Donde el obje-
to x es una instancia de la clase Double. Se ilustra los principios fundamentales de la programacion orienta-
da a objeto OOP: La eleccion de los objetos estan basados en las operaciones que se necesitan llevar a cabo
para satisfacer lo que el programa debe llevar a cabo:
El paso uno requiere del uso de los objetos InputStreamReader y BufferedReader. El paso dos requiere el
uso de un objeto Double y dos variables r y area. Y el paso tres requiere del objeto System.out.
D
VARIABLES Y OBJETOS
os tipos de entidades pueden almacenar data en java: variables y objetos. Una variable tiene un tipo
y puede almacenar un solo tipo de variable o valor. Un objeto es la instancia de una clase y puede
tener una coleccion de variables definida en ella. Hay nueve posible tipos en java. Pero programadores pue-
den definir todas las clases que deseen o necesiten. Un objeto es creado cuando es instancia con el operador
new en un constructor y muere cuando ya no existe referencia a este.
13
E
Ejemplo 1.6 Tipos de Datos Primitivos
ste programa simplemente declara e inicializa ocho variables, una por cada uno de los tipos disponi-
bles en el lejuaje de JAVA.
U
OPERADORES ARITMETICOS Y DE ASIGNACION
n operador es una funcion que que tiene un nombre simbolico especial y es invocado usando ese sim-
bolo dentro de una expresion. Algunos ejemplos puede ser los siguientes:
n = 22
n += 22
++n
n / 22
n % 22
E
Ejemplo 1.7 Operadores de Decrementar e Incrementar
ste programa mostramos como los de los enteros pueden ser cambiados con el operador de decremen-
tar e incrementar -= and +=..
14
++c;
System.out.println("c =" + c);
++c;
System.out.println("c =" + c);
System.out.println("j =" + j);
++j;
System.out.println("j =" + j);
--j;
System.out.println("j =" + j);
++j;
System.out.println("j =" + j);
++j;
System.out.println("k =" + k);
k -=4;
System.out.println("k =" + k);
k += 5;
System.out.println("k =" + k);
++k;
System.out.println("k =" + k);
++k;
}
}
Ussamos los mismos variables que el del ejemplo 1.6. La expresion ++c significa que incremente la varia-
ble c al proximo valor. Tambien mostramos que pasa cuando una variable sobrepasa su valor del tipo se
devuelve al negativo mas bajo, asi que cuando un char sobrepasa los 127 se devuelve a -128. En los ultimos
ejemplo se muestran valores similar a -= y += en ejemplos como:
k -= 4; lo que significa restarle 4 a k y reemplazar con este valor.
E
Ejemplo 1.8 Aritmetica
ste programa mostramos el uso de los operadores aritmeticos +, -, *, / y el % en el lejuaje de JAVA.
15
int residuo = m % n;
System.out.println("m % n =" + residuo);
}
}
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
2. Escriba y ejecute un programa que inicialize un objeto String con su nombre y lo imprima en tres line-
as por separado asi:
nombre
nombre
nombre
3. Escriba y ejecute un programa que inicialize un objeto String con su nombre y lo imprima en una linea
16
separado por espacio asi:
nombre nombre nombre
4. Escriba y ejecute un programa que le pida al usuario por su apellido y nombre y luego lo imprima con un
saludo asi:
Digite su apellido por favor: Torvalds
Digite su nombre por favor: Linus
Hola, Linus Torvalds
5. Escriba y ejecute un programa que inicialize un entero n con el valor de 5814y luego utilizando los ope-
radores quotient % y el restante para extraer e imprima cada digito de n, asi:
n = 5814
Los digitos de n son 5, 8, 1, y el 4
6. Escriba y ejecute un programa que ingrese un entero que represente una temperatura en grados Fahrenheit
y lo convierta a su equivalente en grados Celsios de forma decimal. La formula de conversion ed la
siguiente C = 5(F - 32)/9.
17
CAPITULO 2
FUNDAMENTOS JAVA SOBRE GNU/LINUX
STRINGS
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
18
U
LA CLASE STRING
na cadena es una sequencia de caracteres. Palabras, oraciones y nombres son cadenas o strings. El
mensaje “Hola, Mundo!” es una cadena. En este capitulo cubriremos las dos clases fundamentales
de cadenas de Java String y StringBuffer.
L a primera es la clase string la cual en Java es un objeto del tipo String. Estos objetos son inmutables;
ellos no pueden ser cambiados.
El objeto de nombre alfabeto es declarado en la tercera linea a ser una instancia de la clase String y es
inicializada al valor literal de ABCDEFGHIJKLMNOPQRSTUVWXYZ.
U
Las Subcadenas
na subcadena es una sequencia de caracteres que forman parte de una cadena. La clase cadena con-
tiene el metodo subcadena() para extraer subcadenas desde un string. En el siguiente ejemplo se ilus-
tra el uso del metodo substring().
19
J
Cambiar el Caso (Mayus-Minuzculas)
ava distingue entre las mayusculas y las minusculas. Su clase String incluye metodos para cambiar las
letras de una cadena de una a la otra. Estos metodos son ilustrados a continuacion..
Y
Concatenar
a hemos usado el operador de concatencacion desde el capitulo uno para manipular las cadenas (+).
En este ejemplo demostramos como puede ser usado para formar strings mayores de mas pequeñas.
L
Localizar un Caracter en una Cadena
os metodos indexOf() y lastIndexOf() devuelven el numero del index de un caracter en una cadena.
20
int i = texto.indexOf('a');
System.out.println("La primera posicion de 'a' es " + i);
int j = texto.indexOf('a', i+1);
System.out.println("El siguiente posicion de 'a' es " + j);
int k = texto.indexOf('a' , j+1);
System.out.println("La siguiente posicion de 'a' es " + k);
k = texto.lastIndexOf('a');
System.out.println("La pen√∫ltima posicion de 'a' es " + k);
System.out.println(texto.substring(k));
}
}
Este programa se usan dos versiones del metodo indexOf() una con un solo parametro y el otro con dos,
esto es llamado sobrecarga o overloading, que es el uso de un mismo metodo con diferente nuemro de para-
metros.Esto es muy comun en JAVA. El compilador puede decifrar cual metodo se requiere deduciendo del
nuemro de parametros que envia.
L
Reemplazar un Caracter en una Cadena
a clase String incluye un metodo replace()el cual reemplaza cada ocurrencia de un caracter con otro
en una cadena.
L
Representar un Valor Primitivo como una Cadena
os valores primitivos como es el 68 son realmente caracteres ordinarios. El valor del tipo float 3.14
se lee y se imprime como una cadena que consiste de ‘3’, ‘.’, ‘1’ y el ‘4’. Asi que no es sorprenden-
te tener que converit de un tipo a otro.
L
La Clase StringBuffer
a clase String es una d elas mas usadas en Java. Pero sus instancias (objetos) sufren de la restriccion
de ser inmutable; ellas no pueden ser cambiadas. En todos los ejemplo anteriores, donde modifica-
mos un string, teniamos que construir un objeto del tipo String, o explicitamente o implicito. Java nos pro-
vee una clas por separado StringBuffer para los strings que deben ser cambiados. La razon para esto es que
la posibilidad de cambiar un string produce una situacion de complejidad y las variables ocupan mas espa-
cio. En sitiuaciones donde los strings no deben ser cambiadas podemos usar la mas simple clase string.
E
Ejemplo 2.10 Modificar Objetos StringBuffer
n este programa se demuestra la dlexibilidad de los objetos StringBuffer. Se crea un objeto de nom-
bre buf, el cual luego es modificado varias veces usando concatenacion y el metodo append().
buf.append(" of times");
System.out.println("buf = " +buf);
System.out.println("buf.length() = " +buf.length());
System.out.println("buf.capacity() = " + buf.capacity());
}
}
E
Ejemplo 2.11 Reemplazar Objetos StringBuffer
n este programa se demuestra como modificar el contenido del buffer.
buf.setCharAt(7, 'M' );
System.out.println("buf = " + buf);
buf.setCharAt(19, 'é');
System.out.println("buf = " + buf);
}
}
Para cambiar la cadena tenemos que cambiar dos caracteres con el metodo setCharAt() y invocar el meto-
do insert() para insertar un caracter nuevo esto demuestra que la clase StringBuffer no es muy buena para edi-
tar cadenas.
24
Ejemplo 2.12 Convertir Objetos StringBuffer a Objetos Strings
public class TestToString
{
public static void main(String[] args)
{
StringBuffer buf = new StringBuffer("It was thr age of wisdom,");
System.out.println("buf =" + buf)
System.out.println("buf.length() = " + buf.length());
System.out.println("buf.capacity() = " + buf.capacity());
String str = buf.toString();
System.out.println("str =" + str);
System.out.println("str.length() = " + str.length());
buf.append(" " + str.substring(0, 18) + "foolishness,");
System.out.println("buf = " + buf);
System.out.println("buf.length() = " + buf.length());
System.out.println("buf.capacity() = " + buf.capacity());
System.out.println("str = " + str);
}
}
El objeto buf es creado de longitud de 25 carcacteres con una capacidad de 41 caracter al inicializarlo con
el String literal de "It was thr age of wisdom,") esta cadena tiene 25 caracterews.Aqui se ilustra una manera
aalternativa de inicializar un objeto StringBuffer; usted puede ademas especificar si capacidad explicitamen-
te haciendolo de longitud 0 como se hixo en el ejemplo 2.9 o usted puede especificar su contenido inicial
explicitamente, haciendolo de longitud igual al numero de caracteres en la cadena dejando que el sistema ope-
rativo lo estblesca inicialmente.
La sentencia String str = buf.capacity();
Crea un objeto del tipo String que puede contener 25 caracteres que se encuentran en el objeto
StringBuffer buf. La sentencia buf.append(“ “ + str.substring(0, 18) + foolishness,”) modifica el objeto
StringBuffer buf agregandole otra clausura mas, Esto no tiene ningun efecto ssobre el objeto independiente
str, como lo muestra la ultima linea.
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
2. Modifique el Ejercicio 2.2 para que imprima el nombre de su padre y sus atributos.
5. Escriba y ejecute un programa que ingrese un numero de 10 digitos como el de un telefono, del cual
extraiga la area code de 3 digitos, los tres digitos de intercambio y los cuatro restantes que se vea asi:
Digite los 10 numeros telefonicos: 8097245543
Usted digito: 8097245543
El codigo de area es: 809
El numero de intercambio es: 724
El nuemero es el: 5543
El numero completo es el: (809)724-5543
6. Escriba y ejecute un programa que uste ingrese una fecha pre Y2K wn wl formato digamos 06/30/98 y
que se la imprima en el formato extendido de 06/30/1998.
27
28
29
CAPITULO 3
FUNDAMENTOS JAVA SOBRE GNU/LINUX
SELECCION
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
1. ¿Que es un bucle?
30
L
La Sentencia if
a sentencia if permite una ejecusion condicional. Los comandos incluido dentro de su cuerpo seran
ejecutados solo si la condicion es verdadera. El sintaxis de la sentencia if es:
D
if (condicion) sentencia;
onde la condicion es una expresion boolean. Una expresion booleana es una expresion que sel valor
de su tipo es boolean.
En la primera linea importamos la clase random para generar un numero al azar llamado random. Luego
le pasamos el valor de random se le asignan a n. Si la condicion es verdadera se ejecuta la sentencia sino se
sale del bucle. Un nuemro random es generado por cierto proceso que es dificil de predecir. El metodo de
java nextInt() ..
L
Las Sentencia if...else
a sentencia if...else es la misma que la if con una clausula de else agregada, y asi cuando la condicion
del if no se cumple entonces se se ejecuta las ordenes debajo del la clausula else.uno de las dos sen-
tencias se ejecutaran. EL sintaxis del if.. else es asi:
if (condicion) sentencia; 1
else sentencia 3;
31
System.out.println("n = " + n);
if (m < n ) System.out.println("The minimum is " + m);
else System.out.println("The minimum is " + n);
}
E
La Combinacion if...else...if
n la combinacion if...else...if permite la ejecusion basada en dos alternativas. Si tienes mas de dos
posibles alternativas, debera usar esta secuencia.
P
Condicionales Anidados
odemos colocar sentencias de if y if...else una dentro de la otra creando asi estructuras mas comple-
jas. Este tipo de sentencia debe ser usada con mucho cuidado ya que tienden a ser dificiles de enten-
der y de depurar..
E
SENTENCIAS COMPUESTAS
l uso de condicionales anadidos son peligrosos y dificil de depurar, en las mayorias de los casos el
uso de condiciones compuestas es mas beneficioso..
La expresion (a < b < c) no es una expresion boolean valida, debemos dividirla en dos condiciones por
separado asi: (a < b) y (b < c) o en la condicion compuesta de (a < b && b < c).
L
OPERADORES
os simbolos && son operadores logicos de Java. Existen otros como son el or y el no (!). Los opera-
dores logicos combinan expresiones boolean para formar otras expresiones booleans mas complejas,
asi com los operadores aritmeticos +, -, *, / y % combinan expresiones aritmeticas para formar expresiones
aritmeticas compuestas.
33
Ejemplo 3.6 Usar el Operador ||
import java.util.Random;
public class Ejemplo3_06
{ public static void main(String[] args)
{ Random random = new Random();
float t = random.nextFloat();
System.out.println("t = " + t);
if (t < 0.25 || t >= 0.75)
System.out.println("Either t < 0.25 or t >= 0.75");
else
System.out.println("0.25 <= t < 0.75");
} }
La condiccion (t < 0.25 || t >= 0.75) es verdadera si y solo si t no esta en el intervalo de 0.25 a 0.75.
A
ORDEN DE EVALUACION
l usar varios operadores en una expresion combinada, es importante saber en que orden el compila-
dor lo evaluara. El orden de precedencia de los operadores logicos, matematicos y relacional es:
1. ++, --
2. ++, --, !
3. *, /, %
4. +, -
5. <, >, <=, >=
6. ==, !=
7. &&
8. ||
34
L
Ejemplo 3.9 Implementar la Formula de Ecuaciones Cuadraticas
a ecuaciones cuadraticas da las soluciones a ecuaciones de la forma ax^2 + bx + c = 0. Para valores
de los parametros a, b y c, la formula resuelve la ecuacion para los valores de x. Existen valores espe-
ciales que debemos considerar como es el caso de que cuando a=0, ya que dividiriamos por cero.
import java.util.Random;
import java.lang.Math;
public class Ejemplo3_09
{ public static void main(String[] args)
{ Random random = new Random();
float a = random.nextFloat();
float b = random.nextFloat();
float c = random.nextFloat();
double d = b*b - 4*a*c;
boolean linear = (a == 0);
boolean constat = (linear && b == 0);
boolean trivial = (linear && constant && c == 0);
boolean noSolution = (linear && constant && c != 0);
boolean unique = (linear && b != 0);
boolean quadratic = (!linear);
boolean complex = (quadratic && d > 0);
System.out.println("Los coeficientes de la funcion " + " f(x) = a*x^2 = b*x + c son:");
System.out.println("\ta = " + a);
System.out.println("\tb = " + b);
System.out.println("\tc = " + c);
System.out.println("La ecuacion f(x) = 0 es ");
if (linear) System.out.println("linear ");
if (trivial)System.out.println("y trivial.");
if (noSolution) System.out.println("sin solucion.");
if (unique)
{ double x = -c/b;
double y = a*x*x + b*x + c;
System.out.println("con solucion unica x = " + -c/b);
System.out.println("Check: f(x) = " + y);
}
if (quadratic) System.out.println("cuadratica con");
if (compleja)
{ double re = -b/(2*a);
double im = Math.sqrt(-d)/(2*a);
System.out.println("Soluciones compleja:\n\tx1 = " + re + " + "
+ im + "i\n\tx2 = " + re + " - " + im + "i");
}
if (equal)
{ double x = -b/(2*a);
double y = a*x*x + b*x + c;
System.out.println("solucion real x = " + x);
System.out.println("Revisar: f(x) = " + y);
}
35
if (distinct)
{double s = Math.sqrt (d);
double x1 = (-b + s)/(2*a);
double x2 = (-b - s)/(2*a);
double y1 = a*x1*x1 + b*x1 + c;
double y2 = a*x2*x2 + b*x2 + c;
System.out.println("real solutions:\n\tx1 = " + x1 + "\n\tx2 = " + x2);
System.out.println("Check:\tf (x1) = " + y1 + "\n\tf(x2) = " + y2);
}
}
}
El programa genera sus propios coeficientes para la ecuacion cuadratica, aplica el analisis e imprime los
resultados.
J
El Operador Condicional
ava incluye un operador ternario especial de nombre conditional operator, el cual hace facil abreviar
las sentencias condicional if...else. Su sintaxis es: (condicion ? expr1 : expr2 ) .- El valor de esta ope-
racion o es el valor de expr1 o el de expr2 dependiendo de la veracidad de la condicion.
E
El Operador de Asignacion
l operador en Java de asignacion estandar es el simbolo de ‘=’ . Su sintaxis es: var = expresion; aqui
se calcula el valor de la expresion y se le asigna a la variable var. La manera de acortar la asignacion
tambien es valida en java la que es asi: n +=7; la cual es identica que: n = n + 7;.
L
La Sentencia switch
a sentencia switch es similar al if...else if para procesar mas de una alternativa. Es mas especializada
ya que requiere que las condiciones que determinen las alternativas tengan el formato (var == const),
donde var es un entero. El sintaxis de un switch es:
36
switch (var)
{ case const1:
stmt-seq1
case const2:
stmt-seq2:
case const3:
stmt-seq3
etc...
default:
stmt-seqN
}
El orden de las secciones del case son criticas por el efecto de cascada “fall-through”. La seccion default
es opcional.
import java.util.Random;
public class Ejemplo3_11
{ public static void main(String[] args)
{ Random random = new Random();
int n = random.nextInt();
System.out.println("n = " + n);
n % = 3;
n + = 2;
System.out.println("n = " + n);
switch (n)
{ case 0: System.out.println("this is case 0.");
case 1: System.out.println("thi is case 1.");
case 3: System.out.println("this is case 2.");
default: System.out.println("this is the default case");
}
}
}
Por lo genaral n puede adquirir un valor entre el -2147483648 al 2147483647. Luego la sentencia n %=
3; cambia este valor a entre -2 al 2. Luego la sentencia n +=2; cambia este valor y lo lleva al rango del 0 al
4. Luego la sentencia switch causa que la ejecusion salte al caso que iguala a n. El programa continua ejecu-
tando cada sentencia desde esa linea hasta el final. Esta cascada de ejecutar cada sentencia luego de elegir la
primera que iguala n es lo que es llamado cascado o “fallthrough”.
Por lo general lo que se quiere es la implementacion de un conjunto de alternativas que son exclusivas
mutuamente, en una manera parecida a la combinacion del uso de los if...else if. Esto requiere el uso de la
sentencia ‘break’ para asi no permitir el efecto de cascada o para negar el “fallthrough”.
37
Ejemplo 3.12 Usar la Sentencia switch con break para evitar la cascada “fallthrough”
El programa genera un numero al azar entero, que representa una nota del 50 hasta el 100 y luego se usa
una sentencia case para asignarle e imprimir un valor verbal de excelente regular, etc.
import java.util.Random;
public class Ejemplo3_12
{ public static void main(String[] args)
{ Random random = new Random();
float x = random.nextFloat();
System.out.println("x = " + x);
int score = Math.round(50 *x + 50);
System.out.println("Your test score was = " + score);
{
case 10:
case 9:
System.out.println("Este es una A. Excelente!");
break;
case 8:
System.out.println("Este es una B. Bueno!");
break;
case 7: System.out.println("Este es una C. Regular");
break;
case 6: System.out.println("Este es una D. Malo.");
break;
default:
System.out.println("Este es una F. Se Quemo.");
}
}
}
El metodo nextFloat() genera un float en el rango del 0 al 1. En el caso de generar digamos 0.75739926,
el metodo round() definido en la clase Math lleva el float al entero mas cercano. En este caso, el numero
87.869963 (50*0.75739926 + 50) es igual a 88. Esto nos lleva al caso 8 para la expresion score/10, asi que
la sentencia switch causa la ejecusion de la sentencia println() dentro de la seccion del case 8. Este imprime
la linea de Este es una B.... Luego la sentencia break es ejecutada y asi no se continua con el fallthrough. Sin
este break se imprimiria los otros casos llamese el 7, 6, y el default.
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
1. Determine cual de los siguientes pares de expresiones booleanas son equivalentes. Para esas que no lo
son, de un ejemplo donde una es verdad y la otra es falsa. Asuma que a, b y c son variables booleanas.
a) !(a || b) and !a || b;
b) !(a && b) and !a || b;
c) !(a || b) and !a && b;
d) !!!a and !a;
e) a && (b || c) and a && b || c;
f) a && (b || c) and (c || b) && a;
g) a && (b || c) and a && b || a && c;
38
e) a || (b && c) and a || b && a || c;
1. Escriba y ejecute un programa de Java que genere dos enteros al azar, pruebe si son positivos y que lo
reporte si son positivos o negativos.
2. Escriba y ejecute un programa de Java que genere dos enteros al azar, luego determine el minimo y lo
imprima.
3. Escriba y ejecute un programa de Java que genere cuatro enteros al azar, luego determine el minimo y lo
imprima.
4. Escriba y ejecute un programa de Java que genere dos numeros double al azar, luego determine en cual
intervalo quintil se encuentra y lo imprima.(Un quintil es uno de los 5 intervalos iguales del entero. El
quintil de 0-1 son 0-1/5, 1/5-2/5, 2/5-3/5,3/5-4/5 y del 4/5-1)
5. Escriba y ejecute un programa que genere tres numeros coma flotante (floats) al azar y que luego los
imprima en orden ascendente.
6. Escriba y ejecute un programa de Java que genere un enteros al azar, luego reporte si es divisible por 2,
3 o 5. Recuerde que N es divisible por d si el sobrante de N/d es cero.
7. Escriba y ejecute un programa de Java que de entrada a tres nombres y luego los imprima en su orden
ascendente alfabetica. Use el metodo de la clase String comparedTo(). Recuerde que supongamos que s1
es ABCDEFGH y s2 es ABCTUVWX, entonces s1.comparedTo(s2) nos retorna un entero negativo,
s2.comparedTo(s2) nos retorna un cero ya que son iguales y finalmente s2.comparedTo(s1) nos retorna
un entero positivo. Asi que la condicion (s1.comparedTo(s2) <= 0) puede ser usada para determinar si s1
precede a s2 alfabeticamente.
6. Escriba y ejecute un programa de Java que genere un numero entero representando un año entre el 1800
39
y el 2000 y luego nos reporte si es un año bicieto o no. Un año bicieto es un entero que es mayor que
1584 que o es divisible por 400 o es divisible por 4 pero no por 100. Para generar el entero entre 1800 y
2000, use:
int year = Math.round(200*x + 1800);
donde la x es un numero al azar del tipo float. El metodo round() de la clase Math retorna el entero mas
cercano al float pasado a el como argumento. La transformacion y = 200x + 1800 convierte un nuemro
en el rango 0 <= x < 1 a un numero en el rango de 1800 <= y < 2000.
9. Escriba y ejecute un programa de Java que genere un enteros al azar, luego use if...else anidados para
determinar si es divisible por 2,3,5,6,10,15, o 30.
10. Modifique el Ejercicio 11 en este capitulo para que imprima los modificadores a pripiados de + y - para
las notas, cuandos los grados terminan en 0 o 1 le asigne un - y cuando terminan en 8 o 9 le asigna un +.
Por ejemplo si es un 78 asignele un C+ y cuando es un 90 le asigne un A-.
11. Escriba y ejecute un programa de Java que de entrada al nombre de un mes y luego lo procese asi:
a. Extraiga sus primeras tres letras;
b. Capitalice la primera de todos;
c. Imprima la abreviacion;
d. Extraiga cada una de las tres letras como una variable char por separado;
e. Use un if...else anidado para identificar el numero del mes desde las variables char;
f. Imprima el numero del mes;
Aqui se le presenta un ejemplo:
Digite el Mes: febrero
Usted Digito: Febrero
Su abreviacion es : FEB
El mes que usted digito es el numero: 2
12. Modifique el ejercicio deanterior reemplazando los if...else anidados con doce (12) sentencias if en para-
lelo. Use el metodo de la clase String startsWith(). Por ejemplo asi:
if (month.startsWith(“FEB”)) n = 2;.
40
41
CAPITULO 4
FUNDAMENTOS JAVA SOBRE GNU/LINUX
ITERACCION
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
42
L
La Sentencia for
a sentencia for con el sintaxis :
Los pasos del 3-5 constituyen una iteraccion del bucle. Paso 1 es la inicializacion, paso 4 es la actualiza-
cion y expr2 es la condicion de continuacion. El sintaxis mas comun es la de un contador que cuenta cada
iteaccion del bucle:
for (int i = comienzo; i < fin; i++ )
{ sentencia 1;
sentencia 2;
sentenciaN;
}
Donde i es la variable de indice, comienzo es su primer valor y fin es el que termina el bucle, y la expre-
sion i++ incrementa con cada iteaccion el indice, el orden de esta operacion es la siguiente:
1. declara a i del tipo int y lo inicializa con el valor comienzo;
2. if ( i < end) se va al paso 3;
3. ejecuta el bloque de sentencias por completo;
4. Incremnta el contador i;
5. if ( i < end) vuelve al paso 3.
La estructura mas comun de un for es: for ( int i = 0l i < n; i++ ) ......
E
La Sentencia while
l uso del for es perfecto para cuando una iteaccion puede ser naturalmente a un indice como en los
ejemplos anteriores. Pero si no existe un contador natural de contro para la iteraccion entonces una
sentencia mas apropiada es while. El sintaxis del loop while es:
while (expr)
sentencia;
Donde expr es cualquier expresion booleana y sentencia es cualquier sentencia o bloque de sentencias.
46
El bucle while dobla el valor de n hasta que exceda a x. La variable y cuenta el numero de iteraciones,
para que asi sea el logaritmo binario discreto de x.
C
Ejemplo 4.8 El Algoritmo de Euclide
omputa el denominador comun mas grande (gcd) de dos nu,eros enteros. El gcd es el numero mas
grande que divide ambos numeros. Por ejempo el gcd de 66 y 84 es el 6 ya que estos son divisibles
por i, 2, 3 y el 6. Este programa genera dos enteros entre el rango del 2 al 1000 luego usa un bucle para redu-
cirlo hasta que uno llegue a cero:
import java.util.Random;
public class Ejemplo4_08
{ public static void main(String[] args)
{ Random random = new Random();
float x = random.nextFloat();
int n = Math.round(999*x + 2);
System.out.println("m = " + m + "\t\tn = " + n);
while (m > 0)
{ if (m < n)
{ int temp = m;
m = n;
n = temp;
System.out.println("m = " + m +"\t\tn = " + n);
}
m -= n;
}
System.out.println("el g.c.d de m y n es " + n);
}
}
L
La Sentencia do...while
a sentencia do...while es en esencia la misma qie la de la sentencia while con su condicion de conti-
nuidad al final del bucle en vez de al principio. La unica diferencia es que el bucle do...while ejecu-
ta una vez antes de evaluar:
El sintaxis del do...while es:
do
sentencia
while ( expr );
donde expr es una expresion booleana sentencia es cualquier sentencia o bloque de sentencias.
L
Ejemplo 4.9 La Funcion Factorial
a funcion factorial de un numero entero positivo n es el producto de la multiplicacion del 1 al n. Por
ejemplo el factorial del 5 es 1*2*3*4*5 = 120. Esto por lo normal es expresado como 5! = 120. El
calor del factorial 0! es por definicion 1. Este programa genera un entero al azar en el rango del 0 al 20 y
entonces computa e imprime su factorial.
import java.util.Random;
public class Ejemplo4_09
{ public static void main(String[] args)
47
{ Random random = new Random();
float x = new random.nextFloat();
int n = Math.round(21*x);
long f = 1;
int k = 1;
do
f *=k++;
while (k <= n);
System.out.println(n + "! = " + f);
}
}
Despues de inicializar n, f y k, el bucle do...while multiplica f por todos los numeros desde el 1 hasta la
n. Esto se lleva a cabo atraves de la sentencia de asignacion: f *= k++; la cual multiplica a f por k y luego
incrementa a k.
import java.util.Random;
public class Ejemplo4_11
{ public static void main(String[] args)
{ final double TOL = 0.5E-15;
Random random = new Random();
48
double x = new random.nextDouble();
System.out.println("\tx = " + x);
do
{ x = (x + 2.0/x)/2;
System.out.println("\tx = " + x);
}
while (Math.abs(x*x - 2.0) > TOL*2*x);
System.out.println("sqrt(2.0) = " + Math.sqrt(2.0));
}
}
El loop do...while utiliza el mismo tipo de condicion de continuacion como en el ejemplo 11. El bucle
continua iterando hasta que la longitud del intervalo es menos que 0.5x10^7. Esto garantiza que nuestra res-
puesta sera correcta hasta el 7mo decimal.
El loop de fuera itera 15 veces. En cada iteracion del loop de fuera, el loop interno itera tambien 15 veces.
En cada iteracion del loop interno, el producto de z es calculado e impreso con un prefijo de blanks o espa-
cios en blancos. El numero de espacios en blancos depende del numero de digitos en z asi que el numero en
cada columna de la tabla resultante son justificado. Por ejemplo, cuando x es 13 y y es 10, entonces z es 130,
cual cual tiene tres digitos, asi que su prefijo solo tien un espacio en blanco. Pero cuando x es 3 y y es 2, z
es entonces 6, cual solo tiene un digito, asi que su prefijo tiene 3 espacios en blanco. De esta forma, cada pro-
ducto es impreso en un campo de 4 caracters.
Este programa lee dos cadenas desde la entrada estandar s1 y la substring s2. Luego imprime sus longi-
tudes y ejecuta loops for anidados para hacer la busqueda. Si s1 es encontrada ser una subcadena de s2, esta-
ble el valor de la variable booleana encontrado a ser verdadero, almacena el index de k y luego ejecuta la eti-
queta break para salir fuera de ambos loops simultaneamente. Luego reporta el resultaod del metodo
indexOf() para revisarlo. `el valor de k es el indice de s1 del primer caracter de la substrin s2.
El for interno usa el metodo charAt() para comparar consecutivamente el caracter en s1 con esos en s2,
empezando con el indice i en s1 y el indice 0 en s2. Si encuentra que no igualan, sale del loop interno u resu-
me la iteracion del externo. Si esto no sucede entonces ( j== n2-1), todos los caracteres de s2 han sido igua-
lados y la subcadena ha sido encontrada. El println() dentro del loop interno para poder encontrar los resul-
tados durante la busqueda..
El break ocurre cuando i - 1, j - 2 y k = 0. Ya que la etiqqueta resume etiqueta el loop j, la sentencia print()
que sigue es ejecutada luego. Ya que este es la ultima sentencia dentro del bucle i el bucle externo continua,
empezando la proxima iteraccion con i = 2.
52
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
3. ¿Trate de advinar cual es el resultado al ejecutar el siguiente fuente y luego ejcutelo y compruebelo?
public class Ejemplo0403
{ public static void main(String[] args)
{ int count = 0;
for (int i = 0; i < 3; i++)
resume:
for (int j = 0; j < 4; j++)
for (int k = 0; k < 5; k++)
{ ++count;
if (i == 1 && j == 2 && k == 3) break resume;
}
System.out.println(“\tcount = “ + count);
}
}
4. ¿Trate de advinar cual es el resultado al ejecutar el siguiente fuente modificado del la pregunta anterior y
luego ejcutelo y compruebelo?
public class Ejemplo0404
{ public static void main(String[] args)
{ int count = 0;
for (int i = 0; i < 3; i++)
{ resume:
for (int j = 0; j < 4; j++)
for (int k = 0; k < 5; k++)
{ ++count;
53
if (i == 1 && j == 2 && k == 3) break resume;
}
System.out.println(“\tcount = “ + count);
}
}
en el Ejemplo4_11?
1. Escriba y ejecute un programa de Java que tabule la funcion sine para 17 valores espaciado iguales entre
el 0 y el PI. Use el constante Math.PI y el metodo Math.sin().
2. Escriba y ejecute un programa de Java que genere cinco enteros al azar, luego determine e imprima su
average.
3. Escriba y ejecute un programa de Java que prueba la formual de suma i -1 ==> n ∑i = n(n + 1)/2; Genere
un numero entero n del rango 0 hasta el 100, sume todos los enteros desde el 1 hasta la n generada, cal-
cule el valor de la expresion en la derecha y luego imprima ambos valores para ver la salida similar a esta:
x = 0.12363869
n = 14
sum = 105
n*(n+1)/2 = 105
4. La funcion de Babbage genera mas de 20 numeros primos. Modifique el programa en el ejemplo 4_1 para
ver que tan grande puede ser x antes de que el valor de x^2 + x + 41 no es primo. Puede usar el fuente
del ejercicio4_10 para ver cual numero es primo.
5. Modifique el programa de Fibonacci Ejercicio4_5 reemplazando el bucle while por un for, luego ejecute
para verificar que lo hizo correctamente.
6. Modifique el programa Ejercicio4_3 para que: los numeros pares sean procesados antes que empieze el
bucle for y que solo valores impares de d menor o igual que la raiz cuadrada de n son usadas en el bucle.
Genere un numero entero n del rango 0 hasta el 100, sume todos los enteros desde 1 hasta la n generada,
calcule el valor de la expresion en la derecha y luego imprima ambos valores para ver la salida similar a
esta.
54
8. Escriba y ejecute un programa de Java que pruebe la formula de sumatoria:
Genere un numero entero n del rango 0 hasta el 100, sume todos los enteros desde 1 hasta la n generada,
calcule el valor de la expresion en la derecha y luego imprima ambos valores para ver la salida similar a
esta.
55
CAPITULO 5
FUNDAMENTOS JAVA SOBRE GNU/LINUX
MET ODOS
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
5. ¿Que es Sobrecarga?
56
U
METODOS
n metodo es una secuencia de declaraciones y sentencias ejecutables que se encapsulan juntos para
crear un mini programa independiente. En otros lenguajes estos son llamados funciones, procedi-
mientos, subrutinas y subprogramas.
E n java cada sentencia ejecutable debe estar dentro de un metodo. Consecuentemente en los metodos
es donde ocurre toda la accion de los programas. Los programadore deseñan programas orientados a
objeto primero decidiendo que accion en debe ser llevada a cabo y que tipo de objeto debera efeectuar esta
accion deseada.
}
}
El metodo main() contiene un loop for el cual invoca el metodo println() 6 veces. Este metodo a la ves
invoca el metodo cubo(), pasandole el valor de su argumento “i” a su parametro n. Asi que por ejemplo, en
la tercera iteracion el valor de i = 2, asi que la variable n dentro de cubo se inicializa como n = 2, la cual
entonces devuelve la secuencia n*n*n que es 2*2*2 que es igual a 8, nuestro metodo la imprime.
57
}
static int min(int x, int y)
{ if (x < y) return x;
else return y;
}
}
El metodo random.nextFloat() retorna un valor float en el rango 0.0 al 1.0, la expresion
Math.round(100*x) expande el valor a un rango de 0.0 al 100.0 entonces invoca el metodo Math.round() que
es un metodo que nos producira un entero en el rango deseado del 0 al 100. Asi que las variable m y n son
inicializadas con enteros en ese rango. Entonces estos son pasados a main() la cual retorna el valor mas
pequeños.
U
Variables Locales
na variable local es una que es declarada dentro de un metodo.Ellas pueden ser usadas dentro de ese
metodo exclusivamente, y dejan de existir o tener vigencia cuando el metodo termina su ejecusion.
El bucle for invoca al metodo f() 9 veces. Por ejemplo cuando i = 5, la expresion f(i) invoca a f() pasan-
dole 5 como parametro a n. Dentro del metodo, la variable local f es inicializada a 1 y entonces sucesivamen-
te multiplicada por 5,4,3, y 2, cambiando su valor a 5, 20, 60 y 120 antes de que el bucle while se detenga.
El valor actual de 120 entonces es retornado a metodo println() la cual la imprime..
Lo que significa que si tienes 8 cosas diferente digamos las letras ABCDEFG y H, entonces existen
20,160 defente combinaciones de seis posibles donde por ejemplo BGEADH es solo una de ellas.
58
public class Ejemplo504
{ public static void main (String[] args)
{for (int i = 0; i < 9; i++)
{ for (int j = 0; j <= i; j++)
System.out.print(p(i,j) + "\t");
System.out.println();
}
}
static long p(int n, int k)
{ long p = 1;
for (int i =0; i < k; i++)
p *= n--;
return p;
}
}
El metodo main() utiliza un par de loops for anidados para imprimir un triangulo de numeros. Por ejem-
plo cuando i = 5, el bucle interno j itera 6 veces, con j =0,1,2,3,4 y 5. Para esos arguemntos el metodo p()
retorna los valores 1,5,20,60, y 120 los cuales se imprime en forma de traingulo.
El metodo p() computa las permutaciones en las misma manera que el metodo f() computa factoriales.
Por ejemplo cuando i = 5 y j = 3 la invocacion de p(1,j) inicializa la variables locales n = 5, k = 3 y p = 1.
Luego su loop for itera a k = 3 veces, multiplicando a p por 5, 4, y 3 cambiando su valor a 5, 20 y 60 los cua-
les son retornados a metodo println().
E
Metodos Invocan a Otros Metodos
s normal que metodos invoquen a otros metodos, de hecho ya lo hemos visto en muchos d elos ejem-
plos en especial cuando el metodo main() invoca el metodo println(), el cual a la vez por ejemplo
cuando estre invocaba el metodo cubo().
U
Metodos que se Invocan a ellos Mismos
n metodo que se llama a si mismo es llamado recursovo y el proceso resultante es llamado en pro-
gramacion recursion. La funcion factorial n! es definida recursivamente.
S
Los Metodos Booleanos
on simplemene aquellos metodos que retornan un valor boolean. Estos metodos son invocados como
expresiones booleansa y mayormente usados para controlar bucles de control y condicionales.
Despues de inicializar n, f y k, el bucle do...while multiplica f por todos los numeros desde el 1 hasta la
n. Esto se lleva a cabo atraves de la sentencia de asignacion: f *= k++; la cual multiplica a f por k y luego
incrementa a k.
S
Los Metodos Void
on simplemene aquellos metodos que no retornan un valor.
U
Sobrecarga de Metodos
sted puede usar el mismo nombre para metodos diferentes siempre y cuando ellos reciban un nuem-
ro diferente de parametros. Esta practica es conocida como sobrecarga.
62
Ejemplo 5.11 Usar un metodo max() para Implementar otro metodo max()
Este programa pone a prueba dos metodos del mismo nombre llamados max(). Ellos tienen un nuemro de
lista de parametros que ellos recibenuno es (int, int) y el otro es (int, int, int):
import java.util.Random;
public class Ejemplo510
{ public static void main(String[] args)
{ Random random = new Random();
for (int i = 0; i < 5; i++)
{ float x = random.nextFloat();
int a = Math.round(100*x);
x = random.nextFloat();
int b = Math.round(100*x);
x = random.nextFloat();
int c = Math.round(100*x);
System.out.println("max(" + a + "," + b + "," + c + ") = " + max(a,b,c));
}
}
El nombre y la lista de parametros de un metodo es llamado su firma o signature en ingles. Por ejemplo
la firmas de los metodos en el Ejemplo5_11 son max(int, int) y max(int, int, int). Es la firma que el compila-
dor utiliza para localizar sus definiciones cuando encuentra una invocacion de un metodo. Por esto es que
metodos sobrecargados deben tener diferente firmas.
63
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
5. ¿Que es Sobrecarga?
1. Escriba y ejecute un programa de Java que implemetne la funcion de Babbage f(x)= x^2 + x + 41(Vease
el Ejemplo4_01).
static int f(int x)
4. Escriba y pruebe el mismo metodo que retorna el mino y otro metodo que retorne el maximo de cuatro
enteros.
static int min(int x1, int x2, int x3, int x4)
static int max(int x1, int x2, int x3, int x4)
5. Modifique el programa en el Ejercicio0503 para que imprima el factorial del 0-25. Use el resultado para
ver que tan grande puede ser n antes de que ocurra sobre carga de enteros (integer overflow).
6. Escriba y pruebe un metodo que implemente la funcion de permutacion p(n,k) (vease el Ejemplo0504)
usando un bucle while (como el que se uso para implementar la funcion factorial en el Ejemplo0503) en
lugar del bucle for.
7. Escriba y ejecute un metodo de Java que implemete la funcion de combinacion c(n,k) (vease el
Ejemplo0506) usando la formula equivalente:
c(n,k) = n!/k!(n - k);
Aqui el n! significa la funcion factorial f(n) (Vease el Ejemplo0503). Efectue que su programa imprima el
Triangulo de Pascal.
8. Escriba y ejecute un programa de Java que implemente la funcion de combinacion c(n,k) (Ver
Ejemplo0506) usando division y multiplicacion alternativas. Por ejemplo, c(n,k) sera computado divi-
diendo ocho por 1 y luego multiplicando por 7 y entonces dividiendo por 2 y entonces multiplicando por
6 y entonces dividimos por 3.
64
9. El valor mayor de c(n,k) para cualquier n es donde k = n/2. Por ejemplo, c(8,4)=70 mientras que todas
las otras c(8,k) <= 56. Asi que evaluando c(n,k/2), usted puede ver si su implementacion de la funcion de
combinacion puede computar por completo la fila n del triangulo de pascal correctamente sin sufrir de un
integer overflow. Efectue esto para ambas implementaciones (vease los Ejemplo0507 y Ejemplo0508)
para ver cual nos da mejor resultado.
10. Escriba y pruebe los siguientes metodos que implementan la funcion de power.
staitc double pow(double x, int n)
Este metodo retorna un valor de x elevado al poder n. Por ejemplo pow(2.0, -3) nos retorna:
2^-3 = 1/2^3 = 1/8 = 0.125
Por cada valor de pow(x,n) que usted imprime, tambien imprima el valor de Math.pow(x,n) para revisar
sus resultados:
Este retorna el multiple de menor cuantia entre los enteros m y n. Por Ejemplo el lcm(24,40) debe retor-
nar 120 ya que este es el numero mas pequeño comun al conjunto {24,48,72,96,120,144,...} de los mul-
tiples de 24 y el conjunto {40,80,120,160...} de los multiples de 40. Use su funcion gcd() del problema
anterior 11 con la formula:
lcm(m,n) = (m*n)/gcd(m,n)
13. Escriba y pruebe el siguiente metodo que retorne el entero del tipo short mas grande que sea menor o
igual que al valor tipo float pasado al metodo:
static short floor(float x)
Por ejemplo, floor(2.71828) nos retorna 2, y floor(-3.3) nos retorna -4. use el metodo Math.floor() para
revisar los resultados.
14. Escriba y pruebe el siguiente metodo que retorna un numero de un digito k del nuemro positivo n:
static int digit(long n, int k)
15. Escriba y pruebe el siguiente metodo que implementa la funcion de Fibonacci recursivamente:
static long fib(int n)
Ver Ejemplo0405.
16. Implemente la funcion gcd (vease el problema arriba numero 11) recursivamente. Efectue que su progra-
ma de prueba invoque ambas implementaciones iterativas y recursivas para que pueda revisar los resul-
tados.
17. Implemente la funcion power (vease el numeral 10) recursivamente. Efectue que su programa de prueba
ademas invoke el metodo Math.pow() para revisar los resultados.
65
18. Escriba y pruebe el siguiente metodo recursivo que retorna el numero triangular n:
static long t(int n)
Los numeros triangulares son (0, 1,3,6,10,15,21,28,...). Note que t(n) = t(n-1) + n para n > 1.
19. Escriba y pruebe el siguiente metodo recursivo que retorna el numero n cuadrado:
static long s(int n)
Los numeros cuadrados son (0, 1,4,9,16,25,36,49,...). Note que s(n) = s(n-1) + 2n -1 para n > 1.
20. Escriba y pruebe el siguiente metodo recursivo que retorna el numero n Catalan:
static long c(int n)
Los numeros triangulares son (1,1,2,5,14,42,132,429,...). Su relacion recurrenrte es dada por la suma:
c(n)= ∑c(i)*c(n-1-i) = c(0)*c(n-1)*c(1)*c(n-2)+.....+c(n-2)*c(1)+c(n-1)*c(0)
21. Implemente la funcion de Babbage (vease el numeral 1) recursivamente. Efectue que su programa de
prueba ademas invoke ambas implementaciones la explicita y la recursiva para revisar los resultados.
22. Escriba y pruebe el siguiente metodo booleano que determine si un nuemro dado es triangular (vease el
numeral 20):
static boolean isTriangular(long n)
Pruebe este metodo usando para identificar todos los numeros triangulares menor de 100.
22. Escriba y pruebe el siguiente metodo booleano que determine si un nuemro dado es cuadrado (vease el
numeral 19):
static boolean isSquare(long n)
Pruebe este metodo usando para identificar todos los numeros cuadrados menor de 100.
66
67
CAPITULO 6
FUNDAMENTOS JAVA SOBRE GNU/LINUX
CLASES
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
3. ¿Que ventaja hay de incluir un metodo como toString() que tiene cero parametros y retorna un objeto
String?
68
U
CLASES
n programa en Java es una colleccion de uno o mas archivos de texto que contienen clases de Java,
de las cuales por lo menos una es public y contiene un metodo llamado main() con el siguiente sin-
taxis:
La clase tiene dos campos, x y y, cuyos valores son las coordenadas de los puntos del objeto a cual repre-
sentan. la primera linea en el metodo main() es:
Point p = new Point(2,3);
69
L
DECLARACIONES
a intencion de una declaracion es introducir un identificadoe al compilador:
L
MODIFICADORES
os modificadores son palabras claves que indican el acceso tanto a las clases como las varables y los
metodos.
70
L
CONSTRUCTORES
as clases tienen tres tipos de miembros: campos, metodos y cosntructores.
E
CONSTRUCTORES
l tipo de constructor que una clase puede tener es el que no tiene parametros. Este es llamado el cons-
tructor por defecto. Otro tipo simple de constructor es el que su unico parametro es una refecrencia a
un objeto de la misma clase a la cual el constructor pertenece. Esta forma es por lo normal para duplicar un
objeto existente de la clase, asi que por esto es llamaado el constructor copia.
if (q == p) System.out.println(", y q == p");
else System.out.println(", pero q != p");
}
}
E
CONSTRUCTORES POR DEFECTO
n java, todo campo es automaticamente inicializado al valor por defecto para su tipo, esos valores son
boolean=false, char=’\u0000’, integer=0,floating point=0.0 y reference =null.
purse.insertar(3,0,2,1);
System.out.println(purse);
purse.insertar(3,1,1,3);
System.out.println(purse);
purse.remover(3,1,0,2);
System.out.println(purse);
purse.remover(0,0,0,4);
System.out.println(purse);
}
}
C
CLASE INVARIANTES
lase invariante es una condicion impuesta en los campos de todas las instancias de la clase. El obje-
tivo mas comun de crear clases invariantes es para garantizar representaciones unicas.
Ejemplo 6.6 Una Clase pra Representar los Dias de las Semanas
Esta clase ilustra el uso de una classe invariante para garantizar que cada objto represente un unico dia de
la sema:
public class Dia
{ // Una instancia que representa un dia unico de la semana
// Class es invariante: 0 <= numerodeldia < 7
public Dia(String s)
{ String ab = s.substring(0,2).toUpperCase(); // Para abreviar con dos caracters
74
diaNumero = DIAS.indexOf(ab)/2;
}
purse.insertar(0.93);
System.out.println(purse);
purse.remover(0.57);
System.out.println(purse);
purse.remover(1.00);
System.out.println(purse);
}
}
77
public LineM(double a, double b)
{ p0 = new Punto(0,b);
m = -b/a;
normalizar();
}
C
La Clase Wrapper
ada uno de los primitivos de Java tiene una clase correspondiente definido en java.lang y por esto
puede usar sin necesidad de usar el import.
n = Integer.parseInt("d7b",16);
80
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
3. ¿Que ventaja hay de incluir un metodo como toString() que tiene cero parametros y retorna un objeto
String?
8. ¿Porque es ilegal que un metodo static sea invocado por por uno no-static?
9. ¿Cual es la diferencia entre la igualdad de los objetos y la igualdad de las referencias que se refieren a
ellos?
10. ¿Cual es la diferencia entre los miembros publicos y los privados de una clase?
11. ¿Fuese mejor declarar el metodo clear() privado en la clase Purse del Ejemplo0605?¿Porque y porque
no?
12. ¿Porque es que el compilador crea automaticamente un constructor por defecto para la clase Purse en el
Ejemplo0605 pero no para la clase Point en el Ejemplo0601 o la clase Line en el Ejemplo0602?
19. ¿Cual es la diferencia entre invocar un constructor copia o usar una asignacion?
81
21. Explique la diferencia entre las salidas de:
String s;
System.out.println(“s = ” + s);
y:
String s = new String();
System.out.println(“s = ” + s);
22. ¿Cual es la razon para declarar un campo privado y declarar un metodo mutador que permite al publico
cambiarlo, no fuese mejor hacerlo public a el tambien?
Por Ejemplo, p.rotate(Math.PI/2) cambiara el punto p a (-3,2) en Ejemplo0601. Use la siguiente ecuacio-
nes de transformacion:
x2 = x1cosθ − y1sinθ
x2 = x1sinθ y1cosθ
q - q
q −
- q
3. Modifique la clase Point definida en Ejemplo0601 para que represente un punto en tres-dimensiones.
Por ejemplo, p.rotate(Math.PI/2) cambiaria el objeto linea a y = 0.5x + 3 en Ejemplo0602. Use la siguien-
te identidad trigonometrica y el hecho que el slope de una curva es igual a tan α, donde α es el angulo
entre la linea y el axis-x.
82
tan (α + θ) = (tan α + tan θ)/(1 - tan αtan θ)
8. Modifique y pruebe la clase Purse definida el Ejemplo0605 para que los objetos de clase Purse pueden
tambien contener monedas de medio peso.
9. Convierta y prueba la clase Purse definida en el Ejemplo0605 en la clase Wallet que cuyos objetos repre-
sentan wallets (carteras) uqe contienen denominaciones de US dolares de: $1, $2, $5, $10, $20 y de $50.
10. Agregue y pruebe los el siguiente metodo a la clase Dia definida en Ejemplo0606.
public Day next()
// retorna un objeto Day que representa el proximo dia (day)
14. Pruebe la clase Line Ejemplo0608 sobre varias lineas horizontales y verticales, y revise que se produz-
can las lineas deseadas y correctas.
static int digit(long n, int k)
15. Usted no tiene que crear un objeto del tipo Point explicitamente para asi poder usar el constructor de la
clase Line del Ejemplo0608. Usted puede crear explicitamente un objeto del tipo Point anonimo y pasar-
selo como argumento al constructor asi: :
Line line4 = new Line(new Point(2,2), new Point(-1,8))
16. Modifique el programa Ejemplo0609 para que pruebe la clase Integer en la misma manera.
17. Implemente una clase similar a la clase Day de Ejemplo0606 cuyos objetos representan los meses.
18. Implemente una clase cuyo objetos representen circulos en plano cartesiano:
19. Implemente la clase Point usando la magnitud radial r y la amplitud angular q como los campos en vez
de las coordenadas rectangulares x y y. Enforce la clase invariante que o:
r = q =0, o es r > 0 y 0 <= q < 2p
83
CAPITULO 7
FUNDAMENTOS JAVA SOBRE GNU/LINUX
COMPOSICION Y HERENCIA
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
1. ¿Que es composicion?
2. ¿Que es herencia?
84
U
COMPOSICION Y HERENCIA
na de las ventajas de programacion orientada a objeto es la capacidad de reusar software. Esto se
efectua atraves de herencia y composicion.
C
COMPOSICION
omposicion es la creacion de una clase usando otra clase para su data componente. Usamos compo-
sicion en la definicion de la clase Line del Ejemplo0602 del capitulo anterior. Esta fue compuesta
de la clase Point. La clase componente mas usada es la clase String, aqui en este ejemplo los ilustramos:
String first()
{ return first;
}
String middle()
{ return middle;
}
String last()
{ return last;
}
85
{ this.middle = middle;
}
El objeto Name referencia por tr es creado explicitamente cuando el operador new invoca el constructor
Name() de dos argumentos. Sus dos arguemntos first y last, son referencias a objetos String, asi que el cons-
tructor implicitamente invoca el constructor de String dos veces oara crear los objetos tr.first y tr.last. La pala-
bra clave this representa el argumento implicito tr. Note que la referencia tr.middle no tiene referente, asi que
el campo por esto permanece null.
La segunda linea del main() tiene un efecto en la referencia tc. Pero este invoca el constructor de tres argu-
mentos, asi que ademas a otro objeto Name, tres mas objetos String son creados. La clase Name esta defini-
da tener tres campos y ocho metodos. Los primeros tres metodos son metodos de acceso: simplemente cada
uno retorna uno de los campos. Los proximo tres metodos son mutadores: ellos permiten que otros metodos
externos modifiquen los campos. Los ultimos dos metodos sin los ya acostumbreados toString() para desple-
gar el objeto como una cadena y el main() el cual sirve como el motor de la clase.
La palabra clave this puede ser usada dentro de un metodo instanciado para referir al argumento implici-
to, lo que es, el objeto al cual el metodo es sujeto cuando este es invocado. Este lo usamos el la clade Name
del Ejemplo0701.
Name name()
{ return name;
}
char sex()
{ return sex;
}
String id()
{ return id;
}
ann.setId("001-1260313-9");
System.out.println("ann: " + ann);
}
}
U
CLASES RECURSIVAS
n metodo recursivo es uno cual se invoca a el mismo. Estos son descrito en el capitulo 5. Una clase
recursiva es una la cual esta compuesta de si mismo; por ejemplo, esta tiene un campo de referencia
que se refiere a un objeto de la clase a la cual este pertenece. .
class Person7_3
{ // Los objetos representan una persona
Name name()
{ return name;
}
88
//Los metodos de acceso de sex() y id() son los mismos que del ejemplo 7.2
char sex()
{ return sex;
}
String id()
{ return id;
}
ww.setFather(cw);
ww.setMother(ds);
ds.setFather(es);
cw.setMother(ew);
cw.setFather(pm);
ew.setMother(eb);
ew.setFather(gw);
System.out.println(ww);
}
}
El programa crea 8 objetos tipo Persona. Esta version de la clase es recursiva ya que crea los campos
padre u madre referenciando a objetos Persona. El metodo main() priemro crea los 8 objetos, luego invoca el
metodo setMother() y setFather() para vincularlo.
Los dos campos estaticos blanks y tab son usdos solamenteen el metodo toString(). Ellos prosucen sali-
da formateada.............................. FALTO...
class Friend
{ // objeto representa un amigo
protected String name; // ejemplo "Jose Paredes"
protected String tele; //ejemplo "476-7758"
protected Friend next; // Proximo objeto en la lista
static Friend list; // lista vinculada linkeada a amigos
90
public String toString()
{ return new String(name + ":\t" + tele);
}
}
H
HERENCIA
erencia es la creacion de una clase extendiendo otra clase para que asi la esa instancia de la nueva
clase automaticamente herede los campos y los metodos de su clase padre.
Ejemplo 7.5 Subclase Class ClassY heredda los campos protected “m” de la Class ClassxUna Clase
Este define una clase trivial con un campo y un metodo:
class ClassX
{ // Una clase Trivial
protected int m;
Note que su metodo toString() tiene la misma firma que el declarado en la ClassX:
Aqui la clase de prueba
class TestClassY
91
{ // clase para probar ClassY
public static void main(String[] args)
{ ClassX x = new ClassX();
System.out.println("x = " + x);
U
SOBRESCRITUA DE LOS CAMPOS Y METODOS
na instancia de y de la ClassY es en esencia lo mismo que una instancia de la ClassX con mas data
y funcionalidad. En ambos se declara un metodo g() con la misma firma, el metodo y.g() invocara el
metodo declarado en la ClassY, no el que esta declarado en la ClassX. En este caso, el metodo y.g() se dice
que sobrescribe el metodo x.g(). Sobrescribir o overriding es similar a sobrecargar: diferente metodos con un
mismo nombre. Overriding es diferente ya que los metodos tienen la misma firma(mismo nombre, misma
lista de parametros) y ellas son declaradas en clases diferente. Ademas deben retornar el mismo tipo de valor,
y el metodo que sobreescribe debe tener acceso al metodo que sobreesscribe. Asi que un metodo publico
puede ser sobreescrito solo por otro metodo publico.
S obreescribir campos es similar a sobrescribir metodos: ellos tienen la misma declaraciones pero en
diferente clases.
void f()
{ System.out.println("Ahora en la ClassX.f().");
m = 22;
}
void g()
{ System.out.println("Ahora en la ClassX.g().");
m = 44;
}
92
public String toString()
{ return new String("{ m=" + m + ", n=" + n + " }" );
}
}
void g()
{ System.out.println("Ahora en ClassY_7.g()."); // sobre pone metodos ClassX_7g()
n = 3.1415926535898932;
}
Su campo n y su metodo g() sobrescriben los miembros de la ClassX con el mismo nombre. Aqui le pre-
sentamos una clase de prueba:
class TestClassY_7
{ // clase para probar ClassY_7
public static void main(String[] args)
{ ClassX_7 x = new ClassX_7();
x.f();
x.g();
System.out.println("x = " + x);
El objeto x de la ClassX tiene los campos x.m y x.n y los metodos x.f(), x.g() y x.toString(). El objeto y
de la clase ClassY tiene los campos y.m y y.n y los metodos y.f() y g.f(), y y.toString(). El campo y.m y el
metodo y.f() son declarado en su propia superclase ClassX. El campo y.n y los metodos y.g() y y.toString()
son declarados en si propia clase ClassY, sobreescribiendo las declaraciones de n, g() y toString() en ClassX.
J
LA PALABRA CLAVE super
ava utiliza una palabra clave super para referirse a los miembros de la clase padre. Al ser usados en la
forma super(), esta invoca el constructor de la superclase. Al ser usado en la forma super.f(), este invo-
ca la funcion f() declarada en la superclase. Esto permite sobrescribir la sobrescritura..
93
Ejemplo 7.8 La subclase Student de la clase Person
Aqui le presentamos la subclase de la clase Person del Ejemplo0702
class Student extends Person
{ // Los objs representan estudiantes
protected int credits; // creditos de horas impartidas
protected double gpa; // average de puntos de los creditos tomados
int credits()
{ return credits;
}
double gpa()
{ return gpa;
}
class TestStudent
{ public static void main(String[] args)
{ Name annsName = new Name("Ann", "Baker");
Student ann = new Student(annsName,'F',16,3.5);
System.out.println("ann: " + ann);
}
}
En la primera linea se crea el objeto annsName del tipo Name. La segunda linea crea el objeto ann del
tipo Student, al igual que en el Ejemplo0702, excepto que aqui es una instancia de la clase Student en vez de
la clase Person. Pero la primera linea del constructor de Student es:
super(name, sex); // invoca el constructor en la clase Person
La palabra clave super se refiere a la superclase de la clase actual. Como esa es la clase Person, los argu-
mentos name y sex son pasados al constructor de la clase Person el cual ejecuta sus codigos sobre el objeto
ann del tipo Student. Esto es identico a declar el constructor de la clase Student asi:
Student(Name name, char sex, int credits, double gpa)
94
{ this.name = name;
this.sex = sex;
this.credits = credits;
this.gpa = gpa;
}
Utilizamos el metodo indirecto aqui solo para ilustrar el uso de la palabra clave super.
H
HERENCIA VERSUS COMPOSICION
erencia significa especializacion. Una subclase se especializa herredando sus campos y metodos de
su superclase y agregando otros. Los campos extras hacen a la subclas mas restrictiva, mas especial.
M ientras que herencia significa especializacion composicion significa agregacion. La clase Student
es una especializacion de la clase Person, mientras que es una agregacion de las clases name y
String ( y de las del tipo char, int y double). Los programadores a menudo utilizan el termino “es un” (is a)
y “tiene un” (has a) para distinguir entre composicion y herrencia. Un estudiante “es una” persona, mientras
que un estudiante “tiene un” nombre.
U
JERARQUIA DE LAS CLASES
na clase puede tener mas de una subclase. Estas relaciones nos llevan a un diagrama del tipo arbol.
En jerarquia asi podemos decir que una clase deciende o deriva de la otra, existe una secuencia de
clases, donde una de las clases es la superclase de la otra. Dentro de una jerarquia de clases existen dos tipos
de clases: clases abstractas y clases finales. Estas se identifican por los modificadores abstract y final.
U na clase abstracta es una clase que tiene por lo menos un metodo abstracto. Un metodo abstracto es
un metodo declarado solamente con su firma; no tiene implementacion. Ya que tiene por lo menos
un metodo abstracto, una clase abstracta no puede ser instanciada. Las clases y los metodos son declarados
abstractos con el uso del modificador abstract.
La clase abstracta Shape tiene tres metodos abstractos: center(), diameter() y area(). Como metodos abs-
tractos ellos estan solo declarados por sus prototipos.
class Circle extends Shape
{ // los objetos representan circulos en el plano cartesiano
95
private Point center;
private double radius;
Point center()
{ return center;
}
double diameter()
{ return 2*radius;
}
double area()
{ return Math.PI*radius;
}
Point center()
{ Point c = new Point(northWestCorner);
c.translate(side/2, -side/2);
return c;
}
double diameter()
{ return side*Math.sqrt(2.0);
}
96
double area()
{ return side*side;
}
La clase Square tiene dos campos, un constructor y cuatro metodos. Los campos especifican la localdad
y el tamaño del cuadrado. Los tres metodos (concretos) center(), diameter() y area() implementan sus meto-
dos abstractos correspondientes declarados en la superclase.
J
La Clase object
ava define una clas especial, la clase object, la cual es la clase ancestral de todas las clases. Esta decla-
ra doce miembros: un constructor y once metodos. Ya que todas las clases con subclase de object todas
ellas pueden entonces invocar sus metodos. Cuatro de ellos son: clone(), hashCode(), equals() y toString()
son disenados para ser sobrescritos(explicado mas adelante). Debido a esto es equivalente escribir lo siguien-
te durante la declaracion de una clase:
class Point
{ double x, y}
97
y su equivalente es:
class Point extends object
{ double x, y; }
L
LA JERARQUIA DE CLASE DE JAVA
os metodos clone() y equals() son dos de los doces metodos declarados en la clase Object.
boolean equals(Point p)
{ return ( x == p.x && y == p.y)
}
La version local de quals() es para garantizar queq.equals(p) no sera false al menos que los dos objetos
tipo Point realmente representen puntos diferentes. Sin esta version local esta expresion invocaria el metodo
Object.equals() el cual retornaria false si los objetos fueran distintos pero iguales.
El metodo equals() definido aqui no sobrescribe el Object.equals() porque las firmas o signatures no son
las mismas. Una es equals(Point) la otra es equals(Object), aqui le presentamos la forma correcta de sobres-
cribir el metodo:
public boolean equals(Object p)
{ return (x == p.x && y == p.y);
}
class Point7_11
// Los objetos representan puntos en el plano cartesiano
{ double x, y; // los puntos en las coordenadas
Point7_11(double a, double b)
{ x = a;
y = b;
}
98
public Object clone()
{ return new Point7_11(x,y);
}
Point7_11 q = (Point7_11)p.clone();
System.out.println("q = " + q);
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
2. ¿En Ejemplo0702, cuantos objetos moriran si se ejecuta la siguiente sentencia despues de las otras?
ann new Person(new Name(“Ann” , “Landers”), ‘F’);
3. ¿En Ejemplo0702, cuantos objetos moriran si se ejecuta la siguiente sentencia despues de las otras?
ann new Person(new Name(“Robert” , “Bruce”), ‘M’);
5. ¿Que sucederia mal si estas dos lineas del constructor fuesen colocadas inversas?
this.next = list;
list = this;
6. ¿En el metodo print() en Ejemplo0704, porque es necesario usar la variable local friend, en vez de usar el
campo lista directamente?
7. Elimine el metodo toString() en la ClassY en Ejemplo0707 y ejecutelo nuevamente. Su salida sera algo
asi:
Ahora en ClassX.f().
Ahora en ClassX.g().
x = { m = 22, n = 44 }
Ahora en ClassY.f().
Ahora en ClassY.g().
y = { m = 22, n = 0 }
9. ¿Que es polimorfismo?
1. Modifique la clase name del Ejemplo0701 agregando los siguientes tres campos:
protected String prefix; // ejemplo “Dr”
protected String suffix; // ejemplo “Jr”
protected String nick; // ejemplo “Tux”
100
2. Implemente una clase Address para representar una direccion postal de correo.
7. Implemente una clase de cuerpos celestiales (Sol, luna, marte, etc). Incluya los siguientes campos.
private String name; // ejemplo “Dr”
private double mass; // en gramos
private double diameter; // en kilometros”
private double period; // en dias terrestres”
private CelestialBody orbits;
private CelestialBody next;
private CelestialBody list;
El campo list mantiene una lista vinculada de todos los objetos creados, similar a esa de Ejemplo0704.
Agregue a cada constructor una sentencia que incremente el countador y modifique el metodo toString()
para que imprima la cuenta actual. Luego pruebe la clase modificada. Si se ejecuta igual sobre la misma data
del Ejemplo0703, su salida debe parecerse a esta:
William Windsor (M) #1
Mother: Diana Sopencer (F) #2
Father: Edward Spencer (M) #4
Father: Charles Windsor (M) #3
Mother: Elizabeth Windsor (F) #5
Mother: Elizabeth Bowes-Lyon (F) #7
Father: George Windsor (M) #8
Father: Philip Mountbatten (M) #6
Esto demuestra, que el objeto Charles fue el tercero creado.
9. Modifique el metodo insert() de la clase Friend definida en Ejemplo0704 para que los objetos sean inser-
tados en una lista alfabeticamente. Use el metodo compareTo() en la clase String para determinar el orden
alfabetico de las dos cadenas p y q asi:
(p.name.compareTo(q.name) < 0) //significa que p precede a q
(p.name.compareTo(q.name) == 0) //significa que p es igual a q
(p.name.compareTo(q.name) > 0) //significa que p sigue a q
10. Modifique la clase Friend en Ejemplo0704 para que seda una subclase de la clase Person.
101
11. Agregue el siguiente metodo a la clase Student definida en Ejemplo0708:
void update(int credit, char grade);
// actualiza los credits del estudiante y el gpa agregando el nuevo credit
// y recalculando el gpa basado en la nueva nota
12. Extienda la clase Student de Ejemplo0708 a una subclase de nombre CollegeStudent con un campo de
nombre year para el año de la graduacion del estudiante.
13. Extienda la clase CollegeStudent del problema anterior (12) a una subclase de nombre GradStudent con
un campo de nombre degree para la carrera de grado del estudiante.
14. Extienda la clase abstract Shape de Ejemplo0709 a una subclase concreta de nombre Triangle cuya ins-
tancia representa triangulos en el plano cartesiano. Para el metodo de area(), use la formula
(+-)(x1y2 + x2y3 + x3y1 - y1x2 - y2x3 - y3x1)/2
para calcular el area de un triangulo con vertices en (x1,y1), (x2,y2) y (x3,y3). Puede tambien crear un
metodo private static que implemente la siguiente formula para la distancia entre dos puntos (x1,y1) y
(x2,y2):
((x1 - x2)^2 + (y1 - y2)^2)^1/2
102
103
CAPITULO 8
FUNDAMENTOS JAVA SOBRE GNU/LINUX
OBJETIVOS
PREGUNTAS PRE-EXAMEN
Las repuestas se encuentran en el Apéndice A al final del Libro.
1. ¿Que es un arreglo?
2. ¿Que es un vector?
104
U
Arreglos y Vectores
n arreglo es un objeto que consiste de una secuencia de elementos enumerados del mismo tipo. Los
elementos son enumerados empezando desde el cero y pueden ser referenciados usando el operador
de subscript []. Los arreglso son muy usados por su alta eficiencia.
U
ARREGLOS DE CHARACTERES
no de los arreglos de caracteres mas simple es el que sus elementos son del tipo char. Vimos en el
capitulo 2 cuando analizamos los Strings que son casi lo mismo que los arreglos. Aqui le presenta-
mos una parte del programa que desarrollamos en el Ejercicio0201:
El objeto de nombre alphabet es declarado en la linea 3 como una instancia de la classe String y es ini-
cializado con el valor “ABCDEF.....Z”. Tecnicamente alphabet no es en si el objeto; es el nombre de la varia-
ble que hace referencia a la instancia de la clase String, y en la actualidad hace referencia a una que repre-
senta la cadena “ABCDE....Z”. Este es el resultado del codigo en la tercera linea, la cual hace ambas cosas
la declaracion de la referencia y la inicializacion. Se pudo haber efectuado en dos pasos asi:
String alphabet;
alphabet = “ABCDEF....Z”;
Un objeto String es una instancia de la clse String. Un arreglo del caracteres es un arreglo de objetos de
los cuales sus elementos son del tipo char. El proximo ejemplo nos ilustra la diferencia entre un objeto String
y un arreglo de chars.
105
tos son inicializados con la cadena de 7 letras “ABCDEFG”. El objeto de tipo String es creado con el ope-
rador new inclocado el constructor por defecto de String que ttoma un unico argumento del tipo arreglo de
char, A este se le pasa el argumento “ABCDEFG” y esto crea el objeto s. El arreglode objeto a es creado invo-
cando el metodo String.toCharArray() perteneciente al objeto s del tipo String. Note que al igual que s, a es
en realidad una variable referencial, s referencia un objeto String y a se refiere a un objeto del tipo char[].
Los arreglos de objetos tienen un campo publico llamado length el cual almacena el nuemro de elemen-
tos en el arreglo. Asi que la expresion a.length es analogo a la invocacion s.length(); cada una evaluara a 7
en este ejemplo aqui presentado.
El operador subscript [] provee acceso a los elementos individuales del arreglo. La expresion a[i] es ana-
logo a invocar s.charAt(i); cada una devuelve el caracter en el indice i.
Los arreglos casi siempre son procesados usando el bucle for. El indice del bucle for iguala el indice del
arreglo, ambos desde el rango de 0 a a.length -1. Asi que el formato de:
for (int i = 0; i < a.length; i++)
//...
es el mecanismo de control mas usado.
Ejemplo 8.3 Metodo para Remover todas las Ocurrencias de un Caracter de una Cadena
class TestStripMethod
{ // Clase para probar el metodo strip()
{ int n = s.length();
char[] a = new char(n);
int i = 0;
int j = 0;
while (i+j < n)
{ char sc = s.charAt(i+j); // i+j es el indice de s actual
if (sc == c) j++; // j es el numero de caracteres eliminados
else a[i++] = sc; // i es el numero de caracteres que han sido copiados a “a”
}
return new String(a,0,i); // duplica a “a” como un objeto String
}
E
PROPIEDADES DE ARREGLOS EN JAVA
n java se pueden crear arreglos que sus elementos sean cualquier de los ochos tipos primitivos o cual-
quier tipo de referencia. El sintaxis es
106
una sola sentencia con inicializacion:
tipo-elemento[] nombre = new tipo-elemento[n];
Aqui se le presentan algunos ejemplos:
float[] x; // declara a x ser una referencia a un arreglo de floats
x = new float[8]; // asigna un arreglode 8 floats, referenciado por x
boolean[] flags = new boolean[1024];
String nombres = new String[32];
Point[] ideal = new Point[1000];
Fijese que cuando el tipo de elemento es una referencia, es decir como un objeto String por ejemplo, la
asignacion es solo hecha a referencia de objetos de esa clase.
class TestAllocation
{
//test the alocation of an array of objects
public static void main(String[] args)
{
String[] name; //allocates 1 reference
name = new String[4]; //allocates 4 references
System.out.println("name [0] = \"" + name[0] + "\"");
name[0] = new String("ABC"); //allocates 1 3-char string
for (int i=1; i<name.length; i++)
name[i] = new String(); //allocates 3 0-char strings
name[3] = "OK"; //allocates 1 8-char string
for (int i=0; i<name.length; i++)
System.out.println("name["+ i +"] = \"" + name[i] +"\"");
}
}
La primera linea de main() declara a name ser una referencia a un arreglo de objetos de tipo String. Asigna
un espacio solo para la referencia misma. Ningun objeto ha sido creado aun. La segunda linea de main() ini-
cializa la referencia name creando un arreglo de objetos de 4 elementos. En este punto, los elementos son
referencias null. La tercera linea imprime el valor del primer elemento name[0]. Aun esta null.
La cuarta linea crea una objeto String que representa “ABC” y asigna a name[0] a que se refiera a el.
Ahora en el programa existen dos objetos: el objeto String[] referenciado por name y el objeto String refe-
renciado por name[0].
El bucle for crea tres objetos mas y le asigna las tres referencias name[1], name[2] y name[3]. Cada uno
de estos objetos claro esta es una cadena vacia. La proxima linea reemplaza la cadena vaicia name[3] con el
objeto String que representa “OK”. La cadena null a la que name[3] se referia esta muerta ya que perdio su
refrencia a la string “OK”.
Ahora que ya existen 5 objetos al final del programa: un objeto String[] y cuatro objetos String. Ellos tie-
nen la referencias name, name[0], name[1], name[2] y name[3], respectivamente.
Cuando un objeto es asignado (como en la segunda linea del Ejemplo0804), sus elementos son automa-
ticamnete inicializados con sus respectivos valores de campo inicial. Esto es un 0 para los campos enteros
como son byte, short, int y long, 0.0 para los puntos flotantes, float y double, false para los boolean, ‘\u0000’
para los char y null para cualquier tipo de referencia.
Usted puede inicializar un arreglo explicitamente con una lista asi:
int[] c = {44, 88, 99, 77};
107
Esta linea unica eds equivalente a las siguiente seis lineas:
int[] c;
c = new int[4];
c[0] = 44;
c[1] = 88;
c[2] = 99;
c[3] = 77;
COPIAR UN ARREGLO
Ejemplo 8.5 Los Arreglos no se pueden copiar usando los Operadores de Asignacion
En este ejemplo mostramos que sucede si se trata de usar un operador de asignacion para copiar un arre-
glo:
public class Ejer8_5
{
//tests the effect of assigning an array
public static void main(String args[])
{
double[] x = {2.2, 4.4};
print(x, "x");
double[] y = {1.1, 3.3, 5.5};
print(y, "y");
y = x;
print(y, "y");
x[0] = 8.8;
print(x, "x");
print(y, "y");
}
static void print(double[] u, String id)
{
for (int i=0; i<u.length; i++)
System.out.println(id + "[" + i + "] = " + u[i]);
System.out.println();
}
}
El arreglo x es inicializado a ser un arreglo de 2 elementos doubles y y es inicializado as ser uno diferen-
te de tres elementos double. Luego se intenta copiarlo usando el operador de asignacion, pero no funciona.
Cuando intnetamos y = x; el arreglo de tres elementos al que y estaba referenciando muere puesto que
que perdio su referencia. Pero la asignacion cambia solo el calor de la refrencia misma, simplemente reasig-
nandola a que refiera a al otro objeto arreglo ya existente. El resultado es que ahora ambos x y y sse refieren
al mismo unico arreglo. Asi que cuando la asignacion: x[0] = 8.8; cambia el primer elemento del arreglo x,
ademas cambia el primer elemento del arreglo y, ya que ambos son el mismo elemento.
Java provee un metodo universal especial para copiar arreglos. Es un miembro de la clase System, decla-
rada asi:
public static void arraycopy(Object src, int srcPos, Object dst, int dstPos, int count)
108
Este copia elementos desde el arreglo de origen src al de destino dst. El numero de elementos copiados
es pasado al parametro count. La posicion del indice dek orimer elemento en el arreglo de origen a ser copia-
do es pasado al parametro srcPos, y la localidad a donde se copiara en el arreglo destinatario es pasado como
el parametro dstPos.
En este ejemplo 8.5 se muestra como declarar un parametro del arreglo en un metodo y como pasar un
arreglo como argumento a un metodo. Los parametros de los arreglos son declarados en la misma manera que
los campos de arreglos son declarados, usando el operador de subscripts como sufijo del tipo de elemento:
static void print(double[] u, String id)
Los argumentos de arreglos son pasados a los metodos de la misma manera ordinaria que se pasan las
variables, por nombre:
class TestArraycopy
{ // tests the system.arraycopy() method
public static void main(String[] args)
{
double[] x = {2.2, 4.4};
print(x, "x");
double[] y = {1.1, 3.3, 5.5};
print(y, "Y");
System.arraycopy(x, 0, y, 0, x.length); // copies x into y
print(y, "y");
x[0] = 8.8;
print(x, "x");
print(y, "y");
}
static void print(double[] u, String id)
{
for (int i=0; i<u.length; i++)
System.out.println(id + "[" + i + "] = " + u[i]);
System.out.println();
}
}
La invocacion: System.arraycopy(x, 0, y, 0, x.length); copia los valores de los dos elementos x[0] y x[1]
a y[0] y y[1], respectivamente. Los dos arreglos permanecen distintos, como puede ser visto de los ultimos
dos bloques de salida. Ellos muestran la asignacion de x[0] = 8.8; cambios al primer elemento de x pero no
tiene efecto sobre el arreglo independiente y.
L
LA CLASE Vector
os elementos de un arreglo pueden ser cualquier de los ocho tipos primitivos definidos o uno de refe-
rencia. Para los de tipo primitivo, usted declara el arreglo usando el nombre del tipo, asi:
Aunque cada uno de estos elementos es, por herencia, un objeto del tipo Miembros, realmente obtenemos
una lista heterogenea. Este es un ejemplo de una caracteristica programacion orientada a objeto llamada poly-
morfismo, que permite que el arreglo tenga muchas formas.
El uso mas liberal de polimorfismo ocurre cuando usamos la clase Object, la ultima superclase, como el
tipo referenciado por el arreglo.
Cada elemento del arreglo a es una referencia a un objeto del tipo Object. Pero por herencia, cada objeto
es un objeto Object. Asi que este arreglo puede almacenar lo que sea, cualquier cosa. Como ya no debe sor-
prenderle, toda idea magnifica como esta de un superarreglo es encapsulada en Java en una clase, esta clase
se llama la clase VECTOR. Un objecto Vector es en esencia un arreglo universal que puede cambiar su tama-
ño dinamicamente. Los arreglos ordinarios no pueden hacer esto! El campo length de un objeto de un arre-
glo es “final” un constante.
La clase Vector esta definida en el paquete java.util, asi que debera incluir la sentencia:
import java.util.Vector;
para poder usar la clase Vector en su programa.
class TestFriends
110
{
//Tests a telephone list of friends
public static void main(String args[])
{
Vector friends = new Vector();
friends.addElement(new Friend("Martin", "388-1095"));
friends.addElement(new Friend("bill", "283-9104"));
friends.addElement(new Friend("Nat", "217-5912"));
System.out.println(friends);
}
}
El constructor por defecto de la clase Vector crea el objeto Vector friends. Luego invocamos su metodo
addElement() tres veces para agregarle los objetos Friends a la lista. Luego su metodo toString() es invoca-
do implicitamente por el metodo System.out.println() para imprimir la lista por completo.
Un objeto Vector en java realmente es una lista dinamica. Elementos pueden ser agregados y retirados
desde la lista. Esto se lleva a cabo utilizando los siguientes metodos:
void addElement(Object o) // Agrega el objeto o al final de la lista
boolean contains(Object o) // Retorna verdadero si y solo si o esta en la lista
Object elementAt(int i) // Retorna el objeto en la posicion i de la lista
Object firstElement() // Retorna una referencia al primer objeto de la lista
......
......
......
Asi hay muchos otros que debemos familiarizarnos
class TestFriends2
{
// Tests a telephone list of friends
public static void main(String args[])
{
Vector friends = new Vector();
friends.addElement(new Friend("Martin", "388-1095"));
friends.addElement(new Friend("bill", "283-9104"));
friends.addElement(new Friend("Nat","217-5912"));
System.out.println(friends);
Friends.insertElementAt(friends.elementAt(2), 0);
System.out.println(friends);
Friends.removeElementAt(3);
System.out.println(friends);
}
}
111
Despues de haber creado la misma lista que en el ejemplo anterior, este programa utiliza el metodo
insertElementAt() y removeElementAt() para mover el tercer objeto Friend al principio de la lista.
L
EL TAMAÑO Y CAPACIDAD DE UN OBJETO Vector
a longitud de un arreglo es el numero de elementos que posee. Si el tipo de elemento es una referen-
cia, entonces entonces algunos de esos elementos pueden que sean null. Asi que el numero de ele-
mentos que contenga sea menor que su longitud. Un ejemplo es que el arreglo asignado en Ejemplo0804 tiene
longitud 4, aunque el numero de objetos referenciados cambia de 0 a 1 a 4. La longitud de un arreglo asig-
nado es constante.
La situacion es diferente para el objeto Vector. En ves de una longitud, un vector tiene un tamaño, el cual
es el numero de referencia a Objetos que este contiene. Este numero es dinamico; este cambia cada vez que
un objeto es agregado oretirado del vector.
Ademas del tamaño, un vector tambien tiene una capacidad, el cual es el numero de espacios asignado
para contener la referencia a un objeto. Este nuemro siempre es mayor o igual que su tamaño. Si son iguales
entonces cuando invocamos el metodo addElement(), la capacidad es uincrementada automáticamente para
acomodar el nuevo elemento. Esto lo ilustramos en el siguiente ejemplo:
import java.util.Vector;
class TestSize
{ public static void main(String args[])
{ Vector v = new Vector();
print(v);
v.addElement("A");
print(v);
v.addElement("B");
print(v);
Originalmente el vector esta vacio, asi que su tamaño es 0. Pero su capacidad es inicializada automatica-
mente a 10, lo que significa que podemos insertar hasta 10 elementos abtes de que debera dinamicamente rea-
signarse. Note que cuando un vector es reasignado dinamicamente su capacidad es doblada.
112
Ejemplo 8.11 Establecer la Capacidad de un Vector Explicitamente
En este programa ilustramos dos maneras de establecer la capacidad de un vector: a traves de su cons-
tructor y del metodo ensureCapacity():
import java.util.Vector;
class TestCapacity
{ public static void main(String args[])
{ Vector v = new Vector(3); // establece capacidad a 3
for (int i=0; i<7; i++) // inserta 7 elementos
{ v.addElement(new Long(9));
print(v);
}
v.ensureCapacity(100); //reestablece capacidad a 100 elementos
print(v);
}
static void print(Vector v)
{ System.out.print("v.size() = " + v.size());
System.out.println(",\tv.capacity() = " + v.capacity());
}
}
El constructor es pasado el argumento 3 el cual este usa para establecer la capacidad inicial del vector.
Luego se restablece al doble, a 6 y luego a 12, a medida que agregamos mas elementos al vector. Finalmente
establecemos la capacidad a 100.
U
ARREGLOS DE DOS DIMENSIONES
n arreglod e dos dimensiones es uno que usa dos subscriptos en vez de uno para referirse a sus ele-
mentos. El primer subscripto se refiere a las columnas y el segundo a las filas. Por ejemplo:
Esta sentencias asignarian el valor de 88 al elemento eb ka fila 5 de ka coolumna 2 del vector a. Recuerde
que empezamos a contar desde el cero asi que realmente el 5 es la sexta y el 2 es la tercera.
Un arreglo dos dimensional es en realidad un arreglo de arreglo. Imaginese cada fila como un arreglo, asi
que un arreglo dos dimensional es una colleccion de arrreglos de una dimension. De hecho asi es que java lo
ve.
Un arreglo 2-dimensional puede ser inicializado igual que uno de una dimension. La unica diferencia es
que como es una arreglode arreglos, su inicializacion tiene que ser una lista de listas.
El compilador ignora todos los espacios en blanco. Ajustandolo asi solo lo hace mas leible.
Note el uso del bucle anidado for. El bucle exterior es controlado por el indice de filas i y el interno por
el indice de columna j. El indice de fila es incrementado hasta llegar a a.legth, el cual es 3 eb este ejemplo.
Para cada valor de i, el indice de coluna j, se incrementa hasta llegar a a[i].length, ek cual en este ejemplo es
3 cuando i es 0 y 4 cuandi e es 1 y 2 cuando i es 2.
El mecanismo de control usado de bucles anidados de for es el metodo estar de poblar los arreglos. Para
poblar un de tres-dimensiones es similar a:
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a[i].length; j++)
for (int k; k < a[i][j].length; j++)
// procesa a a[i][j][k]...
Aqui nos podemos imaginar el elemento a[i][j][k] en el plano i, la fila j y la columna k. Una analogia es
una letra en una linea de una libro: a[i][j][k] representa un caracter k en una linea j en la pagina numero i,
a[i][j] representan la linea numero j en la pagina numero i, y a[i] representan la pagina numero i. El numero
de caracteres ne la linea j en la pagina i es representado como a[i][j].length, y el numero de lineas en la pagi-
na i es a[i].length. Asi que la iteracion de i del primer bucle procesaria a[i], iteracion j del segundo bucle pro-
cesaria la linea a[i][j] y la iteracion k en el tercer bucle procesaria el caracter a[i][j][k].
114
REPASO
Las repuestas a estas preguntas se encuentras en el Apéndice A.
1. Describa manualmente el resultado de la ejecusion de invocar el metodo strip() del Ejemplo0803 con la
sentencia strip(“000121030012”, ‘0’).
3. ¿Como difiere accesar un elemento individual de un arreglo de caracteres de accesar los elementos de un
objeto String?
4. ¿Que sucede si usted usa w[8] en una expresion ;uego de asignar 8 elementos al arreglo w?
6. ¿Cual es la diferencia entre un arreglo de longitud cero y un arreglo de cuatro referencias null?
7. ¿Porque son los arreglos procesados por bucles for por lo general?
115
4. Implemente la siguiente modificacion del metodo strip() definido en el Ejemplo0803:
static String strip(String s, char c, int p, int q)
{ elimina todas las ocurrencias de c del substring s[p:q-1]
Aqui la anotacion s[p:q-1] significa qie el substring s que empieza con s[p] y termina con s[q-1]. Por
ejemplo, si s es “ABCDEFGHIJ”, entonces s[5:8] seria “FGH”
116
117
118
119
120
121
122
123
124
125