Java 1.4 Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto.es/dipina [email protected] Introducción a la plataforma Java (I)  Evolución de la programación   ¿Qué es programar? Fases de.

Download Report

Transcript Java 1.4 Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto.es/dipina [email protected] Introducción a la plataforma Java (I)  Evolución de la programación   ¿Qué es programar? Fases de.

Java 1.4
Dr. Diego Lz. de Ipiña Gz. de Artaza
http://paginaspersonales.deusto.es/dipina
[email protected]
Introducción a la plataforma
Java (I)

Evolución de la programación


¿Qué es programar?
Fases de un proyecto informático





Análisis.
Diseño.
Codificación + compilación.
Depuración + pruebas.
Documentación.
Introducción a la plataforma
Java (II)

Evolución de los lenguajes.




Programación estructurada.




Instrucciones secuenciales.
Instrucciones condicionales.
Instrucciones repetitivas.
Un programa en ejecución: proceso.


Lenguajes máquina.
Lenguajes ensamblador.
Lenguajes de alto nivel.
La relación con la máquina.
Los orígenes del lenguaje Java.

1991 Sun Microsystems intenta crear un lenguaje
para programar dispositivos eléctricos.
Introducción a la plataforma
Java (III)




Primera versión se llamó OAK.
No tuvo éxito. Nueva orientación: Internet.
En 1996 surge la primera versión.
Características principales del lenguaje Java.

Multiplataforma.


Compilación -> ByteCode -> JVM (Java Virtual Machine).
Ventajas:


Multiplataforma.
Entorno controlado.
Introducción a la plataforma
Java (IV)

Desventajas








Menor rendimiento.
Pérdida de características específicas.
Orientación a Objetos.
Applets.
Programación distribuida RMI (Remote Method
Invocation)
Multiproceso / Multihilo (MultiThreading)
Programación móvil J2ME (Micro Edition)
Programación aplicaciones web JSP (Java Server
Pages)
Introducción a la plataforma
Java (V)

La evolución del lenguaje Java.

La orientación actual es la de ofrecer
multitud de utilidades para facilitar el
desarrollo de aplicaciones.



Servidores de aplicaciones.
Transparencia en el acceso a datos.
Desarrollo basado en componentes (beans).
Programación Orientada a
Objetos en Java (I)

¿Qué es la Programación Orientada a
Objetos?


Paradigma de programación que permite
modelar de forma sencilla conceptos del
mundo real a nivel de programación.
¿Por qué es útil la POO?

Ofrece un conjunto de herramientas que
una vez interiorizadas permiten gran
flexibilidad en el diseño de una solución.
Programación Orientada a
Objetos en Java (II)

Palabras reservadas en Java.
abstract
default
goto
operator
synchronized
boolean
do
if
outer
this
break
double
implements
package
threadsafe
byte
else
import
private
throw
byvalue
extends
inner
protected
throws
case
false
instanceof
public
transient
cast
final
int
rest
true
catch
finally
interface
return
try
char
float
long
short
var
class
for
native
static
void
const
future
new
super
volatille
continue
generic
null
switch
while
Programación Orientada a
Objetos en Java (III)

Herramientas de la POO.

La clase como elemento mínimo.


Una clase es una representación de un concepto del mundo real.
Contiene dos componentes / miembros:





Datos = Atributos.
Acciones = Métodos.
Se usa el operador punto ‘.’ para acceder a los miembros.
Una clase se define con la palabra reservada “class”.
Clase Vs Objeto


Clase = Concepto = Definición [= Receta].
Objeto = Instancia = Elemento “real” [= Pastel].
Programación Orientada a
Objetos en Java (IV)

Paquetes.




Concepto que permite englobar en una misma idea
varias clases.
Semejanza con estructura de directorios. Puede
haber una jerarquía. En compilación, se generan
directorios físicos.
Se usa el operador punto ‘.’ para poder acceder a las
clases de un paquete o a los subpaquetes.
Visibilidad de paquete.


Pública: Se permite usar esa clase desde otro paquete.
No pública: Sólo se puede usar esa clase desde ese
paquete.
Programación Orientada a
Objetos en Java (V)

Estructura básica de un fichero fuente Java.


Definición de paquete (opcional): “package”
Importación de clase (opcional): “import”


Se pueden importar todas las clases usando “*”
Definición de clases.

Sólo una con visibilidad pública de paquete. El fichero debe
llamarse igual que esta clase.
package paquete;
import otroPaquete.OtraClase;
public class ClaseConVisibilidadPublica
{
}
class ClaseConVisibilidadNoPublica
{
}
Programación Orientada a
Objetos en Java (VI)

Reglas de estilo básicas.




Los nombres de paquete en minúsculas.
paquete
Los nombres de clase en mayúscula la primera letra y en
mayúscula la primera letra de cada cambio de concepto.
NombreDeClase
Los nombres de miembros en minúsculas y en mayúscula la
primera letra de cada cambio de concepto.
nombreDeMiembroDeClase
Los nombres de constantes en mayúsculas todas las letras y
cada cambio de concepto con un guión bajo ‘_’.
NOMBRE_DE_CONSTANTE
Programación Orientada a
Objetos en Java (VII)

Comentarios. Hay 3 tipos.



De Bloque: Comienzan por “/*” y terminan por “*/”.
No se permiten anidaciones.
De Línea: Definidos por “//”.
De Documentación: Permiten insertar texto en las
páginas web generadas con la herramienta “javadoc” del
JDK. Comienzan por “/**” y terminan por “*/”. Se
suelen poner en ciertos puntos:



Antes de una clase.
Antes de un atributo.
Antes de un método.
 @param id
 @return
 @throws Exception
Programación Orientada a
Objetos en Java (VIII)

Encapsulación.
Control de acceso a los miembros.
 2 tipos de encapsulación:




Pública: Un miembro accesible desde cualquier
punto. Se usa la palabra reservada “public” antes
de definir el miembro.
Privada: Un miembro accesible únicamente desde
la propia clase. Se usa la palabra reservada
“private” antes de definir el miembro.
Los datos públicos pueden cambiar en cualquier
momento. Mediante encapsulación privada, sólo
pueden cambiar desde métodos = control.
Programación Orientada a
Objetos en Java (IX)

Tipos de datos en Java.

