Java Modulo 2
Clases, Herencia, Interfaces
Contenido
Arreglos
UML: Diagramas de
Clase
Declarando clases: repaso
+ detalle
Atributos y mtodos de
clase
Modificadores de Acceso
Herencia
De Diagramas de Clase a
Java
Paquetes
Clases Abstractas
Interfaces
Vector
Colecciones
Tipos
Bsicos: int, float, etc
Clases: Integer, Float, String, etc
Arrays
Almacenan multiples valores de cualquier tipo
Se crean con new
Se usan [] para declarar y acceder
Arrays
Declaracion
equivale a
int[] a;
a es un array; b y c son enteros
int a[];
a, b y c son arrays:
int a[], b, c;
int[] a, b, c;
Instanciacion
a = new int[20];
a[0] = 15; // desde cero
System.out.println(a.length); // imprime 20
int[] a = new int[20];
Arreglos
Inicializacion de Arrays
Sus elementos se inicializan al valor por defecto del tipo
correspondiente
int[] cuadrados = {0, 1, 4, 9};
que equivale a
int[] cuadrados = new int[4];
cuadrados[0] = 0;
cuadrados[1] = 1;
cuadrados[2] = 4;
cuadrados[3] = 9;
Ejemplos de Arrays
int[] digitos = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
String[] dias = {"lunes","martes","mircoles","jueves",
"viernes","sbado","domingo"};
Fecha[] festivos = { new Fecha ( 1, 1, 2000),
new Fecha ( 15, 5, 2000),
new Fecha ( 12, 10, 2000),
new Fecha ( 6, 12, 2000),
}
Recorrido:
int[] lista = new lista[10];
for (int i = 0; i < lista.length; i++)
{
System.out.println(lista[i]);
}
Arrays Multidimensionales
Un array bidimensional es un array de arrays.
Se necesita un conjunto de corchetes por cada dimensin
int[] unAnno = new int[12];
int[][] tresAnnos = new int[3][12];
TresAnnos[0][0] = 2;
tresAnnos[2][11] = 1;
Arrays Bidimensionales No Rectangulares
Un array de 2 dimensiones se puede crear sin especificar el tamao de su
segunda dimensin
int[][] tresAnnos =
tresAnnos[0] = new
tresAnnos[1] = new
tresAnnos[2] = new
new int[3][];
int[12];
int[12];
int[12];
Si se indica slo una dimensin, sta debe ser la primera:
int[][] tresAnnos = new int[][3]; // Error
Esta separacin permite crear arrays no rectangulares
tresAnnos[0] = new int[12];
tresAnnos[1] = new int[5];
tresAnnos[2] = new int[9];
Inicializacin de Arrays
Multidimensionales
Se necesita un conjunto de datos
entre llaves para cada dimensin
int[][] matriz =
{
{1, 2, 3},
{4, 5, 6}
};
equivale a
int[][] matriz
new int[2][3];
matriz[0][0] =
matriz[0][1] =
matriz[0][2] =
matriz[1][0] =
matriz[1][1] =
matriz[1][2] =
=
1;
2;
3;
4;
5;
6;
Clases para Manejar Cadenas
de Caracteres
Hay dos clases en el paquete java.lang que permiten
la manipulacin de cadenas de caracteres:
La clase String maneja cadenas constantes, es decir, que no
pueden cambiar
La clase StringBuffer permite cambiar la cadena
insertando, aadiendo o borrando caracteres
La clase String es ms eficiente, mientras que la clase
StringBuffer ofrece ms posibilidades
Ejemplo con Strings: Palindromo
public class Palindrome {
public static boolean isPalindrome(
String stringToTest) {
String workingCopy =
removeJunk(stringToTest);
String reversedCopy =
reverse(workingCopy);
return reversedCopy.
equalsIgnoreCase(workingCopy);
}
protected static String removeJunk(String
string)
{
int i, len = string.length();
StringBuffer dest = new
StringBuffer(len);
char c;
protected static String reverse(String
string) {
StringBuffer sb = new
StringBuffer(string);
return sb.reverse().toString();
}
public static void main(String[] args) {
String string = "Madam, I'm Adam.";
System.out.println();
System.out.println(
"Testing whether the following "
+ "string is a palindrome:");
System.out.println("
" + string);
System.out.println();
if (isPalindrome(string)) {
System.out.println(
for (i = (len - 1); i >= 0; i--) {
"It IS a palindrome!");
c = string.charAt(i);
} else {
if (Character.isLetterOrDigit(c)) {
System.out.println(
dest.append(c);
"It is NOT a palindrome!");
}
}
}
System.out.println();
return dest.toString();
}
}
Mas Orientacion a Objetos
UML
Orientacin a Objetos
Clases: Patrones que indican como construir objetos
Objetos: Instancias de las clases en tiempo de ejecucin.
Miembros de la clase:
Atributos: Caractersticas o propiedades de los objetos (o clases).
Pueden ser variables de tipos simples o referencias a otros objetos
Mtodos: Comportamientos de los objetos. Son funciones que operan
sobre los atributos de los objetos.
Herencia, Relaciones, Agregaciones
UML: Unified Modeling Language
Lenguaje para varias metodologias
Presentaremos slo Diagramas de Clase
Una clase
class Persona {
// Atributos
private String nombre;
private String telefono;
private Persona padre;
private Persona madre;
// Constructores
public Persona(String nombre, String telefono) {
this(nombre,telefono,null,null);
}
public Persona(String nombre, String telefono,
Persona padre, Persona madre) {
this.nombre = nombre;
this.telefono = telefono;
this.padre = padre;
this.madre = madre;
.... }
// Metodos, acceden a atributos privados
public String nombre() {return nombre;}
public String telefono() {return telefono;}
public Persona padre() {return padre;}
public Persona madre() {return madre;}
public boolean hayPadre() {return padre != null;}
public boolean hayMadre() {return madre != null;}
}
El Lenguaje de Modelacin
Unificado (UML)
Es un lenguaje estndar para la
escritura
de
modelos
de
software. UML puede ser utilizado
para
visualizar,
especificar,
construir
y
documentar
los
artefactos de un sistema de
software intensivo.
Construccin de Bloques UML
Elementos
Relaciones
Diagramas
Elementos
Elementos Estructurales
Elementos de Comportamiento
interacciones, mquinas de estado
Elementos de Agrupacin
clases, interfaces, colaboraciones, caso de uso, clases
activas, componentes, nodos.
Paquetes
Elementos de Anotacin
Notas
Relaciones
Dependencia
Asociacin
Generalizacin
Realizacin
Diagramas
Diagramas de Clase
Diagramas de Objeto
Diagramas de Caso de Uso
Diagrama de Secuencia
Diagrama de Estado
Diagramas de Actividad
Diagramas de Componente
Diagramas de Desarrollo
Elementos Estructurales
Los elementos estructurales son
los sustantivos de los modelos
UML.
Estos son la mayora de las partes
estticas
de
un
modelo,
representando elementos que son
conceptuales o fsicos.
Clases en UML
Diagramas de Clases (UML)
Cola
Nodo
Red
+ Creados: integer
+ RetrasoMedio: float
1..N
+ CreaPaquete()
...
+ Id: integer
Nodos + Procesados: integer
+ ServicioMedio: float
+ RestrasoMedio: float
1..1
EnEspera
+ NMedio: integer
+ Tamao: float
1..1
+ Encola(Paquete)
+ Desencola():Paquete
...
1..N
Siguiente
Origen
Paquetes
Asociacin
Paquete
Agregacin
Herencia
1..1
Destino
1..1
+ Id: integer
+ tamao: integer
Ms Orientacin a Objetos
Volviendo a Java
Ciclo de vida de un objeto
// Aun no existe, = null
Creacion de objetos: p1 = new Persona(juan..
Persona p1;
Uso del objeto
Llama al Constructor.
Puede dar excepcion: OutOfMemoryError
p1.nombre = otro // illegal: privated
p1.nombre()
new Persona(maria,...).nombre() == maria
No hay ms referencias: recolector de basura
Declarando
Clase
Atributos
Mtodos
Constructores
Declarando una clase
Partes de la
declara cion
public
abstract
final
class Name
extends
SuperClass
implements
Interfaces
{ cuerpo... }
La cla se...
espblicamente acce
si
ble
no puede serinst
anciada
la l
case no puedeserderivada
ti
enepornom bre Name
hereda
deSuperClass
im plementa i
certasInterfaces
Por defecto: no public, no abstract, no final, extends
Object
Sino es publica, solo visible en el mismo paquete.
Declarando un atributo
Partesde lade claraci n Pro pos ito
niveld eacceso
private,protected,etc.
static
si e
sunavarde l
case
final
es c
onst
ante
transient
no seriali
zar
volatile
cam bia inespera
damente
(threa
d)
ti
po n
om bre
Declarando un mtodo
Sintaxis:
modificadores tipo nombre(parametrosFormales)
[ throws excepciones]
{
sentencias
}
Tipo a retornar puede ser void
Valor devuelto: return <value>
Se pueden declarar variables locales si son necesarias
Paso de parmetros en Java: por valor. Incluso las referencias,
imitando el pasaje por referencia de otros lenguajes.
Modificadores para mtodos
Modificado r
niveld eacceso
static
abstract
final
native
synchronized
Pro pos ito
private,protected,etc.
m todo d
e l
case
si
n implem entacion
no puede sersobre
escri
to
otro lenguaje (c/c++)
requiere monito
r
Constructores
Inicializacin de la instancia de una clase: atributos
Tan complejos como se desee (ej: pueden invocarse otros mtodos de
la misma clase, o de otras instancias creadas en el constructor).
Los constructores tienen el nombre de la clase + argumentos:
Persona(String ....
Cero o ms constructores por clase.
Sino se declara: el constructor por defecto pone los atributos en cero
(false, null).
Pueden levantar excepciones, pero no pueden devolver un resultado.
No se heredan, solo pueden llamarse
Constructores
class Punto {
private double x;
private double y;
public Punto() {
this(0.0,0.0);
}
public Punto(double x,
double y) {
this.x = x;
this.y = y;
}
...
}
class Circulo {
private Punto centro;
private double radio;
public Circulo() {
this(new Punto(),1);
}
public Circulo(double x,
double y, double radio) {
this(new Punto(x,y),radio);
}
public Circulo(Punto centro, double radio) {
this.centro = centro;
this.radio = radio;
} ... }
Sobrecarga de mtodos
(Polimorfismo)
Todo mtodo tiene una firma: su nombre con el nmero y el tipo de
sus parmetros.
Sobrecargar mtodos: mismo nombre, distinta firma
Siempre se resuelve en tiempo de compilacin (en base al tipo
esttico de los parmetros reales): en base al nmero y la
especificidad del tipo de los argumentos.
1. Aplicables: el nmero correcto de parmetros, y cuyos parmetros
formales son de tipos que incluyen, por orden, los de los parmetros
reales
2. Si algn mtodo tiene parmetros cuyos tipos incluyen, por orden, a
los tipos de los parmetros del resto de los mtodos, dicho mtodo se
elimina del conjunto conflicto (ya que es ms genrico)
3. El paso (2) se repite hasta que no pueden eliminarse ms mtodos. Si
el conflicto prevalece, se seala un error de compilacin
En la prctica: solo paso (1)
Sobrecarga de mtodos
(Polimorfismo)
public
void
void
void
void
}
class DemoOverloading {
print(int a, int b) { ... }
print(int a, char b) { ... }
print(char a, int b) { ... }
print(int a, int b, int c) { ... }
public class EjemplosManipulacionObjetos {
public static void main(String[] args) {
DemoOverloading dm = new DemoOverloading();
md.print(1, 2);
md.print(1, a);
md.print(a, 1);
md.print(1, 2, h);
}
}
Destructores
No existen como en C++
Metodo finalize que se ejecuta cuando
va a ser liberado por el recolector de
basura.
Util para liberar objetos fuera de Java: C/C++
Atributos y metodos de clase
Refieridos a la clase y no a una
instancia particular
Atributos de clase
De instancia. Cada una tiene un valor particular. Representan
el estado particular de cada objeto.
De clase. Todas las instancias comparten el mismo valor para estos
atributos (como atributo global).
Si se cambia en una instancia, se refleja en todas.
Representan el estado compartido
Se declaran utilizando el modificador static.
class Ficha {
public long id;
public static long idactual = 0;
public Ficha() {
id = idactual++;
}
}
Mtodos de clase
Como atributos: static
Unicamente pueden acceder a atributos de clase
No pueden usar la referencia this
Unicamente pueden invocar a mtodos de clase
El acceso a los mtodos y atributos de clase se realiza
utilizando el operador y el nombre de la clase:
Math.sqrt(...);
Math.PI;
Los mtodos de clase son tiles para:
Modularizar el mtodo main de las aplicaciones
Bibliotecas de subrutinas (por ejemplo, java.lang.Math)
Ejemplo de static
public class Error
{
int x ;
public static y ;
public static void main (String args[])
{
y = 15 ;
x = 20 ; ERROR
}
}
Inicializacin de atributos
estticos
En la declaracin (de arriba a abajo)
o con bloques de inicializacin
class Primos {
public static int[] primos = new int[4];
static {
primos[0] = 2;
for (int i = 1; i < primos.length; i++)
primos[i] = siguientePrimo();
}
private static int siguientePrimo() {...}
}
Acceso a atributos y mtodos
El operador . aplicado a referencias permite el
acceso a atributos y mtodos.
public class EjemplosManipulacionObjetos {
public static void main(String[] args) {
Ficha f1 = new Ficha();
System.out.println(f1.id);
f1.id = 34;
Persona juan = new Persona("Juan","5555555");
Persona maria = new Persona("Mara","5555555");
Persona pedro = new Persona("Pedro","5555555",
juan,maria);
System.out.println(pedro.nombre());
System.out.println(pedro.padre().nombre());
System.out.println(pedro.madre().nombre());
}
}
Referencias
En los mtodos de instancia: disponible una
referencia que refiere a la instancia particular:
this
Por ejemplo para acceder a los atributos ocultos
por declaraciones locales en el mtodo
null: valor de las referencias que no refieren a
ningn objeto.
Por defecto toda referencia se inicializa a null
Referencias: Null Pointer
Error muy comn: tratar de acceder a referencias
null.
public class EjemplosManipulacionObjetos2 {
public static void main(String[] args) {
Persona juan =
new Persona("Juan", "5555555");
// Levantar nullPointerException
juan.padre.nombre();
}
}
Ejemplo con referencias
public class RefDemo {
public static void main(String[] args) {
Ficha f1;
Ficha f2;
// 1
f1 = new Ficha();
// 2
f2 = new Ficha();
// 3
f2 = f1;
// 4
f1.id++;
// 5
f2.id;++;
// 6
}
}
Ejemplo con referencias
public class RefDemo2 {
public static void main(String[] args) {
Persona juan = new Persona("Juan","5555555");
// 1
Persona maria = new Persona("Mara","5555555");
// 2
Persona pedro = new Persona("Mara","5555555",
juan,maria);
// 3
juan = maria = null;
// 4
}
}
Modificadores de Acceso
Modificadores de acceso:
atributos y mtodos
El acceso desde otras clases, puede controlarse
mediante modificadores en su declaracin:
public : Accesibles en cualquier lugar desde donde la
clase es accesible. As mismo, son heredados por las
subclases.
private: Accesibles nicamente en el interior de la
clase.
protected: accesibles en las subclases y en el cdigo
del mismo paquete.
Ninguno (package): Accesible en la clase y el
paquete.
Mtodos privados
En lugar de construir mtodos pblicos
gigantescos e ininteligibles, mejor utilizar
mtodos privados.
Otro caso til:
class Quicksort implements EstrategiaOrdenacion {
public void ordena(Comparable[] v) {
quicksort(v,0,v.length1);
}
private void quicksort(Comparable[] v,
int inf, int sup) {
....}
}
Mtodos para controlar el
acceso al estado
No es buena prctica de programacin disponer directamente de
atributos de acceso pblico, excepto constantes (final)
Permite cambiar la implementacin
Mejor mtodos que controlen el acceso al estado (lectores, escritores:
setters, getters): encapsulamiento, control de acceso, mantenibilidad.
class Ficha {
private long id;
private static long idactual = 0;
public Ficha() {
id = idactual++;
}
public long id() {return id;}
}
Partes protegidas (protected)
Se utiliza para aquellos atributos y mtodos que pueden
ser nicamente* accedidos a nivel de subclase. De esta
forma, la parte protegida de una clase es aquellas parte
que se publica nicamente a los implementadores que
extienden la clase.
Tambin desde cualquier clase que pertenece al paquete
de la clase que lo declara.
Como una familia y los de confianza.
Protected: Caso particular
public class A
{
protected int p;
}
// presume class B is in a different package from A
class B extends A
{
void myMethod()
{
p = 1; // ok
A a = new A();
a.p = 1; // not ok, p would have to be
//public for this to work.
}
}
Modificadores de acceso:
atributos y mtodos
Es pe cificad or
Clase
Subclase Paque te Mun d o
private
Si
No
No
No
pr otect e d
Si
Si*
Si
No
pu blic
Si
Si
Si
Si
pa c kage
Si
No
Si
No
Herencia
Herencia
La clase extendida es la superclase. La clase que
se extiende es la subclase
Las subclases heredan caractersticas y mtodos
de las superclases (excepto los constructores)
Puede heredarse de solo una clase
Se define una jerarqua de objetos
Pero pueden implementarse varias interfaces
Difiere de C++: herencia multiple
Object
Todas las clases implcitamente de la clase Object: raiz de
la jerarqua.
Object define un conjunto de mtodos redefinibles:
public boolean equals(Object o): Permite definir el
criterio de igualdad de contenido de una determinada clase
El operador == nicamente chequea la igualdad de referencias.
En Object, equals se define directamente como la identidad de
referencias.
public String toString(): Permite decidir la
representacin externa de un objeto. Por defecto es el valor de su
referencia, etiquetada con el nombre de la clase.
Object
public class
Ficha {
private long id;
private static long idactual = 0;
public Ficha() {
id = idactual++;
}
public long id() {return id;}
public boolean equals(Object o) {
return (o instanceof Ficha) &&
((Ficha)o).id() == id;
}
public String toString() {
return "Ficha(id="+id+")";
}
Operadores de Comparacin
de Objetos
String s1 = new String("Hola");
String s2 = new String("Hola");
if (s1 == s2)
...
// false
if (s1.equals(s2))
...
// true
s1.equals(s2) equivale a s2.equals(s1)
Heredando clases
La herencia de clases se lleva a cabo mediante extends
Establece una relacin de especializacin -generalizacin entre clases.
La subclase puede introducir nuevos mtodos y redefinir
mtodos de la superclase.
Heredando clases
public class Persona { // Hereda de Object
private String nombre;
public Persona(String nombre) {
this.nombre = nombre;
}
public String nombre() {return nombre;}
}
public class Empleado extends Persona {
private double salario;
public Empleado(String nombre,double salario) {
super(nombre);
this.salario = salario;
}
public double salario() {return salario;}
}
Constructores y Subclases
Los constructores de las
subclases siempre invocan
un constructor en la
superclase como primera
accin:
El estado establecido
en las superclases se
inicializa siempre antes
Por defecto, este
constructor es el que no
tiene argumentos.
Qu ocurre en el
ejemplo?:
public class Persona {
private String nombre;
public Persona(String nombre) {
this.nombre = nombre;
}
public String nombre()
{return nombre;}
}
public class Anonimo
extends Persona {
private String encontradoEn;
public Anonimo
(String encontradoEn) {
this.encontradoEn = encontradoEn;
}
public String encontradoEn()
{return encontradoEn;}
}
Constructores y Subclases
Los constructores no se
heredan.
La forma de invocar
constructores de la
superclase desde la subclase
es a travs de super(...)
El uso de this(...) como
primera sentencia de un
constructor permite
retardar la eleccin del
constructor de la superclase
que se va a ejecutar.
public class Empleado
extends Persona {
private double salario;
public Empleado() {
this("*desconocido*",0);
}
public Empleado(double salario) {
this("*desconocido*",salario);
}
public Empleado(String nombre,
double salario) {
super(nombre);
this.salario = salario;
}
pulic double salario()
{return salario;}
}
Relacin "es-un
Para saber si la relacin de herencia es correcta, se plantea la pregunta
"la subclase es-una superclase?". La respuesta debe ser "s
el Jefe es-un Empleado? S
la Secretaria es-un Empleado? S
class Bici
{
int numRuedas;
int numAsientos;
int velocidadMax;
}
class Avion
class Bici
{
int numRuedas;
int numAsientos;
int velocidadMax;
}
class Avion extends
Bici
{
{
int
int
int
int
numRuedas;
numAsientos;
velocidadMax;
numAlas;
int numAlas;
}
Avion es-una Bici? NO
Relacin de Contenido ("tieneun")
Una clase puede contener referencias de objetos de otras clases
Se diferencia de la herencia en que es necesario instanciarlos
por separado
Responde afirmativamente a la pregunta: <Contenedor> tieneun <Contenido>?
class Motor
{
... ...
}
class Chasis
{
class Coche
{
Motor
m;
Chasis ch;
}
}
un Coche tiene-un Motor? S
un Coche tiene-un Chasis? S
Sobreescritura de Mtodos
Mtodos virtuales en C++
Una subclase puede modificar los mtodos que ha heredado de
la superclase, manteniendo los mismos nombre, tipo de retorno
y lista de argumentos
class Empleado
{
...
int calcularVacaciones(){...}
}
class Jefe extends Empleado
{
int numTrabajadores;
int calcularVacaciones(){...}
}
Polimorfismo en Herencia
Una clase slo tiene una forma, pero una variable que
hace referencia a la superclase de una jerarqua puede
tener muchas formas (una por cada subclase)
Empleado e1 = new Empleado();
Empleado e2 = new Jefe();
Empleado e3 = new Secretaria();
e2.numTrabajadores=15; // Error
((Jefe)e2).numTrabajadores=15;
Pueden utilizarse de dos maneras:
Parmetros polimrficos
Colecciones heterogneas
Parmetros Polimrficos
class Mascota {...}
class Raton extends Mascota {...}
class Gato
extends Mascota {...}
class Veterinario
{
void vacunar ( Mascota m )
{...}
}
...
Veterinario doctor = new Veterinario();
Gato tom = new Gato();
Raton jerry = new Raton();
doctor.vacunar(tom);
doctor.vacunar(jerry);
...
Colecciones Heterogneas
Hasta ahora un array slo poda contener elementos del mismo
tipo (coleccin homognea)
Utilizando polimorfismo se pueden tener elementos de
distinto tipo en un array (coleccin heterognea)
Se crean utilizando arrays definidos con el tipo superclase
Mascota[] listaMascotas = new Mascota[5];
listaMascotas[0] = new Mascota();
listaMascotas[1] = new Gato();
listaMascotas[2] = new Raton();
listaMascotas[3] = new Raton();
listaMascotas[4] = new Gato();
Ejemplo de Colecciones
Heterogneas
Se consigue tratar a todos los
elementos por igual, aunque
alguno tenga un tratamiento
especial
class Empleado
{
...
int salario;
int calcularVacaciones(){...}
}
class Jefe extends Empleado
{
int numTrabajadores;
int calcularVacaciones(){...}
}
...
Empleado[] lista =
new Empleado[100];
lista[0] = new Empleado();
lista[1] = new Empleado();
...
lista[56] = new Jefe();
...
lista[99] = new Empleado();
for (int i = 0;
i < lista.length; i++)
{
System.out.println(
lista[i].
calcularVacaciones());
}
De diagramas de clase (UML)
a Java
Transformacin de clases para
una implementacin OO
Todo atributo y operacin en el diagrama de clases se
debe declarar formando parte de su clase correspondiente.
Lnea Venta
class LneaVenta {
int cantidad;
cantidad:entero
subtotal( ) {...}
subtotal( )
LneaVenta() {...}
}
Transformacin de
asociaciones para una
implementacin OO
Una asociacin bidireccional es implementada,
normalmente, como un atributo de referencia dentro de
cada objeto asociado.
Si la asociacin es unidireccional slo se necesita aadir
un atributo de referencia a una de las clases.
Una asociacin tambin se puede implementar como una
clase.
Transformacin de
asociaciones para una
implementacin OO
Los atributos de referencia de la clase uno son
simplemente referencias a un objeto.
Los atributos de referencia de la clase muchos
necesitan un contenedor de objetos.
Una asociacin cualificada se puede implementar en
forma de objeto diccionario.
Transformacin de
asociaciones para una
implementacin OO
1..*
Persona
trabajapara
Compaa
empresario
empleado
class Persona {
class Compaa {
Compaa empresario;
Persona[] empleado;
Persona( ) {
Compaa( ) {
}
}
Transformacin de
asociaciones para una
implementacin OO
1..*
Libros
class Libro {
Edita
Editorial
class Editorial {
Libro[] mislibros;
Libro( ) {
}
Editorial( ) {
}
}
Transformacin de clase
asociacin para una
implementacin OO
0..*
Usuario
Esta autorizado en
0..*
Estacin de
trabajo
Autorizacin
class Usuario {
autorizacin[] miautori;
Usuario( ){
}
}
class autorizacin {
usuario miusuario;
estacint miestacin;
autorizacin( ){
}
}
class estacint {
autorizacin[] miautori;
estacint( ){
}
}
Transformacin de atributos
de enlace para una
implementacin OO
Asociacin uno-a-uno: Los atributos de enlace se pueden
almacenar como atributos de cualquiera de los objetos.
Asociacin uno-a-muchos: Los atributos de enlace se
pueden almacenar como atributos del objeto muchos.
Asociacin muchos-a-muchos: Se implementa la
asociacin como una clase.
Transformacin de agregacin
para una implementacin OO
Se implementa igual que la asociacin.
computadora
1
1..*
monitor
class Computadora {
Monitor[] mismonitores;
Teclado miteclado;
Computadora( ) {
}
}
teclado
class Monitor {
Monitor( ) {
}
}
class Teclado {
Teclado( ) {
}
}
Transformacin de herencia
simple para una
implementacin OO
Lmpara
Fluorescente
class Lmpara {
Lmpara( ) {
}
}
class Fluorescente extends
Lmpara
{
Fluorescente( ) {
}
}
Incandescente
class Incandescente
extends Lmpara
{
Incandescente( ) {
}
}
Paquetes
Paquetes
Un paquete es una agrupacin de clases (librera)
El programador puede crear sus propios paquetes con la
sentencia package al principio del fichero fuente
package <nombre.paquete>;
Ejemplo: package empresa.finanzas;
La composicin de nombres (separados por puntos) est
relacionada con la jerarqua de directorios:
CLASSPATH\empresa\finanzas\
Los nombres de los paquetes se suelen escribir en
minsculas
Ejemplo de Paquetes
Fichero fuente Empleado.java:
package empresa.finanzas;
public class Empleado
{
...
}
La clase Empleado realmente se llama empresa.finanzas.Empleado
Si no se indica la sentencia package, la clase Empleado pertenecer a
un paquete por defecto sin nombre
Sentencia import
La sentencia import indica al compilador dnde estn
ubicadas las clases que estamos utilizando
Para importar slo una clase de un paquete:
Para importar todas las clases de un paquete:
import <nombre.paquete>.<NombreClase>;
import <nombre.paquete>.*;
El compilador aade a todos los ficheros la lnea
import java.lang.*;
El paquete que contiene las clases fundamentales para programar
en Java (System, String, Object...)
Ejemplo de import
import empresa.finanzas.*;
public class Jefe extends Empleado
{
String departamento;
Empleado[] subordinados;
}
Si no se pone el import, deberamos referirnos a
Empleado como empresa.finanzas.Empleado
La clase Jefe pertenece al paquete annimo por
defecto
String pertenece al paquete java.lang
Modificadores de acceso:
atributos y mtodos
Es pe cificad or
Clase
Subclase Paque te Mun do
private
Si
No
No
No
pr otect e d
Si
Si*
Si
No
pu blic
Si
Si
Si
Si
pa c kage
Si
No
Si
No
Clases Abstractas
Clases Abstractas
Una clase abstracta es una clase de la que no se pueden
crear objetos
Representa un concepto que no se puede instanciar
Se define anteponiendo el modificador abstract a la
definicin de una clase
abstract class Mamifero {...}
class Canino extends Mamifero {...}
class Felino extends Mamifero {...}
class Roedor extends Mamifero {...}
...
Mamifero m = new Mamifero();
// Error
Mtodos Abstractos
Un mtodo es abstracto si se declara
(dentro de una clase abstracta), pero
no se implementa
abstract class Mamifero
{
...
public abstract
void alimentar();
}
Todas las subclases de una clase
abstracta deben implementar los
mtodos abstractos que tenga
definidos, a menos que sea tambien
abstracta
class Canino extends Mamifero
{ ...
public void alimentar()
{...}
}
class Felino extends Mamifero
{
...
public void alimentar()
{...}
}
Ejemplo
Jerarqua de figuras
geomtricas:
class Punto
{
int x;
int y;
int color;
}
abstract class Figura
{
Punto ptoOrigen;
abstract void
dibujar();
}
class Rectangulo
extends Figura
{
Punto ptoFinal;
void dibujar()
{...}
}
class Circulo
extends Figura
{
int radio;
void dibujar()
{...}
}
Interfaces
Interfaces (I)
Una interface es un conjunto de declaraciones de mtodos
Declaracin:
interface <NombreInterfaz>
{
<tipo> <nombreMtodo1> ( <args> );
<tipo> <nombreMtodo2> ( <args> );
...
}
Una clase que implemente el cdigo de la interfaz debe
implementar todos sus mtodos
class <NombreClase> implements <NombreInterfaz>
{
<tipo> <nombreMtodo1> ( <args> ) { <cdigo> }
<tipo> <nombreMtodo2> ( <args> ) { <cdigo> }
...
}
Interfaces (II)
Las interfaces sirven para:
Declarar mtodos que sern implementados
por una o ms clases
Definir la interfaz de programacin de un
objeto, sin mostrar el cuerpo actual de la clase
Cada interfaz debe escribirse en un fichero
*.java con el mismo nombre de la interfaz
Equivalencia
Interfaz - Clase Abstracta
interface Interfaz
{
<tipo> <mtodo1>();
<tipo> <mtodo2>();
...
<tipo> <mtodoN>();
}
equivale a
abstract class Interfaz
{
abstract <tipo> <mtodo1>();
abstract <tipo> <mtodo2>();
...
abstract <tipo> <mtodoN>();
}
Vector
La Clase Vector (I)
La clase Vector (paquete java.util) representa una coleccin
heterognea de objetos (referencias a objetos de tipo Object o a
cualquiera de sus subclases)
El vector al crearse reserva cierta cantidad de memoria, aunque
sus elementos slo utilicen una parte
El tamao del vector se incrementa por bloques cuando se
aade y se agota el espacio reservado. El tamao de incremento
se indica en el atributo capacityIncrement
El vector se mantiene compacto en todo momento
Cada elemento es accesible a travs de un ndice, pero no con
los corchetes, [ ]
La Clase Vector (II)
Atributos:
int capacityIncrement: incremento en la capacidad del vector.
Si vale cero, duplica el tamao actual del vector.
int elementCount: nmero de elementos vlidos del vector
Object[] elementData: array de objetos donde se guardan los
elementos
Constructores:
Vector(): Crea un vector vaco (capacidad 10, incremento 0)
Vector(int initialCapacity): Crea un vector vaco con la
capacidad dada (incremento 0)
Vector(int initialCapacity, int
initialIncrement): Crea un vector vaco con la capacidad y el
incremento dados
La Clase Vector (III)
Mtodos:
int capacity()
devuelve la capacidad que tiene el vector
int size()
devuelve el nmero de elementos en el vector
boolean contains(Object elem)
devuelve true si el vector contiene el objeto
especificado
int indexOf(Object elem)
devuelve la posicin de la primera vez que
aparece el objeto que se le pasa
Object get(int index)
devuelve el elemento situado en la posicin
indicada (*)
void set(Object elem,int
index)
reemplaza el objeto que corresponde al ndice
por el objeto que se le pasa (*)
Los mtodos con (*) pueden lanzar la excepcin ArrayIndexOutOfBoundsException
La Clase Vector (III)
Mtodos:
void removeElementAt(int
index)
borra el objeto situado en la posicin indicada
(*)
void addElement(Object elem)
aade un objeto al final
void insertElementAt(Object
elem,
int index)
inserta el objeto que se le pasa en la posicin
indicada, desplazando el resto de elementos
en el vector (*)