8/17/2019 figuras en java.pdf
1/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
//clase abstracta YA QUE tiene al menos un método 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;
El ejemplo de las Figuras
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
//Métodos
//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;
}
// Métodos abstractos: comunes, pero con IMPLEMENTACIÓN
//especializada: NO TIENEN CUERPO y a su cabecera sigue ";"
public abstract double area( );
public abstract double perimetro( );
8/17/2019 figuras en java.pdf
2/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
// Métodos NO abstractos y finales: se heredan SIN sobrescritura// el area es double, la imprimo con formato
final public String toString(){
// creación 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
EDA2004/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
8/17/2019 figuras en java.pdf
3/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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
EDA2004/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
8/17/2019 figuras en java.pdf
4/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
//Trabajamos con una colección (array) de 3 figuras que seleen de pantalla:
// * Mostrarlas por pantalla
// * Calcular el área de toda la colección
// * Ordenarlas por área (con Inserción Directa) UTILIZANDOun método genérico
import java.io.*;
// Para el formateo de los double en el método que obtiene el
// área total
import java.text.*;
//para utilizar el método genérico deOrdenacion insercionDirecta
import Miscelanea.Ordenacion;
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
public class TestFigura{
private static BufferedReader teclado;
private static Figura leerFigura() t hr ows I OExc ept i on {
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") );
8/17/2019 figuras en java.pdf
5/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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
EDA2004/2005
private static int leerEntero() t hr ows IOException { boolean hayerror=true;int num=0;
do {t r y {System.out.print("\nIntroduzca el numero de figuras: ");
num = Integer.parseInt(teclado.readLine());hayerror=false;}
c a t c h ( NumberFormatException eUnchecked){// intento de convertir una cadena que no tiene el formato adecuada// en un determinado tipo numérico// catch: captura excepciones (un objeto throwable; ej. eUnchecked)
System.out.println("Atento: no has tecleado un entero");}
} while (hayerror);return num;
} // fin de leerEntero;
8/17/2019 figuras en java.pdf
6/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
private static double leerDouble() throws IOException {
boolean hayerror=true;double num=0.0;
do{
t r y {
num = new Double(teclado.readLine()).doubleValue();
hayerror=false;
}
c a t c h ( NumberFormatException eUnchecked){
System.out.println("Atento: no has tecleado un double")
}
} while (hayerror);return num;
} // fin de leerDouble;
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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();
}
8/17/2019 figuras en java.pdf
7/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
public static void ordenarFigurasPorArea( Figura conjunto[ ] ){for( int i = 1; i < conjunto.length ; i++ ) {
Figura figAInsertar = conjunto[i];int posIns = i ;// Búsqueda 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 posInsconjunto[posIns] = figAInsertar;
}
}//fin de ordenarFigurasPorArea
//OJO: MODIFICACIONES **************************************// No hace falta implementar un nuevo código de Inserción Directa que// ordene Figuras por area. Basta con reutilizar el código genérico// de Inserción Directa de la clase, también genérica, Ordenación
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
public static void main( String [ ] args ) {// Lectura desde teclado:// (1) del numero de figuras de la colección y
// (2) de las figuras del array de Figura's colección.// Atentos a las IOExcepction y NumberFormatException
t r y {teclado = new BufferedReader(new InputStreamReader(System.in));int numLeido =0;int numFiguras = leerEntero();
// representación con arrayFigura coleccion[ ] = new Figura[numFiguras];
//Lectura de las numFiguras: se controla el NumberFormatExceptionfor ( int i=0 ; i < numFiguras ; i++) {
Figura instancia = leerFigura();coleccion[ i ] = instancia;
}System.out.println( "\nColeccion de Figuras que se maneja"); muestraFiguras( coleccion );
8/17/2019 figuras en java.pdf
8/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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 Compar abl e :ordenarFigurasPorArea(coleccion);// Se substituye por la llamada al método insercionDirecta, estático// y genérico de la clase, también genérica, 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 );
}c a t c h (IOException electura) {
System.out.println("Problema con Input: "+electura);}
} //fin del main}//fin del test
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
Herencia: clase derivada
n Hereda atributos y métodos de la clase base
n Puede añadir nuevos atributos y métodos
n Puede sobrescribir métodos de la clase base
n Debe definir su(s) propio(s) constructor(es)
Regla de visibilidad:
n Privado/private: sólo para los métodos de la clase base, NO para lasclases derivadas
n Protegido/protected: privado excepto para las clases derivadas (+ lasdel mismo paquete/package)
Clases derivadas y regla de visibilidad
8/17/2019 figuras en java.pdf
9/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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
EDA2004/2005
Método abstracto:n Declarado pero no implementadon Definido en una clase derivada
Clase abstracta:n Clase con un(os) método(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( );
...}
Métodos y clases abstractas
8/17/2019 figuras en java.pdf
10/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
Método final:
n
Permanece invariante (no se puede sobrescribir)n La llamada al método se resuelve a tiempo de compilación y No
en tiempo de ejecución (tipado estático)
final public boolean menorQue( Figura fig){
return this.area() < fig.area();
}
Clase final:
n NO puede ser extendida
n Todos los métodos son finales
public final class Integer extends Number implements Comparable {
...
}
Métodos y clases finales
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
Interfaz:
n Clase abstracta que contiene sólo
n Métodos abstractos ( public abstract)
n Constantes ( public static final)
public interface Comparable {// NO hay atributos
public int compareTo( Object o );
}
public class Number implements Comparable {
...
}
Interfaces
8/17/2019 figuras en java.pdf
11/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
Herencia múltiple:n NO soportada directamente
n Con interfaces
public class Tablahash implements Comparable, Hashable {
...
}
Ejercicio.
clase Estudiante, clase Empleado: clase EstudianteEmpleado
Interfaces y herencia múltiple
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
Programación genérica: a partir de la herencia
package Miscelanea;// Clase Ordenacion: contiene todos losmétodosde ordenación de un array estudiados// hasta la fecha, estáticos, PERO implementadoscomo genéricos. public class Ordenacion { public static void insercionDirecta( Obj e c t secuencia[ ] ){
for( int i = 1; i < secuencia.length ; i++ ) {Comparable elemAInsertar =(Comparable)secuencia[i];int posIns = i ;// Búsqueda del lugar de insercion ordenada;// desplazar mientras NO se encuentrefor( ; posIns > 0 &&elemAInsertar.compareTo((Comparable)secuencia[posIns-1]) == -1;
posIns--)secuencia[posIns] = secuencia[posIns - 1];// Insercion en posInssecuencia[posIns] = elemAInsertar;
}}//fin de insercionDirecta sobre un array de Comparable
}
Programación Genérica
8/17/2019 figuras en java.pdf
12/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
public abstract class Figura implements Comparable {//Atributos protected double dim1; protected double dim2; protected String nombre;
//Métodos: véase 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 método del interface Comparable.
public int compareTo( Object o ) {// Object: superclase definida en java.lang
Figura laotraFigura = (Figura) o;// conversión de restricción (casting): operador de conversión
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
EDA2004/2005
Polimorfismo (comprobación tipos en tiempo de compilación)+enlace dinámico (tipado dinámico)
n Conversión de ampliación:
referencia a superclase = referencia clase derivadan Conversión de restricción: 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; // conversión de ampliaciónSystem.out.println("Area de la figura rectangulo:"+fig.toString());fig=circ;System.out.println("Area de la figura circulo: "+fig.toString());
}
}
Polimorfismo y enlace dinámico
8/17/2019 figuras en java.pdf
13/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
//Comprobación de tipado dinámico: 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
EDA2004/2005
//Para representación 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 añade consultora)
private Figura sig;//Métodos: véase 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);}
}
Representación enlazada
8/17/2019 figuras en java.pdf
14/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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
EDA2004/2005
public class Prueba3{
public static void main(String args[]){
//Construcción de una colección
//Inicialización: colección ENLAZADA vacía
Figura coleccion = null;
//Inserción en cabeza de figuras diversascoleccion = new Rectangulo(2,3,coleccion);
coleccion = new Circulo(4,coleccion);
coleccion = new Circulo(2,coleccion);
coleccion = new Cuadrado(2,coleccion);
// ¿ Quién es el último de la coleccion ?: Recorrido de la coleccion
// ENLAZADA para mostrar el orden de inserción 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());
8/17/2019 figuras en java.pdf
15/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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
EDA2004/2005
Excepción:
n Condición anormal/excepcional durante la ejecución de un
segmento de código
n Objeto (Throwable)java.lang.Object
java.lang.Throwable
java.lang.Exception
subclases de Excepción: e.g. IOException NumberFormatException
que se envía al causante de la excepción que puede:n No tratarla (el sistema da un error)
n No tratarla pero propagarla/lanzarla: throws
(throws: al final de la cabecera del método)
n Después de intentar (try) ejecutar el segmento de código,
capturarla (catch) y tratarla; finalmente, se pueden ejecutar las
instrucciones asociadas a la cláusula finally: try-catch-finally
Excepciones
8/17/2019 figuras en java.pdf
16/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
Excepción de usuario:
n Excepción propia: se define como clase derivada de dela clase Exception
n Para generar una excepción propia, se crea un objeto dela misma: new
n Para lanzarla: throw (sin ‘s’ final...)
Excepciones de usuario
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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) t hr ows ExcepcionVectorLleno{
if (num==valores.length)t hr ow new ExcepcionVectorLleno(“Error: el vector está lleno”);
valores[num++]=el;}
}
8/17/2019 figuras en java.pdf
17/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
try {
...}
catch (Exception e) { // capturo
System.out.println(“La excepción “+e+” puede ser capturaday vuelta a lanzar: como muy tarde deberá ser tratada en el main que no podrá propagarla (throws en la cabecera) nicapturarla (catch) y volverla a lanzar (throw)”);
t hr ow (e); // vuelvo a lanzar
}
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
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);
}
}
Excepciones:El ejemplo de la clase agenda
8/17/2019 figuras en java.pdf
18/18
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/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 más 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 teléfono del item \""+item+"\" ya existe");
secuenciaItem [numElem++] = item;}
} // otros métodos }
Paolo Rosso Grupos: 2B+ENG - ETSIA
EDA2004/2005
public class Prueba{
static void main (String args[]){
System.out.println("Prueba de creación 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.
}
}
Top Related