Documente Academic
Documente Profesional
Documente Cultură
TRABAJO DE INVESTIGACIÓN
FORMATIVA
Ciclo: 2019 – II
IQUITOS – 2019
1
Índice
Introducción..............................................................2
Características del Lenguaje Java.............................2
Historia de Java.........................................................4
Conceptos básicos de java........................................6
¿Qué son variables en Java?...................................11
Tipos de variables en Java......................................11
Nombres de variables en Java.................................12
Conversión de tipos de datos en Java.....................15
Método valueof para la conversión.........................16
¿Qué son literales en Java?.....................................16
Expresiones.............................................................19
Sentencias en Java...................................................19
Operadores en Java.................................................20
Clase String: Representando una cadena................36
Array en Java..........................................................41
Matrices o Arrays de varios subíndices..................42
Applets Java............................................................44
Eclipse.....................................................................47
Conclusiones...........................................................51
Bibliografía.............................................................51
2
INTRODUCCIÓN A JAVA
Java es un lenguaje de programación de propósito general, tipado, orientado a objetos que
permite el desarrollo desde aplicaciones básicas, pasando por aplicaciones empresariales hasta
aplicaciones móviles.
Java nacía como un lenguaje de programación que pudiese ser multiplataforma y
multidispositivo, bajo el paradigma “Write Once Run Anywhere” (WORA)
De esta forma un programa Java escrito una vez podemos ejecutarle sobre diferentes
plataformas, siendo soportados los sistemas operativos Windows, MacOs y UNIX. Y a su vez
en diferentes tipos de dispositivos.
Para poder seguir este paradigma la compilación de un programa Java no genera código fuente,
si no que genera bytecodes. Estos bytecodes son interpretados por una máquina virtual o JVM
(Java Virtual Machine). Dicha máquina ya está escrita para cada uno de los sistemas operativos
en cuestión.
Independiente de Plataforma
Cuando compilamos código fuente Java no se genera código máquina específico, sino que se
generan bytecodes, los cuales son interpretados por la Java Virtual Machine (JVM),
posibilitando que un mismo código fuente pueda ser ejecutado en múltiples plataformas.
Orientado a Objetos
Cualquier elemento del lenguaje Java es un objeto. Dentro de los objetos se encapsulan los
datos, los cuales son accedidos mediante métodos.
Sencillo
Java está enfocado para ser un lenguaje fácil de aprender. Simplemente se deberán de entender
los conceptos básicos de la programación orientada a objetos (POO).
Seguro
Es seguro ya que los programas se ejecutan dentro de la Java Virtual Machine (JVM) en un
formato de “caja de arena”, de tal manera que no pueden acceder a nada que esté fuera de ella.
Tiene una validación sobre los bytecodes para comprobar que no hay códigos de fragmento
ilegal.
Arquitectura Neutral
Independientemente de que se ejecute en una arquitectura de 32bits o de 64bits. En Java los
tipos de datos siempre ocupan lo mismo.
Portable
Java no tiene nada que dependa de la plataforma, lo cual le hace que sea portable a diferentes
plataformas.
3
Robusto
El lenguaje Java intenta controlar las situaciones de error en los procesos de compilación y de
ejecución, reduciendo de esta manera el riesgo de fallo.
Además Java realiza el control total de la memoria alocándola y retirandola mediante
un garbage colletor, de tal manera que no podemos utilizar punteros para acceder a ella.
Multi-hilo
Java nos permite la programación concurrente, de tal manera que un único programa puede abrir
diferentes hilos de ejecución.
Interpretado
Los bytecodes son interpretados en tiempo real a código máquina.
Alto Rendimiento
Java ofrece compiladores Just-In-Time que permiten tener un alto rendimiento.
Distribuido
El lenguaje Java está pensando para ser ejecutado en arquitecturas distribuidas, como pueda ser
Internet.
HISTORIA DE JAVA
Los Inicios de Java
El lenguaje Java fue desarrollado en sus inicios por James Gosling, en el año 1991.
Inicialmente Java era conocido como Oak o Green.
La primera versión del lenguaje Java es publicada por Sun Microsystems en 1995. Y es en la
versión del lenguaje JDK 1.0.2, cuando pasa a llamarse Java, corría el año 1996.
En las primeras versiones de Java 1.1, 1.2 y 1.3 es en la que el lenguaje va tomando forma, con
la inclusión de tecnologías como JavaBeans, JDBC para el acceso a base de datos, RMI para
las invocaciones en remoto, Collections para la gestión de múltiples estructuras de datos
o AWT para el desarrollo gráfico, entre otros.
Java 5
En 2004 se estaba trabajando con la versión Java 1.5, pero con vistas a reflejar el nivel de
madurez de la plataforma Java se renombra a Java 5.
4
A partir de este momento se identifica el JDK con la versión 1.x, mientras que la
plataforma Java sigue con la nueva política de versionado.
Java 7
Así JDK 1.5 corresponde con Java 5 , JDK 1.6 corresponde con Java 6 ,… y así sucesivamente.
Dentro de Java 5 podemos encontrar el uso de genéricos, el autoboxing/unboxing entre tipos
de datos primitivos y sus clases, el uso de enumerados y la aparición del bucle for-each.
Java 6
En el año 2006 aparece la versión Java 6 en la que podíamos encontrar cosas como el soporte
de lenguajes de script, facilidades para la exposición y consumo de webservices
mediante JAX-WS, nuevos tipos de drivers con JDBC 4 y la versión 2 de JAXB.
Java 9
Aunque en el roadmap se esperaba que Java 9 estuviera disponible para el 2016, los problemas
de seguridad encontrados dentro de la plataforma han causado que se vaya demorando.
La fecha prevista para disponer de Java 9 es julio 2017.
Dentro de esta versión podremos encontrar el Project Jigsaw que establece la modularización
de la JDK, el Java Shell con el que podremos trabajar e interactuar al estilo RELP (Read–eval–
print loop), soporte para http 2.0 y algunas cosas más.
5
CONCEPTOS BÁSICOS DE JAVA
Si estás empezando con el lenguaje Java hay una serie de conceptos básicos Java de la
orientación a objetos que debes de manejar para poder desarrollar con este lenguaje.
Aquí los vamos a ver por encima y dedicaremos un capítulo entero a ellos entrando en detalle
sobre todas sus características
Objeto
Clase
Paquete
Interface
Herencia
Objeto
Es un elemento de software que intenta representar un objeto del mundo real. De esta forma un
objeto tendrá sus propiedades y acciones a realizar con el objeto. Estas propiedades y acciones
están encapsuladas dentro del objeto, cumpliendo así los principios de encapsulamiento.
El paradigma de la orientación a objetos aparece como contraste a la programación
estructurada que se venía utilizando desde los años 60.
Un objeto tiene su estado (o estados) y su comportamiento. Esto se modela mediante
propiedades (o variables) y métodos. Incluso un objeto puede contener a su vez a otro tipo de
objeto.
Encapsulación de datos
Las interacciones con los objetos se hacen mediante los métodos. Es decir, si queremos conocer
información del estado del objeto deberemos de llamar a uno de sus métodos y no directamente
a las propiedades.
Esta encapsulación nos permitiría el cambiar las propiedades del objeto sin que los
consumidores se vean afectados siempre y cuando les sigamos retornando el mismo resultado.
Si bien hay objetos que tienen propiedades públicas, por lo cual podremos acceder directamente
a dichas propiedades sin necesidad de utilizar un método.
El uso de objetos nos proporciona los siguientes beneficios:
1. Modularidad, el objeto y sus propiedades puede ser pasado por diferentes estructuras
del código fuente, pero el objeto es el mismo.
2. Encapsular Datos, ocultamos la implementación de propiedades del objeto ya que
accederemos a través de los métodos del objeto.
3. Reutilización de Código, podemos tener diferentes instancias de un objeto de tal
manera que esas diferentes instancias están compartiendo el mismo código.
4. Reemplazo, podemos reemplazar un objeto por otro siempre y cuando estos objetos
tengan el mismo comportamiento.
Ejemplos de objetos
Cualquier concepto del mundo real se puede modelar como un objeto con su estado y
comportamiento. Por ejemplo un televisor es un objeto**, cuyos estados pueden ser:
*encendida, apagada, en el canal1, en el canal2, grabando,… y sus acciones serán “encender
televisor”, “apagar televisor”, “cambiar de canal”, “iniciar la grabación”,…
6
Por ejemplo imaginemos una figura geométrica como podría ser un triángulo. Un triángulo
podemos definirlo por varias propiedades como pueden ser: base, altura, el lado y
las coordenadas x, y del centro del triángulo. Como métodos de un triángulo
podemos “calcular el área del triángulo”, “calcular el perímetro del triángulo”.
Clase
Las clases representan los prototipos de los objetos que tenemos en el mundo real. Es decir, es
una generalización de un conjunto de objetos. A su vez los objetos serán instancias de una
determinada clase.
Si volvemos al ejemplo del televisor, existen múltiples tipos de televisores y cada uno con sus
características. Si bien existe un esquema o prototipo que define el televisor. Este prototipo es lo
que conocemos la clase.
En la clase es dónde realmente definimos las propiedades y métodos que podrán contener cada
una de las instancias de los objetos.
Por ejemplo, para nuestro caso de las figuras geométricas podríamos definir un triángulo de la
siguiente forma:
class Triangulo {
private long base;
private long altura;
De momento no te preocupes por entender el código del todo, pero verás que hemos definido
una clase triángulo la cual tiene dos propiedades base y altura. Estas propiedades las hemos
definido como “private” lo cual hace que no puedan ser visibles desde fuera.
7
private long altura;
Además hemos creado un método que nos calcula el área de un triángulo (base x altura / 2).
Este método ya es público y podrá ser invocado de forma externa.
Vemos cómo creamos diferentes objetos del tipo Triángulo. A estos objetos los pasamos
diferentes valores.
Y por último hemos invocado al método que nos devuelve el área del triángulo del objeto en
concreto.
Interface
Una interface es una forma de establecer un contrato entre dos elementos. Una interface indica
qué acciones son las que una determinada clase nos va a ofrecer cuando vayamos a utilizarla.
Cuando implementemos una interface (cuando lo usemos) deberemos de implementar todas las
acciones (métodos) que este contenga.
Por ejemplo, podríamos definir una interface Figura el cual indique qué métodos son
obligatorios cuando vayamos a definir una figura. La interface se define mediante la palabra
interface.
interface Figura {
...
}
Dentro del interface definimos los métodos que serán obligatorios. Por ejemplo, que de una
figura se pueda calcular su área y calcular su perímetro.
8
interface Figura {
public long area();
public long perimetro();
}
Cuando queramos que una clase implemente una determinada interface deberemos de utilizar
el operador implements indicando el nombre de la interface a implementar.
Así, si un triángulo queremos que implemente la interface Figura lo definiremos de la siguiente
forma:
Herencia
La herencia es una forma de estructurar el software. Mediante la herencia podemos indicar que
una clase hereda de otra. Es decir, la clase extiende las capacidades (propiedades y métodos)
que tenga y añade nuevas propiedades y acciones.
Digamos que las nuevas clases especializan más aquellas clases de las que heredan al añadir
nueva funcionalidad. Aunque también pueden reescribir el funcionamiento de dichos elementos.
En nuestro ejemplo del triángulo, este podría heredar de una clase polígono.
De igual manera de esta clase general Poligono podrían heredar otras clases que representasen
un polígono, por ejemplo las clases Cuadrado, Pentagono,…
9
La clase superior de la que heredan las figuras puede definir una serie de propiedades y métodos
que heredarán las clases hijas y que por ende podrán utilizar.
Por ejemplo, la clase Poligono puede tener una propiedad que sean las longitudes de los lados
del polígono y que utilice esas longitudes para calcular el perímetro del polígono.
Veremos que los objetos instanciados como triángulos tendrán acceso a los métodos del
polígono.
10
Una de las cosas que tienes que saber en la herencia es que en el constructor de la clase que
hereda (o clase hija) se deberá de llamar al constructor de la clase padre. Para ello se utiliza el
método especial super();
Java es un lenguaje de tipado estático. Por lo cual todas las variables tendrán un tipo de dato (ya
sea un tipo de dato primitivo o una clase) y un nombre de identificador.
El tipo de dato se asignará a la hora de definir la variable. Además, en el caso de que las
variables sean propiedades de objetos tendrán una privacidad.
Ejemplos de variables serían…
int numero = 2;
String cadena = "Hola";
long decimal = 2.4;
boolean flag = true;
class Triangulo {
private long base;
private long altura;
}
Variables de instancia (campos no estáticos), son las variables que están definidas
dentro de un objeto pero que no tienen un modificador de estáticas (static). Suelen
llevar un modificador de visibilidad (public, private, protected) definiéndose.
class Triangulo {
private long base;
private long altura;
}
11
Variables de clase (campos estáticos), son aquellas variables que están precedidas del
modificador static. Esto indica que solo hay una instancia de dicha variable. Es decir,
aunque tengamos N objetos de la clase, la variable estática solo se instancia una vez.
class Triangulo {
static long lados = 3;
}
Si además queremos que el valor no pueda cambiar nunca la definiremos como final.
class Matematicas {
final static long PI = 3.14159;
}
int variable = 2;
12
¿Qué son los tipos de datos primitivos en Java?
Como ya hemos comentado Java es un lenguaje de tipado estático. Es decir, se define el tipo de
dato de la variable a la hora de definir esta. Es por ello que todas las variables tendrán un tipo de
dato asignado.
El lenguaje Java da de base una serie de tipos de datos primitivos.
byte
short
int
long
float
double
boolean
char
Es importante saber que estos son tipos de datos del lenguaje y que no representan objetos. Cosa
que sí sucede con el resto de elementos del lenguaje Java.
byte
Representa un tipo de dato de 8 bits con signo. De tal manera que puede almacenar los valores
numéricos de -128 a 127 (ambos inclusive).
short
Representa un tipo de dato de 16 bits con signo. De esta manera almacena valores numéricos de
-32.768 a 32.767.
int
Es un tipo de dato de 32 bits con signo para almacenar valores numéricos. Cuyo valor mínimo
es -231 y el valor máximo 231-1.
long
Es un tipo de dato de 64 bits con signo que almacena valores numéricos entre -263 a 263-1
float
Es un tipo dato para almacenar números en coma flotante con precisión simple de 32 bits.
double
Es un tipo de dato para almacenar números en coma flotante con doble precisión de 64 bits.
boolean
Sirve para definir tipos de datos booleanos. Es decir, aquellos que tienen un valor de true o
false. Ocupa 1 bit de información.
13
char
Es un tipo de datos que representa a un carácter Unicode sencillo de 16 bits.
primitivos
En el caso de que definamos una variable y no le demos ningún valor, por defecto llevarán los
siguientes valores:
14
El elemento String es un tipo de dato inmutable. Es decir, que una vez creado, su valor no puede
ser cambiado.
El String no es un tipo de dato primitivo del lenguaje Java. Pero su uso es igual de importante
que el de los tipos de datos revisados aquí. Veremos más en detalle el uso del tipo String.
Una forma de realizar conversiones consiste en colocar el tipo destino entre paréntesis, a la
izquierda del valor que queremos convertir de la forma siguiente: Tipo VariableNueva =
(NuevoTipo) VariableAntigua;
En el primer ejemplo, extraemos como tipo primitivo int el valor entero contenido en un campo
del objeto Integer. En el segundo caso, la función read devuelve un valor int, que se convierte
en un char debido a la conversión (char), y el valor resultante se almacena en la variable de tipo
carácter c.
El tamaño de los tipos que queremos convertir es muy importante. No todos los tipos se
convertirán de forma segura. Por ejemplo, al convertir un long en un int, el compilador corta los
32 bits superiores del long (de 64 bits), de forma que encajen en los 32 bits del int, con lo que si
contienen información útil, ésta se perderá. Este tipo de conversiones que suponen pérdida de
información se denominan “conversiones no seguras” y en general se tratan de evitar, aunque de
forma controlada pueden usarse puntualmente.
float Double
15
No todos los tipos se pueden convertir de esta manera. Como alternativa, existen otras formas
para realizar conversiones.
INTERPRETACIÓN
EXPRESIÓN
aprenderaprogramar.com
miInteger = miInteger.valueOf
El valor del String se transforma en Integer
(miString)
miString = miString.valueOf
El carácter (char) se transforma en String
(miChar)
No todas las conversiones son posibles. Muchas veces por despiste los programadores escriben
instrucciones de conversión incoherentes como miInteger = (int) miString;. El resultado en este
caso es un error de tipo “Inconvertible types”. Un uso típico de valueOf es para convertir tipos
primitivos en objetos.
Literales de enteros
Los enteros que podemos utilizar serán byte, short, int y long. Los literales que les asignemos
siempre será un número entero.
16
int variableInt = 12;
long variableLong = 12;
Si bien para el caso del tipo long podemos crear literales de enteros que acaben en L (mayúscula
o minúscula, aunque por legilibilidad se recomienda la primera)
Hay otros valores que pueden ser manejados por los literales enteros, para cuando
representemos el número en diferentes bases. Por ejemplo, cuando los manejemos como
binarios o hexadecimales. Para este caso habrá que manejar literales de enteros que tengan
dicho formato.
Literales de decimales
Los dos tipos de datos de decimales que podemos manejar son float y double. Para estos casos
la representación del literal de decimales será con separación de un punto entre la parte entera y
la parte decimal.
De igual manera podemos utilizar las letras F o f para el tipo de dato float y D o d para el tipo
de dato double. Siempre, por legilibilidad se recomienda la letra en mayúsculas.
'uCODIGOUNICODE'
'u00F1'
17
Para los caracteres utilizaremos comillas simples para delimitarlos, mientras que para las
cadenas utilizaremos comillas dobles.
Además, en las cadenas podemos utilizar una serie de secuencias de escape, las cuales empiezan
por una barra invertida y siguen con un modificador:
Secuencia Significado
b retroceso
t tabular la cadena
n salto de línea
f form feed
r retorno de carro
\ barra invertida
Literales subrayados
A partir de la versión 1.7 de Java se puede utilizar el subrayado para realizar separaciones entre
números para una mejor visualización.
A todos los efectos el valor del número es como si no existiese el carácter de subrayado.
18
A parte de las sentencias, en un programa Java nos encontraremos con expresiones y bloques.
EXPRESIONES
Una expresión es un conjunto de variables, operadores e invocaciones de métodos que se
construyen para poder ser evaluadas retornando un resultado.
Ejemplos de expresiones son:
int valor = 1;
if (valor 1 > valor2) { ... }
2 + 10 / 5
(2 + 10) / 5
2 + (10 / 5)
SENTENCIAS EN JAVA
Una sentencia es la unidad mínima de ejecución de un programa. Un programa se compone de
conjunto de sentencias que acaban resolviendo un problema. Al final de cada una de las
sentencias encontraremos un punto y coma (;).
Tenemos los siguientes tipos de sentencias.
Sentencias de declaración
int valor = 2;
Sentencias de asignación
valor = 2;
19
Sentencias de incremento o decremento
valor++;
Invocaciones a métodos
System.out.println("Hola Mundo");
Creaciones de objetos
Circulo miCirculo = new Circulo(2,3);
Bloques
Un bloque es un conjunto de sentencias los cuales están delimitados por llaves.
if (expresion) {
// Bloque 1
} else {
// Bloque 2
}
OPERADORES EN JAVA
Operadores Aritméticos:
Los habituales:
Suma + .
Resta - .
Multiplicación * .
División / .
Resto de la División % .
Operadores de Asignación:
El principal es '=' pero hay más operadores de asignación con distintas funciones
que explicamos brevemente ahora.
Operadores Unarios:
El más (+) y el menos (-). Para cambiar el signo del operando.
Operador Instanceof:
Nos permite saber si un objeto pertenece a una clase o no.
NombreObjeto instanceof NombreClase
Operadores Incrementales:
Son los operadores que nos permiten incrementar las variables en una unidad. Se
pueden usar delante y detrás de la variable dependiendo de lo que queramos, es
decir, si queremos que incremente o viceversa antes de utilizar o lo contrario.
'++'
'--'
Operadores Relacionales:
Permiten comparar variables según relación de igualdad/desigualdad o relacción
mayor/menor. Devuelven siempre un valor boolean.
Operadores Lógicos:
Nos permiten construir expresiones lógicas.
'&&' : devuelve true si ambos operandos son true.
'||' : devuelve true si alguno de los operandos son true.
'!' : Niega el operando que se le pasa.
'&' : devuelve true si ambos operandos son true, evaluándolos ambos.
'|' : devuelve true uno de los operandos es true, evaluándolos ambos.
SENTENCIAS EN JAVA
Un programa en Java se ejecuta en orden desde la primera sentencia hasta la última.
Si bien existen las sentencias de control de flujo las cuales permiten alterar el fujo de
ejecución para tomar decisiones o repetir sentencias.
Dentro de las sentencias de control de flujo tenemos las siguientes:
Sentencias de decisión
Sentencias de bucle
Sentencias de ramificación
Sentencias de Decisión
Son sentencias que nos permiten tomar una decisión para poder ejecutar un bloque de
sentencias u otro.
Las sentencias de decisión son: if-then-else y switch.
Mediante if-then-else podremos evaluar una decisión y elegir por un bloque u otro.
if (expresion) {
// Bloque then
} else {
// Bloque else
}
switch (expresion) {
case valor1:
bloque1;
break;
case valor2:
bloque2;
break;
case valor3:
22
bloque3;
break;
…
default:
bloque_por_defecto;
}
Sentencias de Bucle
Las sentencias de bucle nos van a permitir ejecutar un bloque de sentencias tantas
veces como queramos, o tantas veces como se cumpla una condición.
En el momento que se cumpla esta condición será cuando salgamos del bucle.
Las sentencias de bucle en Java son: while, do-while y for.
En el caso de la sentencia while tenemos un bucle que se ejecuta mientas se cumple la
condición, pero puede que no se llegue a ejecutar nunca, si no se cumple la condición la
primera vez.
while (expresion) {
bloque_sentencias;
}
do {
bloque_sentencias;
} while (expresion)
La sentencia for nos permite escribir toda la estructura del bucle de una forma más
acotada. Si bien, su cometido es el mismo.
for (sentencias_inicio;expresion;incremento) {
bloque_sentencias;
}
Sentencias de ramificación
Las sentencias de ramificación son aquellas que nos permiten romper con la ejecución
lineal de un programa.
El programa se va ejecutando de forma lineal, sentencia a sentencia. Si queremos
romper esta linealidad tenemos las sentencias de ramificación.
Las sentencias de ramificación en Java son: break y continue.
23
En el caso de break nos sirve para salir de bloque de sentencias, mientras
que continue sirve para ir directamente al siguiente bloque.
Las sentencias de ramificación son aquellas que nos permiten romper con la ejecución
lineal de un programa.
break
Ya vimos que en la sentencia selectiva switch se utilizaba la sentencia break para salir
de las evaluaciones y así solo ejecutar el bloque de la opción correspondiente. Si bien
podemos utilizar la sentencia break con las sentencias repetitivas while, do-while y for.
Esta es la que se conoce como sentencia break sin etiquetar.
Cuando utilicemos el break dentro de uno de estos bucles lo que se conseguirá es salirse
de la ejecución del bucle hasta el siguiente bloque de sentencias. Mismo efecto que si la
expresión de evaluación hubiese dado false.
Así podremos encontrarnos códigos como el siguiente:
while (expresion) {
sentencia(s);
break;
sentencias(s);
}
24
if (encontrado) {
System.out.println("El número está en la posición: " + posicion);
} else {
System.out.println("Número no encontrado");
}
if (encontrado) {
System.out.println("El número está en la posición: " + posicion);
} else {
System.out.println("Número no encontrado");
}
Como podéis ver el código es muy parecido y solo aparece la condición de la variable
bandera.
Una de las cosas que tenemos que tener en cuenta a la hora de utilizar las
sentencias break sin etiquetar es que estas generan que se rompa la secuencia de
ejecución de sentencias hasta el primer bloque anidado.
Pero, ¿qué sucedería si queremos salir de un conjunto de bucles anidados? Aunque
podríamos utilizar múltiples break existe la posibilidad de utilizar sentencias break
etiquetadas.
Las sentencias break etiquetadas funcionan igual que las break pero al ejecutarse se
salen a la siguiente sentencia después del bloque etiquetado.
La sintaxis es:
25
break nombre_etiqueta;
Veamos como podría ser una estructura de uso de las sentencias break etiquetadas.
sentencia(s) iniciales;
etiqueta:
while (expresion) {
sentencia(s) bloque1;
while (expresion) {
sentencia(s) bloque2;
break etiqueta;
}
}
sentencias(s) finales;
Al ejecutarse se sale de todo el bloque etiquetado como etiqueta y ejecuta las sentencias
finales.
Esto podemos encontrarlo si estamos recorriendo una matriz para buscar un elemento.
Ya que para recorrer una matriz vamos a necesitar dos bucles anidados.
int[][] matriz = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int numeroBuscado = 5;
busqueda:
for (int x=0; x < matriz.length; x++) {
for (int y=0; y < matriz[x].length; y++) {
if (matriz[x][y] = numeroBuscado) {
encontrado = true;
break busqueda;
}
}
}
26
if (encontrado) {
System.out.println(x + "," + y);
} else {
System.out.println("No encontrado");
}
continue
Otra sentencia que podemos utilizar en los bucles es la sentencia continue. A ejecutar una La
sentencia continue dejaremos de ejecutar las sentencias que quedan para acabar el bloque dentro
de un bucle para volver a evaluar una expresión.
La estructura de una sentencia continue sería:
while (expresion) {
sentencia(s) iniciales;
continue;
sentencias(s) finales;
}
etiqueta:
while (expresion) {
sentencia(s) iniciales;
while (expresion) {
sentencia(s) iniciales;
continue etiqueta;
sentencia(s) finales;
}
sentencia(s) finales;
}
Sentencias de decisión
27
Las sentencias de decisión son sentencias que nos permiten tomar una decisión para
poder ejecutar un bloque de sentencias u otro.
Las sentencias de decisión son: if-then-else y switch.
if-then-else
La estructura de las sentencias if-then-else es:
if (expresion) {
// Bloque then
} else {
// Bloque else
}
if (expresion) {
// Bloque then
}
int valor = 4;
if (expresion) {
// Bloque then
} else if {
// Bloque else
} else if {
// Bloque else
28
} else if {
// Bloque else
} ...
switch
Para los casos en los que se tienen muchas ramas o caminos de ejecución en una
sentencia if tenemos la sentencia switch. La sentencia switch evalúa una expresión y
ejecutará el bloque de sentencias que coincida con el valor de la expresión.
El valor de la expresión tiene que ser numérico. Aunque a partir de Java SE 7 ya se
pueden utilizar expresiones cuya evaluación sean cadenas.
La estructura de la sentencia switch es:
switch (expresion) {
case valor1:
bloque1;
break;
case valor2:
bloque2;
break;
case valor3:
bloque3;
break;
29
...
default:
bloque_por_defecto;
}
int iMes = 3;
String sMes;
switch (iMes) {
case 1:
sMes = "Enero";
break;
case 2:
sMes = "Febrero";
break;
case 3:
sMes = "Marzo";
break;
case 4:
sMes = "Abril";
break;
case 5:
sMes = "Mayo";
break;
case 6:
sMes = "Junio";
break;
case 7:
sMes = "Julio";
break;
case 8:
30
sMes = "Agosto";
break;
case 9:
sMes = "Septiembre";
break;
case 10:
sMes = "Octubre";
break;
case 11:
sMes = "Noviembre";
break;
case 12:
sMes = "Diciembre";
break;
default:
sMes = "Mes incorrecto";
}
System.out.println(sMes);
if (iMes == 1){
sMes = "Enero";
} else if (iMes == 2) {
sMes = "Febrero";
} else if (iMes == 3) {
sMes = "Marzo";
} else if (iMes == 4) {
sMes = "Abril";
} else if (iMes == 5) {
sMes = "Mayo";
} else if (iMes == 6) {
sMes = "Junio";
} else if (iMes == 7) {
sMes = "Julio";
31
} else if (iMes == 8) {
sMes = "Agosto";
} else if (iMes == 9) {
sMes = "Septiembre";
} else if (iMes == 10) {
sMes = "Octubre";
} else if (iMes == 11) {
sMes = "Noviembre";
} else if (iMes == 12) {
sMes = "Diciembre";
} else {
sMes = "Mes incorrecto";
}
System.out.println(sMes);
Otra cosa que tenemos que saber de la sentencia switch es que las evaluaciones casen
pueden ser múltiples. La estructura en este caso sería:
switch (expresion) {
case valor1: case valor2: case valor3:
bloque1;
break;
case valor4: case valor5: case valor6:
bloque2;
break;
...
default:
bloque_por_defecto;
}
Esto podemos utilizarlo para saber los días del mes. El código sería el siguiente:
int iMes = 3;
String sDias;
switch (iMes) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
32
sDias = "El mes tiene 31 días";
break;
case 4: case 6: case 9: case 11:
sDias = "El mes tiene 30 días";
break;
case 2:
sDias = "El mes tiene 28 días (o 29 días si es año bisiesto)";
break;
default:
sDias = "Mes incorrecto";
}
while
La estructura repetitiva while realiza una primera evaluación antes de ejecutar el bloque.
Si la expresión es true pasa a ejecutar de forma repetida el bloque de sentencias.
Cada vez que termina de ejecutar el bloque de sentencias vuelve a evaluar la expresión.
Si la expresión sigue siendo true vuelve a ejecutar el bloque. En el caso de que la
expresión sea false se saldrá del bucle.
Es por ello que dentro del bloque de sentencias deberán de existir sentencias que
modifiquen la evaluación de la expresión, ya que de no hacerse se podría entrar en un
bucle infinito.
La estructura de la sentencia while es la siguiente:
while (expresion) {
bloque_sentencias;
}
33
int contador = 1;
while (contador <= 10) {
System.out.println(contador);
contador++;
}
do-while
En el caso de la estructura repetitiva do-while el funcionamiento es el mismo que el
de while. Pero con una diferencia, primero se ejecuta el bloque de sentencias y luego se
evalua la expresión. Por lo tanto siempre se ejecutará, al menos una vez, el bloque de
sentencias.
La estructura de la sentencia do-while es:
do {
bloque_sentencias;
} while (expresion)
do {
System.out.println("Introduce carácter por consola");
iNumero = reader.nextInt();
System.out.println(iNumero);
} while (iNumero <> 0);
34
System.out.println("Introduce carácter por consola");
iNumero = reader.nextInt();
System.out.println(iNumero);
for
Otra de las sentencias repetitivas que tenemos, a parte de los bucles while y do-while, es
la sentencia for.
La sentencia for tiene la característica de que tiene bien definido el inicio del bloque, la
evaluación de la expresión, el incremento de valor y el bloque de sentencias.
La estructura del bucle for es:
for (sentencias_inicio;expresion;incremento) {
bloque_sentencias;
}
Tanto las sentencias_inicio, expresión como incremento son opcionales y pueden estar o
no. Aunque normalmente aparecerán en la estructura.
Esta estructura la podríamos reproducir mediante una sentencia while de la siguiente
forma:
sentencias_inicio;
while (expresion) {
bloque_sentencias;
incremento;
}
Las funcionalidades en las que utilizaremos la sentencia for serán las mismas que las
sentencias while y do-while, que serán contadores, recorrer estructuras, …
Si queremos definir un contador de 1 a 10 mediante una sentencia for utilizaremos el
siguiente código:
35
}
[ManualJava]: http://www.manualweb.net/tutorial-java/
36
String sMiCadena = "Cadena de Texto";
Constructores String
Visto lo visto podemos resumir que tenemos dos tipos de constructores principales de la
clase String:
Comparación de Cadenas
Los métodos de comparación nos sirven para comparar si dos cadenas de texto son
iguales o no. Dentro de los métodos de comparación tenemos los siguientes:
boolean equals(Object anObject) Nos permite comparar si dos cadenas de texto son
iguales. En el caso de que sean iguales devolverá como valor “true”. En caso contrario
devolverá “false”. Este método tiene en cuenta si los caracteres van en mayúsculas o en
minúsculas. Si queremos omitir esta validación tenemos dos opciones. La primera es
convertir las cadenas a mayúsculas o minúsculas con los
métodos .toUpperCase() y .toLowerCase() respectivamente. Métodos que veremos más
adelante. La segunda opción es utilizar el método .equalsIgnoreCase() que omite si el
carácter está en mayúsculas o en minúsculas.
boolean equalsIgnoreCase(String anotherString) Compara dos cadenas de caracteres
omitiendo si los caracteres están en mayúsculas o en minúsculas.
int compareTo(String anotherString) Este método es un poco más avanzado que el
anterior, el cual, solo nos indicaba si las cadenas eran iguales o diferentes En este caso
compara a las cadenas léxicamente. Para ello se basa en el valor Unicode de los
caracteres. Se devuelve un entero menor de 0 si la cadena sobre la que se parte es
léxicamente menor que la cadena pasada como argumento. Si las dos cadenas son
iguales léxicamente se devuelve un 0. Si la cadena es mayor que la pasada como
argumento se devuelve un número entero positivo. Pero que es esto de “mayor, menor o
igual léxicamente”. Para describirlo lo veremos con un pequeño ejemplo.
s1 = "Cuervo"
s2 = "Cuenca"
s1.compareTo(s2);
Compararíamos las dos cadenas. Los tres primeros caracteres son iguales “Cue”.
Cuando el método llega al 4 carácter tiene que validar entre la r minúscula y la n
minúscula. Si utiliza el código Unicode llegará a la siguiente conclusión.
38
r (114) > n(110)
Y nos devolverá la resta de sus valores. En este caso un 4. Hay que tener cuidado,
porque este método no tiene en cuenta las mayúsculas y minúsculas. Y dichos
caracteres, aún siendo iguales, tienen diferentes código. Veamos la siguiente
comparación
s1 = "CueRvo"
s2 = "Cuervo"
s1.compareTo(s2);
Nuevamente los tres caracteres iniciales son iguales. Pero el cuarto es distinto. Por un
lado tenemos la r minúscula y por otro la r mayúscula. Así:
Búsqueda de caracteres
Tenemos un conjunto de métodos que nos permiten buscar caracteres dentro de cadenas de
texto. Y es que no nos debemos de olvidar que la cadena de caracteres no es más que eso: una
suma de caracteres.
int indexOf(int ch) Nos devuelve la posición de un carácter dentro de la cadena de texto. En el
caso de que el carácter buscado no exista nos devolverá un -1. Si lo encuentra nos devuelve un
número entero con la posición que ocupa en la cadena.
int indexOf(int ch, int fromIndex) Realiza la misma operación que el anterior método, pero en
vez de hacerlo a lo largo de toda la cadena lo hace desde el índice (fromIndex) que le
indiquemos.
int lastIndexOf(int ch) Nos indica cual es la última posición que ocupa un carácter dentro de
una cadena. Si el carácter no está en la cadena devuelve un -1. int lastIndexOf(int ch, int
fromIndex) Lo mismo que el anterior, pero a partir de una posición indicada como argumento.
Búsqueda de subcadenas
Este conjunto de métodos son, probablemente, los más utilizados para el manejo de
cadenas de caracteres. Ya que nos permiten buscar cadenas dentro de cadenas, así como
saber la posición donde se encuentran en la cadena origen para poder acceder a la
subcadena. Dentro de este conjunto encontramos:
39
int indexOf(String str) Busca una cadena dentro de la cadena origen. Devuelve
un entero con el índice a partir del cual está la cadena localizada. Si no encuentra
la cadena devuelve un -1.
int indexOf(String str, int fromIndex) Misma funcionalidad
que indexOf(String str), pero a partir de un índice indicado como argumento del
método.
int lastIndexOf(String str) Si la cadena que buscamos se repite varias veces en
la cadena origen podemos utilizar este método que nos indicará el índice donde
empieza la última repetición de la cadena buscada.
lastIndexOf(String str, int fromIndex) Lo mismo que el anterior, pero a partir
de un índice pasado como argumento.
boolean startsWith(String prefix) Probablemente mucha gente se haya
encontrado con este problema. El de saber si una cadena de texto empieza con
un texto específico. La verdad es que este método podía obviarse y utilizarse
el indexOf(), con el cual, en el caso de que nos devolviese un 0, sabríamos que
es el inicio de la cadena.
boolean startsWith(String prefix, int toffset) Más elaborado que el anterior, y
quizás, y a mi entender con un poco menos de significado que el anterior.
boolean endsWith(String suffix) Y si alguien se ha visto con la necesidad de
saber si una cadena empieza por un determinado texto, no va a ser menos el que
se haya preguntado si la cadena de texto acaba con otra. De igual manera que
sucedía con el método .startsWith() podríamos utilizar una mezcla entre los
métodos .indexOf() y .length() para reproducir el comportamiento
de .endsWith(). Pero las cosas, cuanto más sencillas, doblemente mejores.
El método…
s.substring(7);
El método…
40
s.substring(6,11);
Manejo de caracteres
Otro conjunto de métodos que nos permite jugar con los caracteres de la cadena de
texto. Para ponerles en mayúsculas, minúsculas, quitarles los espacios en blanco,
reemplazar caracteres,….
String toLowerCase(); Convierte todos los caracteres en minúsculas.
String toUpperCase(); Convierte todos los caracteres a mayúsculas.
String trim(); Elimina los espacios en blanco de la cadena.
String replace(char oldChar, char newChar) Este método lo utilizaremos cuando lo
que queramos hacer sea el remplazar un carácter por otro. Se reemplazarán todos los
caracteres encontrados.
ARRAY EN JAVA
¿Qué es un array en Java?
Un array Java es una estructura de datos que nos permite almacenar una ristra de datos
de un mismo tipo. El tamaño de los arrays se declara en un primer momento y no puede
cambiar en tiempo de ejecución como puede producirse en otros lenguajes. La
declaración de un array en Java y su inicialización se realiza de la siguiente manera:
tipo_dato nombre_array[];
nombre_array = new tipo_dato[tamanio];
41
Por ejemplo, podríamos declarar un array de caracteres e inicializarlo de la siguiente manera:
char arrayCaracteres[];
arrayCaracteres = new char[10];
Los arrays Java se numeran desde el elemento cero, que sería el primer elemento, hasta
el tamaño-1 que sería el último elemento. Es decir, si tenemos un array de diez
elementos, el primer elemento sería el cero y el último elemento sería el nueve. Para
acceder a un elemento especifico utilizaremos los corchetes de la siguiente forma.
Entendemos por acceso, tanto el intentar leer el elemento, como asignarle un valor.
arrayCaracteres[numero_elemento];
// Lectura de su valor.
char x = arrayCaracteres[2];
El objeto array, aunque podríamos decir que no existe como tal, posee una variable, la
cual podremos utilizar para facilitar su manejo.
char array[];
array = new char[10];
tipo_dato nombre_array[][];
nombre_array = new tipo_dato[tamanio][tamanio];
int matriz[][];
matriz = new int[2][2];
Hay que tener en cuenta que para mostrar su contenido tendremos que utilizar dos
bucles. Para saber el número de columnas lo haremos igual que antes mediante la
variable .length, pero para saber el número de filas que contiene cada columna lo
tendremos que realizar de la siguiente manera:
matriz[numero_elemento].lenght;
int matriz[][];
matriz = new int[4][4];
for (int x=0; x < matrix.length; x++) {
for (int y=0; y < matriz[x].length; y++) {
System.out.println (matriz[x][y]);
}
}
43
Así, por ejemplo, podríamos inicializar un array Java o una matriz Java:
APPLETS JAVA
¿Qué es un applet?
Un applet es una pequeña aplicación Java, la cual esta disponible en un servidor web del
cual nos la descargamos y ejecutamos dentro de una página web. Algunas de sus
características son:
Creando un applet
Lo primero que hay que tener en cuenta es que la definición de los applet se encuentra dentro de
la librería
java.applet, la cual deberemos de importar para poder utilizarla. Además, necesitaremos de la
librería java.awt que es la que gestionará los recursos gráficos que se incluyan dentro del applet.
La librería java.applet cuenta con una clase abstracta Applet, de la que deberemos de heredar en
la clase principal de nuestra aplicación.
import java.applet.*;
public class miApplet extends Applet {
//variables y métodos
}
1. El applet se carga por primera vez, es decir, se inicializa. Esto sucede cuando el usuario
entra en la página por primera vez.
2. Seguidamente el applet empieza a funcionar.
3. En el caso de que el usuario abandone la página, para desaplazarse a otra, lo que se hace
es detener al applet, pero no descargarlo de memoria.
4. Si el usuario recarga la página donde se encuentra el applet, este se descarga de
memoria el applet actual y sus recursos asociados. Posteriormente se carga una nueva
instancia del applet.
5. Cuando se cierra el navegador o la aplicación que visualiza el applet, se detiene la
ejecución y se libera el applet de memoria. Cada uno de los estados lleva asociado un
método:
Este método se llama cuando se inicializa el applet por primera vez. En este método es
aconsejable fijar el tamaño (ancho y alto) del applet. Además se suelen instanciar los
elementos que utilice el applet, ya sean botones, cajas de texto, imágenes,…
Es el método que arranca la ejecución del applet cada vez que se visita, siempre y
cuando el applet esté expuesto a la visión del usuario.
Este método se ejecuta cada vez que el área de dibujo del applet es refrescada, ya sea
porque es la primera vez que se visualiza el applet, porque el usuario ha movido el
applet por la pantalla, porque se ha redimensionado el navegador,…. Inicialmente, el
área de dibujo es un rectángulo gris.
Esta función es la que realmente se llama cuando se refresca el área de dibujo del
applet. Lo que hace es limpiar el área de dibujo y llamar a .paint(). Si estamos
45
realizando aplicaciones que trabajen con gráficos, veremos que esta función habrá que
sobrecargarla para que la pantalla no parpadee.
Una llamada a este método fuerza a la actualización del applet, es decir, se llama a su
método. update().
Mi primer applet
En nuestro primer applet, lógicamente, deberemos de codificar la aplicación que nos
muestre la cadena de texto “Hola Mundo”. Veamos el código:
import java.awt.*;
import java.applet.*;
46
ECLIPSE (SOFTWARE)
Eclipse es una plataforma de software compuesto por un conjunto de herramientas de
programación de código abierto multiplataforma para desarrollar lo que el proyecto
llama "Aplicaciones de Cliente Enriquecido", opuesto a las aplicaciones "Cliente-
liviano" basadas en navegadores. Esta plataforma, típicamente ha sido usada para
desarrollar entornos de desarrollo integrados (del inglés IDE), como el IDE
de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se entrega
como parte de Eclipse (y que son usados también para desarrollar el mismo Eclipse).
Eclipse es también una comunidad de usuarios, extendiendo constantemente las áreas de
aplicación cubiertas. Un ejemplo es el recientemente creado Eclipse Modeling Project,
cubriendo casi todas las áreas de Model Driven Engineering.
Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de
herramientas para VisualAge. Eclipse es ahora desarrollado por la Fundación Eclipse,
una organización independiente sin ánimo de lucro que fomenta una comunidad de
código abierto y un conjunto de productos complementarios, capacidades y servicios.
Eclipse fue liberado originalmente bajo la Common Public License, pero después fue
re-licenciado bajo la Eclipse Public License. La Free Software Foundation ha dicho que
ambas licencias son licencias de software libre, pero son incompatibles con Licencia
pública general de GNU (GNU GPL).
Arquitectura
La base para Eclipse es la Plataforma de cliente enriquecido (del inglés Rich Client
Platform RCP). Los siguientes componentes constituyen la plataforma de cliente
enriquecido:
47
El Standard Widget Toolkit (SWT) - Un widget toolkit portable.
JFace - manejo de archivos, manejo de texto, editores de texto
El Workbench de Eclipse - vistas, editores, perspectivas, asistentes
Los widgets de Eclipse están implementados por una herramienta de widget para Java
llamada Standard Widget Toolkit, a diferencia de la mayoría de las aplicaciones Java,
que usan las opciones estándar Abstract Window Toolkit (AWT) o Swing.
La interfaz de usuario de Eclipse también tiene una capa GUI intermedia llamada JFace,
la cual simplifica la construcción de aplicaciones basadas en SWT.
El entorno de desarrollo integrado (IDE) de Eclipse emplea módulos (en inglés plug-in)
para proporcionar toda su funcionalidad al frente de la plataforma de cliente
enriquecido, a diferencia de otros entornos monolíticos donde las funcionalidades están
todas incluidas, las necesite el usuario o no. Este mecanismo de módulos es una
plataforma ligera para componentes de software. Adicionalmente a permitirle a Eclipse
extenderse usando otros lenguajes de programación como son C/C++ y Python, permite
a Eclipse trabajar con lenguajes para procesado de texto como LaTeX, aplicaciones en
red como Telnet y Sistema de gestión de base de datos. La arquitectura plugin permite
escribir cualquier extensión deseada en el ambiente, como sería Gestión de la
configuración. Se provee soporte para Java y CVS en el SDK de Eclipse. Y no tiene por
qué ser usado únicamente con estos lenguajes, ya que soporta otros lenguajes de
programación.
La definición que da el proyecto Eclipse acerca de su software es: "una especie de
herramienta universal - un IDE abierto y extensible para todo y nada en particular".
Características
Eclipse dispone de un Editor de texto con un analizador sintáctico. La compilación es en
tiempo real. Tiene pruebas unitarias con JUnit, control de versiones con CVS,
integración con Ant, asistentes (wizards) para creación de proyectos, clases, tests, etc.,
y refactorización.
Asimismo, a través de "plugins" libremente disponibles es posible añadir control de
versiones con Subversion e integración con Hibernate.
Historia
Eclipse comenzó como un proyecto de IBM Canadá. Fue desarrollado por OTI (Object
Technology International) como reemplazo de VisualAge también desarrollado por
OTI. En noviembre de 2001, se formó un consorcio para el desarrollo futuro de Eclipse
como código abierto. En 2003, fue creada la fundación independiente de IBM.
Resumen de las versiones de Eclipse:
Fecha de Versión de
Versión Proyectos
lanzamiento plataforma
48
Eclipse 3.1 28 de junio de 2005 3.1
Foundatio
24 de junio de 2019 4.9 Foundation projects
n
Datos
49
Los datos y cifras relacionados con Eclipse, mostrados a continuación, permitirán
profundizar un poco más en el producto.
Como puede verse en la tabla siguiente, la versión 3.2.1 posee más de 2 millones de
líneas de código (para el proyecto Eclipse). Estos datos son de acuerdo a SLOCCount.6
Utilizando esta cifra y aplicando el modelo COCOMO, podemos ver que requeriría un
esfuerzo para producir un software de este tamaño de 604 persona-año (para ello se ha
utilizado la fórmula 2.4*(KSLOC ** 1.05)).
Para tener un estimado de los costes se toma en consideración el salario de 56.286
$/año, que es el salario promedio de un programador en los Estados Unidos, y luego se
multiplica ese resultado por 2,40, que incluye cualquier gasto extra diferente de los
programadores como pueden ser luz, teléfono, papelería, etc.
Un punto muy importante a notar son los diversos lenguajes de programación utilizados
en el desarrollo del proyecto. De acuerdo al análisis realizado usando SLOCCount, el
lenguaje más utilizado es Java, seguido de ANSI C.
50
Java 1.911.693 92,66%
sh 2.066 0,10%
sed 2 0,00%
Idiomas
En julio de 2008, los siguientes paquetes de lenguas están disponibles para Eclipse 3.2.x
(En orden alfabético): Alemán, Árabe, Checo, Chino Simplificado, Chino
tradicional, Coreano, Español, Francés, Húngaro, Inglés, Italiano, Japonés, Polaco, Port
ugués (Brasil) y Ruso.7
Consultado en 2018: traducido total o parcialmente a más de 40 idiomas. Puede
consultarse la lista de idiomas en: http://babel.eclipse.org/babel/languages.php
CONCLUSIONES:
1. Para nosotros fue muy elemental investigar en si que es java, y porque se caracteriza
por ser un lenguaje muy utilizado.
2. Java como sabemos es un lenguaje que fue creado a similitud del lenguaje c++ pero
no con una diferencia que este lenguaje nos ayuda a tener una mayor seguridad en el
programa que se está ejecutando.
BIBLIOGRAFÍA
Java, de Fco. Javier Ceballos Ed. Ra-Ma
Java 2, de Fco. Javier Ceballos Ed. Ra-Ma
Java 1.2 Al decubierto, de Jawoski Ed. PRENTICE may
Javasoft, descarga de jdk y documentación (en inglés)
51
https://web.archive.org/web/20040716180615/http://www.eclipse.org/whitepape
rs/eclipse-overview.pdf
https://web.archive.org/web/20071027065134/http://www.vogella.de/eclipse.ht
ml
https://www.aprenderaprogramar.com/attachments/article/419/CU00621B%20tipos
%20dato%20variable%20java%20primitivos%20int%20boolean%20objeto%20string
%20array.pdf
52