Sunteți pe pagina 1din 18

EDA

2004/2005

El ejemplo de las Figuras

//clase abstracta YA QUE tiene al menos un mtodo abstracto


//No se puede hacer new Figura();
import java.text.*;
//Para el formateo de los double en toString
public abstract class Figura {
//Atributos
protected double dim1;
protected double dim2;
protected String nombre;

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

//Mtodos
//constructor que UNICAMENTE puede ser invocado por la
//subclases; podemos crear (new) objetos de las clases
// Circulo, Rectangulo o Cuadrado, PERO NO Figura
public Figura( double dim1 , double dim2, String nombre){
this.dim1 = dim1;
this.dim2 = dim2;
this.nombre = nombre;
}
//Mtodos abstractos: comunes, pero con IMPLEMENTACIN
//especializada: NO TIENEN CUERPO y a su cabecera sigue ";"
public abstract double area( );
public abstract double perimetro( );
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

//Mtodos NO abstractos y finales: se heredan SIN sobrescritura


// el area es double, la imprimo con formato
final public String toString(){
// creacin de la variable numConFormato;
NumberFormat numConFormato = NumberFormat.getInstance();
numConFormato.setMinimumFractionDigits(2);
numConFormato.setMaximumFractionDigits(2);
return ("\t"+this.nombre+" con area
\t"+numConFormato.format(this.area())+"\n");
}
final public boolean menorQue( Figura fig){
return this.area() < fig.area();
}
}//Fin de la clase abstracta Figura

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class Circulo extends Figura {


public Circulo( double radio ) {
super(radio, radio, "Circulo");
}
public double area( ){
return Math.PI * super.dim1 * super.dim1;
}
public double perimetro( ){
return 2 * Math.PI * super.dim1;
}
}// fin de la clase Circulo
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class Rectangulo extends Figura {


public Rectangulo( double alto, double ancho ){
super(alto , ancho, "Rectangulo" );
}
public double area( ) {
return super.dim1 * super.dim2;
}
public double perimetro( ) {
return 2 * ( super.dim1 + super.dim2 );
}
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class Cuadrado extends Rectangulo {


// como hereda de Rectangulo, no hace falta definir en ella
// perimetro o area.
public Cuadrado( double lado ) {
// recordar que hereda de Rectangulo
super( lado, lado );
//cuando se ejecuta, el nombre del Cuadrado es Rectangulo
// Qu podemos hacer para modificar el nombre y poner Cuadrado?
super.nombre="Cuadrado";
}
}// fin de la clase Cuadrado
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

//Trabajamos con una coleccin (array) de 3 figuras que se


leen de pantalla:
// * Mostrarlas por pantalla
// * Calcular el rea de toda la coleccin
// * Ordenarlas por rea (con Insercin Directa) UTILIZANDO
un mtodo genrico
import java.io.*;
// Para el formateo de los double en el mtodo que obtiene el
// rea total
import java.text.*;
//para utilizar el mtodo genrico de
Ordenacion insercionDirecta
import Miscelanea.Ordenacion;
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class TestFigura{


private static BufferedReader teclado;
private static Figura leerFigura() throws IOException {
String tipo="";
Figura instanciaLeida = null;
do {
System.out.println("\nIntroduzca Circulo o Rectangulo o
Cuadrado");
tipo = teclado.readLine();
} while (!tipo.equals("Circulo") && !tipo.equals("Rectangulo")
&& !tipo.equals("Cuadrado") );
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

switch (tipo.charAt(0)) {
case 'C':{System.out.println("\nPara leer Circulo,
introduzca el radio");
double radio = leerDouble();
instanciaLeida = new Circulo(radio);} break;
case 'R': {System.out.println("\nPara leer Rectangulo,
introduzca EN LINEAS SEPARADAS Alto y Ancho");
double alto = leerDouble();
double ancho = leerDouble();
instanciaLeida = new Rectangulo(alto , ancho);} break;
case 'S': {System.out.println("\nPara leer Cuadrado,
introduzca el lado");
double lado = leerDouble();
instanciaLeida = new Cuadrado(lado);} break;
} //fin del switch
return instanciaLeida;
}// fin de leerFigura
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

private static int leerEntero() throws IOException {


boolean hayerror=true;
int num=0;
do {
try {
System.out.print("\nIntroduzca el numero de figuras: ");
num = Integer.parseInt(teclado.readLine());
hayerror=false;
}
catch (NumberFormatException eUnchecked){
// intento de convertir una cadena que no tiene el formato adecuada
// en un determinado tipo numrico
// catch: captura excepciones (un objeto throwable; ej. eUnchecked)
System.out.println("Atento: no has tecleado un entero");
}
} while (hayerror);
return num;
} // fin de leerEntero;
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

private static double leerDouble() throws IOException {


boolean hayerror=true;
double num=0.0;
do{
try {
num = new Double(teclado.readLine()).doubleValue();
hayerror=false;
}
catch (NumberFormatException eUnchecked){
System.out.println("Atento: no has tecleado un double");
}
} while (hayerror);
return num;
} // fin de leerDouble;
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public static double AreaFiguras( Figura conjunto[ ] ){


double total = 0;
for( int i = 0; i < conjunto.length ; i++ ){
if( conjunto[ i ] != null )
total += conjunto[ i ].area( );
}
return total;
}
public static void muestraFiguras( Figura conjunto[ ] ){
for( int i = 0; i < conjunto.length ; i++ )
System.out.print((conjunto[ i ]) );
System.out.println();
}

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public static void ordenarFigurasPorArea( Figura conjunto[ ] ){


for( int i = 1; i < conjunto.length ; i++ ) {
Figura figAInsertar = conjunto[i];
int
posIns = i ;
// Bsqueda del lugar de insercion ordenada;
// desplazar mientras NO se encuentre
for( ; posIns > 0 &&
figAInsertar.menorQue(conjunto[posIns-1]) ; posIns--)
conjunto[posIns] = conjunto[posIns - 1];
// Insercion en posIns
conjunto[posIns] = figAInsertar;
}
}//fin de ordenarFigurasPorArea
//OJO: MODIFICACIONES **************************************
// No hace falta implementar un nuevo cdigo de Insercin Directa que
// ordene Figuras por area. Basta con reutilizar el cdigo genrico
// de Insercin Directa de la clase, tambin genrica, Ordenacin
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public static void main( String [ ] args ) {


// Lectura desde teclado:
// (1) del numero de figuras de la coleccin y
// (2) de las figuras del array de Figura's coleccin.
// Atentos a las IOExcepction y NumberFormatException
try {
teclado = new BufferedReader(new InputStreamReader(System.in));
int numLeido =0;
int numFiguras = leerEntero();
// representacin con array
Figura coleccion[ ] = new Figura[numFiguras];
//Lectura de las numFiguras: se controla el NumberFormatException
for ( int i=0 ; i < numFiguras ; i++) {
Figura instancia = leerFigura();
coleccion[ i ] = instancia;
}
System.out.println( "\nColeccion de Figuras que se maneja");
muestraFiguras( coleccion );
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

...
// creacion de la variable numConFormato;
NumberFormat numConFormato = NumberFormat.getInstance();
numConFormato.setMinimumFractionDigits(2);
numConFormato.setMaximumFractionDigits(2);
System.out.println( "\nArea de todas las figuras = " +
numConFormato.format(AreaFiguras(coleccion)));
// Eliminada al implementar Comparable:
ordenarFigurasPorArea(coleccion);
// Se substituye por la llamada al mtodo insercionDirecta, esttico
// y genrico de la clase, tambin genrica, Ordenacion
/* Ordenacion.insercionDirecta(coleccion);*/
// Alternativamente, sin la directiva import Miscelanea.Ordenacion
// Miscelanea.Ordenacion.insercionDirecta(coleccion);
System.out.println( "\nColeccion de Figuras ordenadas por area");
muestraFiguras( coleccion );
}
catch (IOException electura) {
System.out.println("Problema con Input: "+electura);}
} //fin del main
}//fin del test
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Clases derivadas y regla de visibilidad

Herencia: clase derivada


n
Hereda atributos y m todos de la clase base
n
Puede aadir nuevos atributos y m todos
n
Puede sobrescribir mtodos de la clase base
n
Debe definir su(s) propio(s) constructor(es)
Regla de visibilidad:
n
Privado/private: slo para los mtodos de la clase base, NO para las
clases derivadas
n
Protegido/protected: privado excepto para las clases derivadas (+ las
del mismo paquete/package)

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class Circulo extends Figura {


public Circulo( double radio ) {
super(radio, radio, "Circulo");
}
public double area( ){
return Math.PI * super.dim1 * super.dim1;
}
public double perimetro( ){
return 2 * Math.PI * super.dim1;
}
}// fin de la clase Circulo

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Mtodos y clases abstractas

Mtodo abstracto:
n
Declarado pero no implementado
n
Definido en una clase derivada
Clase abstracta:
n
Clase con un(os) mtodo(s) abstracto(s)
n
No se pueden crear objetos (concretos) de la clase (abstracta)
n
Su constructor utilizado desde la(s) clase(s) derivada(s)
public abstract class Figura {
//Atributos
protected double dim1;
protected double dim2;
protected String nombre;

public abstract double area( );


public abstract double perimetro( );
...
}

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Mtodos y clases finales

Mtodo final:
n
Permanece invariante (no se puede sobrescribir)
n
La llamada al mtodo se resuelve a tiempo de compilacin y No
en tiempo de ejecucin (tipado esttico)
final public boolean menorQue( Figura fig){
return this.area() < fig.area();
}
Clase final:
n
NO puede ser extendida
n
Todos los mtodos son finales
public final class Integer extends Number implements Comparable {
...
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Interfaces

Interfaz:
n
Clase abstracta que contiene slo
n
Mtodos abstractos (public abstract)
n
Constantes (public static final)
public interface Comparable {
// NO hay atributos
public int compareTo( Object o );
}
public class Number implements Comparable {
...
}

Paolo Rosso Grupos: 2B+ENG - ETSIA

10

EDA

2004/2005

Interfaces y herencia mltiple

Herencia mltiple:
n
NO soportada directamente
n
Con interfaces

public class Tablahash implements Comparable, Hashable {


...
}
Ejercicio.
clase Estudiante, clase Empleado: clase EstudianteEmpleado

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Programacin Genrica

Programacin genrica: a partir de la herencia


package Miscelanea;
// Clase Ordenacion: contiene todos los mtodos de ordenacin de un array estudiados
// hasta la fecha, estticos, PERO implementados como genricos.
public class Ordenacion {
public static void insercionDirecta( Object secuencia[ ] ){
for( int i = 1; i < secuencia.length ; i++ ) {
Comparable elemAInsertar =(Comparable)secuencia[i];
int
posIns = i ;
// Bsqueda del lugar de insercion ordenada;
// desplazar mientras NO se encuentre
for( ; posIns > 0 &&
elemAInsertar.compareTo((Comparable)secuencia[posIns-1]) == -1;
posIns--)
secuencia[posIns] = secuencia[posIns - 1];
// Insercion en posIns
secuencia[posIns] = elemAInsertar;
}
}//fin de insercionDirecta sobre un array de Comparable
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

11

EDA

2004/2005

public abstract class Figura implements Comparable {


//Atributos
protected double dim1; protected double dim2; protected String nombre;
//Mtodos: vase antes
//OJO: MODIFICACIONES**********************************************
// 1.- ya NO hace falta definir menorQue: se implementa Comparable
/*final public boolean menorQue( Figura fig){
return this.area() < fig.area(); }*/
// 2.- compareTo es el nico mtodo del interface Comparable.
public int compareTo( Object o ) {
// Object: superclase definida en java.lang
Figura laotraFigura = (Figura) o;
// conversin de restriccin (casting): operador de conversin
double diff = this.area( ) - laotraFigura.area( );
if( diff == 0 ) return 0;
else
if( diff < 0 ) return -1;
else
return 1;
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Polimorfismo y enlace dinmico

Polimorfismo (comprobacin tipos en tiempo de compilacin)+


enlace dinmico (tipado dinmico)
n
Conversin de ampliacin:
referencia a superclase = referencia clase derivada
n
Conversin de restriccin: viceversa, con casting
/* Diferencia entre DECLARACION de una referencia e INSTANCIACION de un
objeto al que se refiere la referencia */
public class Prueba2{
public static void main(String args[]){
Rectangulo rect = new Rectangulo(2,3);
System.out.println("Area del rectangulo:\t "+rect.toString());
Circulo circ= new Circulo(2);
System.out.println("Area del circulo:\t "+circ.toString());
Figura fig;
fig=rect; // conversin de ampliacin
System.out.println("Area de la figura rectangulo:"+fig.toString());
fig=circ;
System.out.println("Area de la figura circulo: "+fig.toString());
}
Paolo Rosso Grupos: 2B+ENG - ETSIA
}

12

EDA

2004/2005

//Comprobacin de tipado dinmico: operador instanceof


public class Prueba3{
public static void main(String args[]){
Figura frect = new Rectangulo(2,3);
Figura fcirc1= new Circulo(2);
Figura fcirc2= new Circulo(4);
Figura coleccion[] = new Figura [3] ;
coleccion[0] = frect;coleccion[1] = fcirc1;coleccion[2] = fcirc2;
System.out.println("cuantos circulos hay en la coleccion?");
int numcirculos=0;
for( int i = 0; i < coleccion.length ; i++ ){
Figura fig= coleccion[i];
if (fig instanceof Circulo) {
System.out.println( fig.toString()); numcirculos++;
}
}
System.out.println("Hay "+numcirculos+" circulos");
}
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Representacin enlazada

//Para representacin enlazada de una secuencia de figuras:atributo ENLACE


public abstract class Figura {
//Atributos
protected double dim1; protected double dim2; protected String nombre;
// NUEVO ATRIBUTO para poder enlazar PRIVADO (se aade consultora)
private Figura sig;
//Mtodos: vase antes
//constructor que UNICAMENTE puede ser invocado por la subclases
public Figura(double dim1,double dim2,String nombre, Figura sig){
this.dim1 = dim1; this.dim2 = dim2; this.nombre = nombre;
this.sig = sig;
}
//Consultora del atributo sig
public Figura siguiente(){
return (this.sig);
}

}
Paolo Rosso Grupos: 2B+ENG - ETSIA

13

EDA

2004/2005

public class Circulo extends Figura {


public Circulo( double radio, Figura sig ) {
super(radio, radio, "Circulo", sig);
}
...
}
public class Rectangulo extends Figura {
public Rectangulo( double alto, double ancho, Figura sig ){
super(alto , ancho, "Rectangulo", sig);
}
...
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class Prueba3{


public static void main(String args[]){
//Construccin de una coleccin
//Inicializacin: coleccin ENLAZADA vaca
Figura coleccion = null;
//Insercin en cabeza de figuras diversas
coleccion = new Rectangulo(2,3,coleccion);
coleccion = new Circulo(4,coleccion);
coleccion = new Circulo(2,coleccion);
coleccion = new Cuadrado(2,coleccion);
// Quin es el ltimo de la coleccion ?: Recorrido de la coleccion
// ENLAZADA para mostrar el orden de insercin en cabeza
System.out.println("Coleccion figuras, en orden de creacion");
for( Figura i = coleccion; i != null ; i = i.siguiente())
System.out.print( i.toString());
Paolo Rosso Grupos: 2B+ENG - ETSIA

14

EDA

2004/2005

...
System.out.println("cuantos circulos hay en la coleccion?");
int numcirculos=0;
for( Figura i = coleccion; i != null ; i = i.siguiente() ){
Figura fig= i;
if (fig instanceof Circulo) {
System.out.print( fig.toString());
numcirculos++;
}
}
System.out.println("Hay "+numcirculos+" circulos");
}
}

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Excepciones

Excepcin:
n
Condicin anormal/excepcional durante la ejecucin de un
segmento de cdigo
n
Objeto (Throwable)
java.lang. Object
java.lang. Throwable
java.lang.Exception
subclases de Excepcin: e.g . IOException NumberFormatException

que se enva al causante de la excepcin que puede:


n

No tratarla (el sistema da un error )

No tratarla pero propagarla/lanzarla: throws


(throws : al final de la cabecera del m todo)

Despus de intentar ( try) ejecutar el segmento de cdigo,


capturarla (catch) y tratarla; finalmente, se pueden ejecutar las
n

instrucciones asociadas a la cl usula finally : try -catch-finally

Paolo Rosso Grupos: 2B+ENG - ETSIA

15

EDA

2004/2005

Excepciones de usuario

Excepcin de usuario:
n
Excepcin propia: se define como clase derivada de de
la clase Exception
n
Para generar una excepcin propia, se crea un objeto de
la misma: new
n
Para lanzarla: throw (sin s final...)

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class ExcepcionVectorLleno extends Exception {


public vectorLleno (String mensaje)
{
super(mensaje);
}
}
public class vector {
private int valores[]
private int num;
public vector (int talla) {valores=new int[talla]; num=0;}
public void anyadir (int el) throws ExcepcionVectorLleno{
if (num==valores.length)
throw new ExcepcionVectorLleno(Error: el vector est lleno);
valores[num++]=el;
}
}

Paolo Rosso Grupos: 2B+ENG - ETSIA

16

EDA

2004/2005

try {
...
}
catch (Exception e) { // capturo
System.out.println(La excepcin +e+ puede ser capturada
y vuelta a lanzar: como muy tarde deber ser tratada en el
main que no podr propagarla (throws en la cabecera) ni
capturarla (catch) y volverla a lanzar (throw));
throw(e); // vuelvo a lanzar
}

Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

Excepciones:
El ejemplo de la clase agenda

public class ExcepcionItemNoValido extends Exception{


public ExcepcionItemNoValido(String mensaje){
super(mensaje);
}
}
public class ExcepcionItemRepetido extends Exception{
public ExcepcionItemRepetido(String mensaje){
super(mensaje);
}
}
public class ExcepcionAgendaLlena extends Exception{
public ExcepcionAgendaLlena(String mensaje){
super(mensaje);
}
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

17

EDA

2004/2005

public class Agenda {


static final int MaxItems = 250;
private int numElem; private itemAgenda secuenciaItem[];
public Agenda (){secuenciaItem = new itemAgenda[MaxItems]; numElem= 0;}
public void anyadirItem (itemAgenda item) throws ExcepcionAgendaLlena,
ExcepcionItemNoValido, ExcepcionItemRepetido {
if(item != null){
if (numElem >= MaxItems)
throw new ExcepcionAgendaLlena("Error: no hay ms sitio");
if (item.telefono().length() != 9 || item.nombre().length() > 40
|| item.nombre().charAt(0) == 0)
throw new ExcepcionItemNoValido("Error: : item \""+item+"\
incorrecto");
itemAgenda l = recuperarPorTelefono(item.telefono());
if (l != null)
throw new ExcepcionItemRepetido("Error: el telfono del item
\""+item+"\" ya existe");
secuenciaItem [numElem++] = item;
}
} // otros mtodos }
Paolo Rosso Grupos: 2B+ENG - ETSIA

EDA

2004/2005

public class Prueba{


static void main (String args[]){
System.out.println("Prueba de creacin de una agenda:\n");
Agenda a = new Agenda();
itemAgenda item;
try {
item = new itemAgenda("1004","Atencion Clientes");
a.anyadirItem(item);
} catch (ExcepcionAgendaLlena e) {System.out.println(e);}
catch (ExcepcionItemNoValido e){System.out.println(e);}
catch (ExcepcionItemRepetido e){System.out.println(e);}
// etc.
}
}
Paolo Rosso Grupos: 2B+ENG - ETSIA

18

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