Sunteți pe pagina 1din 97

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 (*)

S-ar putea să vă placă și