Primitivos.




Enteros.
 byte: 8 bits positivos y negativos (-128 < 0 < 127)
 char: 16 bits positivos (0 < 65535)
 short: 16 bits positivos y negativos (-32768 < 0 < 32767)
 int: 32 bits positivos y negativos
 long: 64 bits positivos y negativos
Decimales.
 float: 32 bits
 double: 64 bits
Lógicos.
 boolean: true o false
No primitivos: Clases.
Programación Orientada a
Objetos en Java (X)

Variables.
tipo + identificativo + [=VALOR_INICIAL] + ;

El concepto de ámbito.



Existen 2 tipos:



Define la visibilidad, accesibilidad, duración de una
variable.
Se representa mediante ‘{‘ y ‘}’.
De clase: Las variables de clase (estáticas) y de
instancia.
De método: Las variables locales a un método.
Diferencia entre variables de tipo primitivo y
objetos.
Programación Orientada a
Objetos en Java (XI)

Miembros estáticos.





Definidos con la palabra reservada “static”
Un miembro estático (o de clase) es único para todos los objetos
que se creen. Se puede decir que siempre está creado. Se puede
acceder a él sin necesidad de un objeto.
Un miembro no estático (o de instancia) pertenece a cada objeto
individual. Se puede decir que se crea junto con el objeto.
Desde un método estático no se puede acceder a miembros no
estáticos.
Creación de objetos.

Cuando se declara una variable de tipo no primitivo, realmente
representa una referencia a un posible objeto. Para poder crear el
objeto al que referenciar se usa el operador “new”.
Programación Orientada a
Objetos en Java (XII)

Contantes.

Enteras.
12345 (int, por defecto)
12345L (long)
0123 (octal)
0xF0A (hexadecimal)

Decimales.
123.45 (double, por defecto)
123.45f (float)

Carácter.
‘a’

Cadena.
“cadena”
Programación Orientada a
Objetos en Java (XIII)

Existen constantes con nombre
declarándolas igual que las variables con la
palabra reservada “final”.
final int CONSTANTE = 5;

Conversión de tipos.

No perder información / precisión.
Implícita.

Explícita. Operador cast (tipo)

Programación Orientada a
Objetos en Java (XIV)

Edición, Compilación y Ejecución en Java.

Software: http://www.java.sun.com





JDK: Java Development Kit. Compilador + JVM.
JRE: Java Runtime Enviroment. JVM.
Edición en cualquier editor.
El directorio “bin” del JDK contiene los comandos.
Compilación. Comando “javac”.
-d: Indica el directorio donde generar los .class.
 -classpath: Indica las rutas a los .class a usar.
javac –d RUTA –classpath RUTA fichero.java
El fichero .java puede ser *.java.

Programación Orientada a
Objetos en Java (XV)

Ejecución. Comando “java”.


-cp: Indica las rutas de los .class a usar.
java –cp RUTA fichero
No se indica la extensión dado que se interpretaría
como paquete.subpaquete...clase
Documentación. Comando “javadoc”.

-d: Indica el directorio donde generar la documentación.
javadoc –d RUTA fichero.java
El fichero.java puede ser *.java.
Programación Orientada a
Objetos en Java (XVI)
public class PrimerPrograma
{
public static void main(String[] args)
{
System.out.println(“El primer programa en Java.”);
}
}


Editar, compilar y ejecutar este programa.
Realizar varios cambios en el programa.



Modificar la cadena a presentar.
Añadir el paquete “cursojava.primero”. ¿Qué implicaciones
tiene?
Documentar el código fuente. Generar documentación.
Programación Orientada a
Objetos en Java (XVII)
package cursojava.tipos;
public class TiposPrimitivos
{
public static void main(String[] args)
{
byte b = 127;
char c = 65; // Representa el carácter ‘A’
short s = 32767;
// Conversiones implícitas
int i = b;
long l = s;
float f = i;
double d = f;
}
}

Realizar varios cambios en el programa.


Asignar valores fuera de rango a cada tipo.
Intentar realizar conversiones inadecuadas. ¿Cómo se forzarían?
Programación Orientada a
Objetos en Java (XVIII)

Expresiones.

2 elementos.



2 tipos de operadores.



Operadores.
Operandos.
Binarios: 2 operandos.
Unarios: 1 operando.
Asignación ‘=‘
variable = valor;
variable1 = variable2 = variable3 = valor;
Programación Orientada a
Objetos en Java (XIX)

Aritméticas.







Suma ‘+’: Binario. Enteros y decimales.
Más ‘+’: Unario. Enteros y decimales.
Resta ‘-’: Binario. Enteros y decimales.
Menos ‘-’: Unario. Enteros y decimales.
Multiplicación ‘*’: Binario. Enteros y decimales.
División ‘/’: Binario. Enteros y decimales.
Resto ‘%’: Binario. Enteros.
Operador
+, - (unitarios)
*, /, %
+, -
Operación
+25
-6.725
5 * 5 es 25
25 / 6 es 4
25 % 6 es 1
2 + 3 es 5
2 – 3 es -1
Nivel de Precedencia
1
2
3
Programación Orientada a
Objetos en Java (XX)

Incremento ‘++’ y Decremento ‘--’


Pre: Se incrementa/decrementa y después se
evalúa la expresión.
++variable;
--variable;
Post: Se evalúa la expresión y luego se
incrementa/decrementa.
variable++;
variable--;
Programación Orientada a
Objetos en Java (XXI)
package cursojava.incdec;
public class IncrementoDecremento
{
public static void main(String[] args)
{
int variable = 5;
System.out.println(variable);
System.out.println(++variable);
System.out.println(variable++);
System.out.println(variable--);
System.out.println(--variable);
System.out.println(variable);
}
}

Indicar la salida por pantalla de cada instrucción.
Programación Orientada a
Objetos en Java (XXII)

Operadores aritméticos en conjunción con el
operador de asignación
variable
variable
variable
variable
variable
+=
-=
/=
*=
%=
expresion;
expresion;
expresion;
expresion;
expresion;
//
//
//
//
//
variable
variable
variable
variable
variable
=
=
=
=
=
variable
variable
variable
variable
variable
+
–
/
*
%
expresion
expresion
expresion
expresion
expresion
Programación Orientada a
Objetos en Java (XXIII)
Operadores relacionales. Operadores que
consiguen uno de los dos valores lógicos:
true o false.

Operador
Significado
Ejemplo
==
Igual a
a == b
!=
No igual a
a != b
>
Mayor que
a > b
<
Menor que
a < b
>=
Mayor o igual que
a >= b
<=
Menor o igual que
a <= b
Programación Orientada a
Objetos en Java (XXIV)

Operadores lógicos:
Operador
!
||
&&
^
Significado
Tabla de verdad
a
No lógica, negación
O lógica
Y lógica
O exclusiva
Ejemplo
!a
true
false
a
true
true
b
true
false
false
true
a || b
true
true
false
true
true
false
false
false
a
b
a && b
true
true
true
true
false
false
false
true
false
false
false
false
a
true
true
b
true
false
a ^ b
false
true
false
true
true
false
false
false
!(x < y)
x < n || y > 9
x < n && y > 9
x < n ^ y > 9
Programación Orientada a
Objetos en Java (XXV)



Operan sobre operandos booleanos y
generan resultados booleanos.
Se evalúan de izquierda a derecha.
El máximo exponente son las operaciones
OR y AND.



OR: Si el operando de la izquierda es true, no
se evalúa el de la derecha.
AND: Si el operando de la izquierda es false,
no se evalúa el de la derecha.
Para obligar a evaluar ambos: ‘|’ y ‘&’
Programación Orientada a
Objetos en Java (XXVI)

Instrucciones condicionales.

Simple:
if (CONDICION)
{
INSTRUCCIONES
}

Doble:
if (CONDICION)
{
INSTRUCCIONES
}
else
{
INSTRUCCIONES
}
Programación Orientada a
Objetos en Java (XXVII)

Múltiple:
switch(VARIABLE)
{
case VALOR1:
break;
case VALOR2:
break;
...
case VALORn:
break;
default:
break;
}
Programación Orientada a
Objetos en Java (XVIII)

Instrucciones repetitivas:

Hay de dos tipos:

De 0 a N: for y while
for (INICIALIZACION; CONDICION; PASO)
{
INSTRUCCIONES
}
while(CONDICION)
{
INSTRUCCIONES
}

De 1 a N: do ... while
do
{
INSTRUCCIONES
}
while(CONDICION);
Programación Orientada a
Objetos en Java (XXIX)

Métodos.

La signatura de un método es lo que lo define.
tipo_retorno + identificativo + ( + [parámetro(s)] + )

Los parámetros son definiciones de variables con ámbito
local (de método) pero que reciben un valor inicial
cuando se haga la llamada el método.
tipo + identificativo



Java soporta sobrecarga: definición de dos métodos en la
misma clase con el mismo identificativo pero con número
o tipo de parámetros diferentes.
Si no se quiere devolver nada se usa el tipo “void”.
Tipos primitivos Vs tipos no primitivos (clases) en
métodos.
Programación Orientada a
Objetos en Java (XXX)

Constructores






Métodos especiales que se ejecutan en el
momento de creación de un objeto (new).
No devuelven valor (ni void).
Se llaman igual que la clase.
Puede haber sobrecarga.
Por defecto siempre hay un constructor que no
recibe parámetros.
Preguntas:


¿Qué pasa si ponemos un único constructor con
parámetros?
¿Qué pasa si ponemos un constructor con encapsulación
privada?
Programación Orientada a
Objetos en Java (XXXI)

El tipo de datos String




Es un tipo de datos abstracto (clase) que está definido en el
paquete java.lang.
Es el único tipo abstracto de Java que tiene su propia constante
literal conocida dentro de la sintaxis del lenguaje (la gramática).
Por ello, una asignación como
String s = “cadena”;
Implica directamente la creación (new) de un objeto. Es similar a:
String s = new String(“cadena”);
Tiene multitud de funcionalidades útiles para control de
subcadenas.
Para poder concatenar cadena se usa el operador ‘+’ que permite
incluso convertir tipos de datos no String a cadenas.
Programación Orientada a
Objetos en Java (XXXII)

Ejemplo: Desarrollar un programa para aclarar el concepto de variable
estática (de clase) y no estática (de instancia).
package cursojava.estatic;
public class DeClaseDeInstancia
{
public static void main(String[] args)
{
Ayuda a1 = new Ayuda();
Ayuda a2 = new Ayuda();
Ayuda a3 = new Ayuda();
System.out.println(a1.deClase);
System.out.println(a1.deInstancia);
}
}
class Ayuda
{
public static int deClase;
public int deInstancia;
public Ayuda()
{
deClase++;
deInstancia++;
}
}
Programación Orientada a
Objetos en Java (XXXIII)

Ejemplo: Desarrollar un programa para aclarar el paso de parámetros por
valor y por referencia.
package cursojava.valref;
public class ValorYReferencia
{
public static void metodo(int valor)
{
valor++;
}
public static void metodo(Ayuda valor)
{
valor.valor++;
}
public static void main(String[] args)
{
int valor = 5;
metodo(valor);
System.out.println(valor);
Ayuda objeto = new Ayuda();
objeto.valor = 5;
metodo(objeto);
System.out.println(objeto.valor);
}
}
class Ayuda
{
public int valor = 0;
Programación Orientada a
Objetos en Java (XXXIV)

Arrays en Java


Un array es un conjunto de datos del mismo tipo situados
de forma consecutiva.
Las variables array en Java son referencias. Por tanto, los
arrays son objetos y hay que crearlos.
tipo + [] + id + = + new + tipo + [ + cantidad + ] + ;
El new ha creado el objeto del array. 2 casos:


Tipos primitivos: Los datos del array se habrán creado también
(ya que los tipos primitivos se crean directamente).
Tipos no primitivos (clases): Los datos son referencias a
null y por tanto deben crearse a parte.
Programación Orientada a
Objetos en Java (XXXV)

En la declaración se pueden poner los corchetes “[]”:
Después del tipo: Indica que TODOS los identificativos que se
definan serán arrays.
tipo + [] + id ...
 Después del identificativo: Indica que ese identificativo será
el único que es array.
tipo + id + [] + ...


En Java no se permite indicar en la declaración del array
el número de elementos del mismo.
tipo + [] + id + = + new + tipo + [ + cantidad + ] + ;


Los arrays en Java tienen índices entre 0 y cantidad
– 1.
¿Qué pasa si me salgo de rango?
Programación Orientada a
Objetos en Java (XXXVI)

La inicialización de los elementos de un array puede ser:





Elemento a elemento:
tipo[] id = new tipo[2];
id[0] = valor;
id[1] = valor;
Inicialización en declaración: Se usan llaves.
tipo[] id = {valor, valor};
La copia entre arrays no se puede realizar mediante la asignación
(¿por qué?).
Existe un método java.lang.System.arrayCopy que ofrece el
mayor rendimiento.
El tamaño de un array se puede conocer haciendo uso de un
atributo llamado length que todo array en Java posee.
Programación Orientada a
Objetos en Java (XXXVII)


Los arrays multidimensionales se declaran mediante el
uso de [] consecutivos.
Realmente son referencias que contienen referencias
(arrays dentro de arrays).
tipo[][] id = new tipo[cantidad1][cantidad2];
tipo[][] id = {{valor, valor}, {valor, valor}};

Para acceder a conocer el número de elementos de cada
dimensión se usa el mismo atributo length pero desde
referencias distintas.
id.length // Indica la cantidad1
id[indice].length // Indica la cantidad2
Programación Orientada a
Objetos en Java (XXXVIII)

Entrada/Salida estándar.

java.lang.System.out es de tipo java.io.PrintStream
que tiene los métodos necesarios para mostrar información por la
salida estándar.
java.io.PrintStream.print()
java.io.PrintStream.println()

java.lang.System.in es de tipo java.io.InputStream
que tiene métodos muy básicos de lectura de información desde
la entrada estándar. Para leer información más elaborada
(cadenas de caracteres) se suelen usar objetos del tipo
java.io.BufferedReader.
new BufferedReader(new InputStreamReader(System.in))
Programación Orientada a
Objetos en Java (XXXIX)

Excepciones (básico).



Las excepciones son una forma de control de flujo.
Se usan para indicar situaciones concretas en la
ejecución del programa (errores, avisos, etc.)
Lanzamiento de excepciones:

Uso de la instrucción “throw” acompañando a un objeto
(que es el que se lanza).
Programación Orientada a
Objetos en Java (XXXX)

Gestión de excepciones


Bloque de código entre las instrucciones
try
{
}
catch(PARAMETRO)
{
}
Relanzamiento: El método puede indicar que no será él el
encargado de capturar la excepción y transmite su gestión
sucesivamente a los método que le llamaron. Se usa la
palabra reservada “throws” acompañando al tipo de datos
de la excepción al final de la definición del método.
tipo_retorno + identificativo + ( + [parámetro(s)] + ) + throws tipo_excepcion
Programación Orientada a
Objetos en Java ()

Existen dos tipos de excepciones.


Excepciones en tiempo de ejecución
(Runtime): Como son excepciones que pueden
surgir en cualquier momento por errores en
tiempo de ejecución, no es obligatoria su captura
ni su relanzamiento.
Las demás excepciones: Se determina que el
desarrollador querrá tener control (capturar o
relanzar) este tipo de situaciones, por lo que son
obligatorias.
Programación Orientada a
Objetos en Java ()

Mapeo de tipos primitivos en tipos abstractos.

Java ofrece dentro del paquete java.lang un
mapeo de lo tipos primitivos de datos en tipos
abstractos (clases).







byte
char
short
int
float
double
<->
<->
<->
<->
<->
<->
Byte
Character
Short
Integer
Float
Double
Esta característica tiene multitud de utilidades. Una de
las más peculiares es la posibilidad de construir
valores primitivos desde valores de tipo cadena.
Programación Orientada a
Objetos en Java ()

Ejercicio Propuesto: Desarrollar un
programa
(cursojava.param.Parametros) que
presente por pantalla todos los parámetros
que se le hayan pasado por línea de
comandos.
Programación Orientada a
Objetos en Java ()

Ejercicio Propuesto: Crear una clase llamada
EntradaDatos dentro del paquete
cursojava.util que permita leer de teclado
valores de tipos de datos primitivos:




int: leerEntero
double: leerReal
char: leerCaracter
String: leerCadena
Realizar el control correspondiente mediante
iteraciones sucesivas.
Programación Orientada a
Objetos en Java ()

Ejercicio Propuesto: Desarrollar un
programa
(cursojava.euros.DesgloseCantidad)
que pida al usuario que introduzca un valor
entero en euros por teclado y desglose dicha
cantidad en:


Billetes: 500є, 200є, 100є, 50є, 20є, 10є
Monedas: 2є, 1є
Visualizar cada cantidad por pantalla.
Programación Orientada a
Objetos en Java ()

Ejercicio Propuesto: Desarrollar un programa
(cursojava.aritmetica.MenuAritmetico) que
visualice repetidamente un menú por pantalla donde se
puedan seleccionar distintas operaciones a realizar:







1.- Suma
2.- Resta
3.- Multiplicación
4.- División
5.- Resto
6.- ¿Es primo?
7.- Salir.
Realizar modularmente la programación necesaria para
resolver los cálculos.
Programación Orientada a
Objetos en Java ()

Ejercicio Propuesto: Desarrollar un programa
(cursojava.rect.RectanguloRelleno)
que pida al usuario que introduzca la base y la
altura (enteras de no más de 15) de un
rectángulo para dibujarlo usando asteriscos:
******
******
******


Modificarlo para que el usuario introduzca el carácter
a usar en el dibujado.
Modificarlo para que dibuje un rectángulo sin rellenar.
(cursojava.rect.RectanguloHueco)
Programación Orientada a
Objetos en Java ()

Ejercicio Propuesto: Desarrollar un
programa
(cursojava.adivina.AdivinaNumero)
que calcule un número aleatorio entre 1 y 100
y pida sucesivamente al usuario que intente
adivinarlo indicándole si el número aleatorio
es mayor o menor al número que haya
introducido.

Modificarlo para que el usuario pueda decidir si
quiere o no jugar una vez acertado el número.
Programación Orientada a
Objetos en Java ()

El objeto this.



La referencia para poder usar EL objeto desde el
código de una clase.
Siempre accesible en entornos no estáticos.
No es obligatorio más que en algunas ocasiones:


Para poder llamar a un constructor desde otro
constructor. Debe ser la primera instrucción del
constructor.
En casos de ambigüedad entre datos miembro y
variables locales de un método.
Programación Orientada a
Objetos en Java ()

Relaciones entre objetos.



Las clases no son conceptos independientes.
La POO permite modelar en dominio del problema a nivel de
programación de forma casi directa.
Hay dos tipos de relaciones.


Inclusión: Define la relación “... tiene un ...”. Se materializa mediante
un atributo de una clase en otra. Un atributo de la clase es un objeto de
otra clase
Herencia: Define la relación “... es un ...”. Se materializa mediante la
generalización de una clase sobre otra.
Programación Orientada a
Objetos en Java ()

Herencia.




Herramienta que permite generalizar conceptos.
Se crea una jerarquía. Los conceptos “padre” definen
características comunes que los conceptos “hijo”
heredan como propias.
Java no permite la herencia múltiple.
Se usa la palabra reservada “extends” para
relacionar las dos clases.
class ClaseDerivada extends ClaseBase
Programación Orientada a
Objetos en Java ()

Con esta nueva forma de relacionar conceptos
surge un nuevo tipo de encapsulación:
protegida.



Se usa la palabra reservada “protected”.
Define miembros que son accesibles desde la propia
clase y desde las clases derivadas.
Además, es equivalente a la encapsulación pública
para clases del mismo paquete.
Programación Orientada a
Objetos en Java ()

Encapsulación.
Encapsulación Desde la clase
Desde clase
derivada
Desde clase
del paquete
private
X
en blanco
X
protected
X
X
X
public
X
X
X
Desde clase
de otro
paquete
X
X
Programación Orientada a
Objetos en Java ()

Gracias a la herencia se permite poder referenciar
a un objeto de tipo derivado como tipo base.
TipoBase objBase = new TipoDerivado();

Esta utilidad permite poder tratar de la misma
forma a todos los elementos derivados (estén en
el punto en el que estén dentro de la jerarquía).
TipoBase[] array = new TipoBase[cantidad];
array[indice0] = new TipoDerivado1();
array[indice1] = new TipoDerivado2();
Programación Orientada a
Objetos en Java ()



Los objetos derivados se construyen en cascada, empezando desde
la clase “más base” hacia abajo. Así puede observarse realmente que
cuando se crea un objeto derivado, realmente se crean los objetos
base también.
Este comportamiento tiene sus implicaciones cuando se pierde el
constructor por defecto: Hay que llamar explícitamente al constructor
base.
Existe el objeto “super” que representa la referencia al objeto base
que también se creó. Este objeto se puede utilizar para:



Explicitar el uso de un miembro base.
Llamar a constructores base desde constructores derivados. Debe ser la
primera instrucción del constructor.
Toda clase en Java hereda siempre de la clase java.lang.Object.

¿Qué utilidad puede tener esto?
Programación Orientada a
Objetos en Java ()

Polimorfismo.



Una característica de la POO aplicable a los
métodos.
Permite ejecutar un código de método distinto
según el objeto que se haya instanciado y al que
se referencie.
Necesidades para que se dé en Java:


Relación de herencia.
Exactamente la misma signatura de método en ambas
clases (padre e hija).
Programación Orientada a
Objetos en Java ()

Clases abstractas.

Son clases declaradas con la palabra reservada
“abstract”.
public abstract class ClaseDeclaradaAbstracta
{ ...



No se pueden instanciar (no se puede hacer new
ClaseDeclaradaAbstracta).
Su única finalidad es que otras clases hereden de
ellas.
Sirven para poder implementar conceptos que no
deban existir físicamente.
Programación Orientada a
Objetos en Java ()

Los métodos puede declararse con la palabra
reservada “abstract”
public abstract void metodo();



Estos métodos no pueden tener cuerpo (se
pone un ‘;’ al final directamente).
Una clase con al menos un método abstracto,
debe declararse abstracta.
La característica de la abstracción se propaga
por la jerarquía. Los métodos abstractos
deberán ser implementados gracias al
polimorfismo en clases derivadas.
Programación Orientada a
Objetos en Java ()

Interfaces.


El máximo exponente del polimorfismo. Son equivalentes a una clase
completamente abstracta: todos sus métodos son abstractos (sin
cuerpo).
Se declaran con la palabra reservada (“interface”).
public interface NombreInterfaz
{
// datos
// métodos (sólo signatura)
}



Puede tener datos.
Los métodos se declaran de forma normal (sin “abstract”) y definen
la signatura a implementar en las clases que implementen la interfaz.
Las clases pueden implementar todas las interfaces que quieran. Se
usa la palabra reservada “implements”.
public class ClaseConInterfaz implements NombreInterfaz
Programación Orientada a
Objetos en Java ()


La abstracción permite definir interfaces (signaturas
de métodos) que gracias al polimorfismo,
implementarán las clases
derivadas/implementadoras.
Gracias a que un objeto creado como derivado
puede referenciarse desde un tipo de datos base
(clase abstracta o interfaz), se puede ejecutar
código distinto según el objeto derivado sin tener
que conocerlo.
ClaseAbstracta[] objAbs = new ClaseAbstracta[cantidad];
objAbs[indice0] = new ClaseImplementadora1();
objAbs[indice1] = new ClaseImplementadora2();
Programación Orientada a
Objetos en Java ()

Métodos y clases “final”.

Si se indica en un método, no se podrá “polimorfear”
ese método en clases derivadas.
class MiClase
{
public final void metodoNoPolimorfeable()
{ ...

Si se indica en una clase, no se podrá heredar de
dicha clase.
final class ClaseNoHeredable
{ ...
Por ejemplo, los tipos de datos básicos mapeados en
clases son de tipo final.
Programación Orientada a
Objetos en Java ()

Mediante el operador “instanceof” se
pueden conocer los tipos abstractos de un
objeto que se creó con el operador “new”.
boolean b = (objeto instanceof TipoClase);
Programación Orientada a
Objetos en Java ()

Ejemplos de uso de herencia/polimorfismo:






Empresa – Empleados.
Lectura / Escritura de datos. (XML, PrintWriter
(System.out o en Servlets), etc.)
Editor gráfico.
Profesor – Conexión – Alumnos.
Interfaz humano computador (texto, ventana, web, ...).
Desarrollo de componentes (java.util.*)

java.lang.Object

equals, finalize, toString, toString, clone, hashCode
Programación Orientada a
Objetos en Java ()

Consecuencias del polimorfismo:




Ampliable: Permite poder añadir nuevos tipos
de datos completamente nuevos. Plug-ins.
Reusable: Permite definir elementos que usan
una interfaz y que pueden compilarse una sola
vez y durarán para “siempre”.
Flexible: Se puede cambiar el comportamiento
de forma muy sencilla (un simple new).
Independencia: Los módulos se independizan.
Se podrían incluso desarrollar en paralelo.
Programación Orientada a
Objetos en Java ()

Excepciones (Avanzado)




Las excepciones poseen una estructura jerárquica. Para que un
objeto pueda ser lanzado (throw) necesita heredar de la clase
java.lang.Throwable.
De esta clase heredan los errores (java.lang.Error) y las
excepciones (java.lang.Exception). Los desarrolladores deben
capturar las excepciones.
A partir de Exception heredan muchas excepciones pero las
java.lang.RuntimeException no hay obligatoriamente que
capturarlas.
Las instrucciones catch se ven afectadas por la jerarquía y deben
ponerse en orden ascendente, desde las más bajas en la jerarquía
a las más altas.

¿Qué pasaría si se pusiese un catch de java.lang.Throwable?
Programación Orientada a
Objetos en Java ()

Bloque finally


Esta palabra reservada permite indicar un bloque de código que
se ejecutará siempre tanto si se lanza una excepción como si no.
Su uso está muy ligado a la liberación correcta de recursos. Por
ejemplo, cerrar un fichero, indicar valores en caso de error etc.
public static void main(String[] args)
{
...
try
{
...
}
... // catches, pero es opcional
finally
{
}
}
Jar



Permite conseguir en un fichero englobar distintos ficheros
objeto.
Se encuentra en el directorio bin del JDK.
Tiene diversas opciones
c:
 v:
 f:
 x:
jar


crear un fichero .jar.
Crear una salida con información más detallada del proceso.
Indicar el nombre del fichero.
extraer ficheros.
cvf FICHERO.jar FICHEROS_O_RUTAS_CON_.class
En el classpath se pueden indicar o rutas (directorios) o
ficheros .jar.
Patrones de diseño


Diseños establecidos para poder dar
soluciones a problemas comunes.
Usan las herramientas de la orientación
a objetos como base pero pueden ser
implementados en cualquier lenguaje
orientado a objetos (java, C++,
Smalltalk, C#, ...)
Patrones de diseño

Singleton


Planteamiento: ¿Cómo puedo conseguir controlar el
número de instancias que se van a crear de una clase?
Solución:




Control = Encapsulación.
Creación = Constructores.
Combinación = Constructores privados.
¿Cómo conseguir que se pueda construir desde dentro
si no puedo construir? Acceso mediante un método
estático. Control mediante variables estáticas (únicas).
Patrones de diseño
public class Singleton
{
private static Singleton instance = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
Patrones de diseño

Observer


Planteamiento: ¿Cómo puedo avisar de cierto
comportamiento de una clase a todos aquellos
que quieran conocerlo independientemente de
quién quiera conocerlo?
Solución:


Independencia = abstracción = interfaz.
Hay dos elementos:


Generador = Observable.
Escuchador = Observer.
Patrones de diseño
Patrones de diseño

El patrón Observer en la API de Java.
Acceso a Bases de Datos en
Java (I)

Uso de la API JDBC (Java Data Base
Control)


Se trata de una API que define interfaces
de acceso a datos completamente
independientes de la implementación real
de dichos datos.
La API engloba a distintos conceptos
definidos en el paquete java.sql.
Acceso a Bases de Datos en
Java (II)

El acceso a la implementación de datos lo realiza un
driver concreto.

Esta carga se realiza usando la API de reflection de Java.
Class.forName(“NOMBRE_CON_PAQUETES_DE_LA_CLASE_DRIVER”);


Los drivers no son más que clases Java.
El acceso real se realiza a través de conexiones a los
datos.

La clase DriverManager se encarga de crear la conexión
a partir del driver que se necesite.
DriverManager.getConnection(“URL_DE_CONEXIÓN_SEGÚN_DRIVER”);
El objeto que se crea implementa la interfaz Connection.
Acceso a Bases de Datos en
Java (III)

Consultas con JDBC


De la conexión a datos se pueden crear
sentencias (statement).
Las sentencias se crean con los métodos:
Statement createStatement()
PreparedStatement
prepareStatement(String)
de Connection.
Acceso a Bases de Datos en
Java (IV)

La interfaz Statement permite controlar las sentencias.
En su uso más sencillo permite:

Actualización:

DELETE, UPDATE, INSERT
int executeUpdate(String) // Devuelve el nº de elementos actualizados

Consulta:

SELECT
ResultSet executeQuery(String) // Devuelve una vista

La interfaz PreparedStatement extiende a Statement por
lo que permite lo mismo. En su cadena de especificación
se usa el carácter ‘?’ para identificar los valores variables.
Posee métodos específicos para asignarlos
posteriormente (setXXX(int indice, XXX)) en
orden 1 a N.
Acceso a Bases de Datos en
Java (V)

El recorrido de un objeto que implemente la
interfaz ResultSet:
ResultSet rs = XXXXX;
while(rs.next())
{
}
Ahora se pueden ir extrayendo los datos usando
los métodos getXXX() con dos posibles
parámetros:


Nombre de la columna.
Índice de la columna de 1 a N.
Acceso a Bases de Datos en
Java (VI)

Acceso a MetaDatos


Permite conocer la estructura de la base de datos (no su
contenido).
Se usan las interfaces:

DataBaseMetaData: Aporta toda la información acerca del
acceso a datos (nombres de tablas, columnas de una tabla,
primary keys, foreign keys, ...). Se extrae de la interfaz
Connection.
DataBaseMetaData getMetaData()

ResultSetMetaData: Aporta información sobre la vista. Se
extrae de la interfaz ResultSet.
ResultSetMetaData getMetaData()
Swing (I)



API que define un extenso conjunto de
clases para manejar componentes visuales
a nivel de ventana en el paquete
javax.swing y subpaquetes.
Se basa en una API llamada AWT (Abstract
Window Toolkit) definida en java.awt.
Gracias a la herencia se puede extender la
funcionalidad básica.
Swing (II)


Todo componente visual hereda de
java.awt.Component.
Define lo básico:





Tamaño.
Posición.
Dibujado.
Visibilidad/Habilitación.
Eventos:




Teclado
Ratón
Redimensionado
Jerarquía.
Swing (III)

Además de haber una jerarquía de clases, AWT, y por
tanto Swing, define una jerarquía de componentes
mediante inclusión.
Swing (IV)

La clase Container, además de ser un
Component, permite almacenar
Components.



Container tiene un Component.
De esta forma se puede hacer que algunos
componentes contengan a otros, que a su vez
pueden ser contenedores de otros etc...
Esta relación se crea usando el método add.
Swing (V)



Aunque se puede usar AWT, Swing es
todavía más independiente de plataforma.
Swing añade nuevas funcionalidades
avanzadas.
AWT y Swing poseen inmensidad de
funcionamiento interno, desde control de
hilos independientes hasta comunicación
nativa con el Sistema Operativo.
Swing (VI)

Ventana:






En AWT: java.awt.Frame
En Swing: javax.swing.Jframe
Realmente la de Swing extiende a la de AWT.
Se suele extender de ellas para ampliar su
funcionalidad.
Crean un hilo de ejecución paralelo al de la
aplicación.
Es un Container por lo que puede contener
a otros componentes.
Swing (VII)

Métodos principales:



void setVisible(boolean): Permite visualizar o
no un componente.
void dispose(): Cierra la ventana.
void setSize(int, int): Asigna un tamaño a un
componente.




Width = ancho
Height = alto.
java.awt.Dimension getSize(): Permite conocer
el tamaño de un componente.
void setEnabled(boolean): Permite
habilitar/Deshabilitar un componente.
Swing (VIII)

Panel:






En AWT: java.awt.Panel.
En Swing: javax.swing.JPanel.
En este caso no hay relación herencia.
Es el contenedor más sencillo.
Su utilidad suele ser la de poder manejar los
componentes que engloba desde un único
punto.
Ayuda a organizar los componentes.
Swing (IX)

Label:





En AWT: java.awt.Label.
En Swing: javax.swing.JLabel.
En este caso no hay relación de herencia.
Permite visualizar un texto simple.
Métodos principales:






void setText(String): Asigna el texto.
String getText(): Recoge el texto.
void setHorizontalAlignment(int): Sólo en Swing. Asigna el
tipo de alineación horizontal del texto. Los valores están definidos en
SwingConstants.
int getHorizontalAlignment(): Sólo en Swing. Recoge el tipo
de alineación horizontal del texto.
void setAlignment(int): Sólo en AWT. Los valores están
definidos en Label.
int getAlignment(): Sólo en AWT.
Swing (X)

Cuadros de texto:





En AWT: java.awt.TextField.
En Swing: javax.swing.JTextField.
En este caso no hay relación de herencia.
Permite introducir un texto de una línea.
Métodos principales:






void setText(String): Asigna el texto.
String getText(): Recoge el texto.
void setHorizontalAlignment(int): Sólo en Swing. Asigna el tipo de
alineación horizontal del texto. Los valores están definidos en
SwingConstants.
int getHorizontalAlignment(): Sólo en Swing. Recoge el tipo de
alineación horizontal del texto.
void setAlignment(int): Sólo en AWT. Los valores están definidos en
Label.
int getAlignment(): Sólo en AWT.
Swing (XI)

Áreas de texto:





En AWT: java.awt.TextArea.
En Swing: javax.swing.JTextArea.
En este caso no hay relación de herencia.
Permite introducir un texto de una línea.
Métodos principales:




void setText(String): Asigna el texto.
String getText(): Recoge el texto.
void append(String): Añade texto al final.
void insert(String, int): Inserta texto en
una posición.
Swing (XII)

Botones:


Los hay de muchos tipos.
El tipo básico:




En AWT: java.awt.Button.
En Swing: javax.swing.JButton.
En este caso no hay relación de herencia.
Métodos principales:




void setLabel(String): Asigan el texto (Deprecated en
Swing).
void setText(String): Asigna el texto.
String getLabel(): Recoge el texto (Deprecated en Swing).
String getText(): Recoge el texto.
Swing (XIII)

Botones con estado:




En AWT: java.awt.CheckBox.
En Swing: javax.swing.JCheckBox.
En este caso no hay relación de herencia.
Métodos principales:





void setLabel(String): Asigan el texto
(Deprecated en Swing).
void setText(String): Asigna el texto.
String getLabel(): Recoge el texto (Deprecated en
Swing).
String getText(): Recoge el texto.
boolean getState(): Recoge el estado (sólo en
AWT).
Swing (XIV)

Contenedores de items:

Listas:


En AWT: java.awt.List
Métodos:











void add(String): Añade un elemento.
void remove(String): Elimina un elemento.
void remove(int): Elimina un elemento según su posición.
int getItemCount(): Indica el nº de elementos que contiene.
String getItem(int): Recoge un elemento según su posición.
String[] getItems(): Recoge todos los elementos.
int getSelectedIndex(): Recoge el índice del elemento seleccionado.
void select(int): Indica cúal debe ser el elemento seleccionado.
void setMultipleMode(boolean): Permite aplicar la selección múltiple.
boolean isMultipleMode(): Indica si permite selección múltiple.
String[] getSelectedItems(): Recoge los elementos seleccionados.
Swing (XV)



En Swing: javax.swing.JList
Para modificar su contenido se le asocia un concepto que implemente
la interfaz javax.swing.ListModel. Existe una implementación
por defecto javax.swing.DefaultListModel.
Métodos de DefaultListModel:






void add(int, Object): Añade un elemento en una posición.
void addElement(Object): Añade un elemento al final.
Object get(int): Recoge un elemento de una posición.
int getSize(): Indica el nº de elementos.
void remove(): Elimina elemento. Recibe o un int o un Object.
Métodos de JList:




void setModel(ListModel): Asigna un modelo.
int getSelectedIndex(): Indica el elemento seleccionado.
int[] getSelectedIndices(): Indica los elementos seleccionados.
int getSelectionMode(): Un valor definido en
ListSelectionModel.
Swing (XVI)

Combo boxes:



Sólo en Swing: javax.swing.JComboBox
Para modificar su contenido se le asocia un concepto que implemente la
interfaz javax.swing.ComboBoxModel. Existe una implementación
por defecto javax.swing.DefaultComboBoxModel.
Métodos de DefaultComboBoxModel:





void addElement(Object): Añade un elemento en una posición.
Object getElementAt(int): Recoge un elemento de una posición.
int getSize(): Indica el nº de elementos.
void removeElement(Object): Elimina un elemento.
Métodos de JComboBox:




void setModel(ComboBoxModel): Asigna un modelo.
int getSelectedIndex(): Indica el elemento seleccionado.
int[] getSelectedIndices(): Indica los elementos seleccionados.
int getSelectionMode(): Un valor definido en ListSelectionModel.
Swing (XVII)


Layouts: Se definen ciertos conceptos para poder
organizar los componentes dentro de un
Container.
Los Layouts definen la interfaz LayoutManager y
se relacionan con el Container mediante el método
void setLayout(LayoutManager)

El uso del Layout se especifica al añadir el
componente al Container mediante las
sobrecargas del método add().
Swing (XVIII)

java.awt.BorderLayout

Permite ordenar componentes de un Container
usando los puntos cardinales:


NORTH, SOUTH, EAST, WEST y CENTER.
Estas constantes están definidas en la propia clase
BorderLayout.
contenedor.add(componente, BorderLayout.NORTH)

java.awt.FlowLayout

Ordena los componentes de un Container de
izquierda a derecha secuencialmente según el
orden de inclusión usando el método add().
Swing (XIX)

java.awt.GridLayout



Permite ordenar los componentes de un
Container en forma de matriz bidimensional.
La propia clase tiene métodos para poder
especificar las dimensiones de la matriz.
Los componentes se van asignando
a la matriz de izquierda a derecha y
de arriba abajo al utilizar el método
add().
Swing (XX)

Gestión de Eventos:



Se utiliza el patrón observer pero con
implementaciones particulares según el
componente y los eventos.
Se define una interfaz XXXListener que se
asocia con el generador mediante métodos del
addXXXListener o removeXXXListener.
Para cada XXXListener con más de un
método, existe una implementación vacía
XXXAdapter para facilitar ciertos casos de uso.
Swing (XXI)

Eventos comunes (Interfaces asociadas):

java.awt.Component





java.awt.Container


java.awt.event.ComponentListener: Eventos relacionados con lo
general en un componente.
java.awt.event.KeyListener: Eventos de teclado. Sólo son activos
cuando el componente tiene el foco.
java.awt.event.MouseListener: Eventos de ratón. Sólo referentes
al componente.
java.awt.event.MouseMotionListener: Evntos de ratón en
movimiento y drag-and-drop.
java.awt.event.ContainerListener: Eventos relacionados con la
jerarquía de componentes.
java.awt.Window

java.awt.event.WindowListener: Eventos relacionados con una
ventana.
Swing (XXII)

java.awt.Button, java.awt.List, java.awt.TextField,
javax.swing.JAbstractButton, javax.swing.JComboBox,


java.awt.CheckBox, java.awt.List


java.awt.event.ItemListener: Evento que se lanza cuando hay un
cambio de selección.
java.awt.TextComponent


java.awt.event.ActionListener: Evento que se lanza cuando se
actúa sobre el componente.
java.awt.event.TextListener: Evento relacionado con el cambio
del texto.
javax.swing.JList

javax.swing.event.ListSelectionListener: Evento relacionado
con el cambio de selección de un elemento.
Ant




Herramienta para definir tareas a realizar.
El software se puede conseguir en
www.ant.apache.org
Simplemente basta con descomprimir.
Hay que añadir algunas variables del sistema:


ANT_HOME: El directorio base donde está instalado Ant.
No es mala idea añadir el directorio bin de la instalación
de Ant a la variable PATH.
Ant

Elementos de un fichero BuildFile de Ant:

Proyecto: Un conjunto de objetivos. project

Atributos:



name: El nombre del proyecto. No es obligatorio.
default: El objetivo por defecto que se ejecutará. Es
obligatorio.
basedir: La ruta sobre la que trabajar. No es obligatorio.
Ant

Objetivo: Es un conjunto de tareas. target

Atributos:





name: El nombre del objetivo. Es obligatorio.
depends: Permite indicar que un objetivo depende de la
ejecución de otro(s). Los distintos objetivos se indican
separados por comas. No es obligatorio.
if: Permite condicionar la ejecución de un objetivo a la
existencia de una propiedad. No es obligatorio.
<target name=“objetivo” if=“propiedad”/>
unless: Lo mismo que if pero al contrario, se ejecuta a
menos que exista una propiedad. No es obligatorio.
<target name=“objetivo” unless=“propiedad”/>
description: Una descripción del objetivo. No es
obligatorio.
Ant

Tareas: task
<name attrib2=“value1” attrib2=“value2” .../>



En los valores se puede hacer referencia a
propiedades definidas con anterioridad.
Existen tareas ya creadas, otras opcionales y es muy
sencillo crear nuevas tareas.
A cualquier tarea se le puede asignar un atributo id
para poder identificarla/usarla en otros puntos.
Ant

Propiedades: Se definen mediante la tarea property o
fuera de Ant.




Se les asigna un nombre con el atributo name.
Para poder tener acceso a ellas se pueden usar indicando el
nombre entre ‘${‘ y ‘}’.
Ant permite acceso a las variables del sistema. Un listado de las
mismas se puede obtener en la documentación de la API de
java en el método java.lang.System.getProperties.
Además Ant posee otras propiedades.
basedir
ant.file
ant.version
ant.project.name
ant.java.version
Ant
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<tstamp/>
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init" description="compile the source">
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile" description="generate the distribution">
<mkdir dir="${dist}/lib"/>
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean" description="clean up" >
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
Ant


Las tareas <property>, <typedef> y
<taskdef> son especiales y se permite
definirlas fuera de un objetivo.
Cuando se añade el atributo description a un
objetivo, es como si se declarase público.