59
Unidad I. Lenguaje de Programación Orientado a Objetos. Segunda Parte

Unidad I. Lenguaje de Programación Orientado a Objetos

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Unidad I. Lenguaje de Programación Orientado a Objetos

Unidad I. Lenguaje de

Programación Orientado a

Objetos.

Segunda Parte

Page 2: Unidad I. Lenguaje de Programación Orientado a Objetos

Contenido

1. Implementación de Estructuras de Datos

2. Implementación de clases

3. Implementación de asociaciones y

dependencia

4. Implementación de Herencia y Polimorfismo

Page 3: Unidad I. Lenguaje de Programación Orientado a Objetos

Implementación de Herencia

• Herencia

– Clases son creadas a partir de otras clases existentes

• Heredan atributos y funcionalidad

• Pueden agregar nuevas características

• Convertible hereda de Automobil

– Subclases heredan de las superclases

• Subclase con frecuencia agrega variables de instancia y

métodos

– Herencia simple y múltiple

• Java no soporta herencia múltiple

– La relación se interpreta como “Es un”

Page 4: Unidad I. Lenguaje de Programación Orientado a Objetos

Relación entre los objetos de la

superclase y los objetos de la subclase

• Objetos de la subclase

– Pueden ser tratados como objetos de la

superclase

• No se aplica al contrario

– Una Figura no siempre es un Circulo

– Cada clase implicitamente hereda de

java.lang.Object

• A menos que se especifique lo contrario en la primera

línea de definición de la clase

Page 5: Unidad I. Lenguaje de Programación Orientado a Objetos

Miembros protegidos: protected

• Acceso a miembros protected

– Este nivel de protección se úbica entre public y

private

– Estos miembros son accesible solo por:

• Métodos de la Superclase

• Métodos de la Subclase

• Métodos de clases en el mismo paquete

– Acceso de paquete (package access)

• Acceso de paquete: los miembros protegidos

solo son accesibles desde los objetos de una

subclase o de una clase del mismo paquete

Page 6: Unidad I. Lenguaje de Programación Orientado a Objetos

// Definición de la clase Punto

public class Punto {

protected int x, y; // coordenadas del punto

public Punto() // constructor sin argumento

{

//llamada implícita al constructor de la superclase

setPunto( 0, 0 );

}

public Punto( int coordenadX, int coordenadaY )

{

//llamada implícita al constructor de la superclase

setX( coordenadX ); setY( coordenadaY );

}

Ejemplo de Protected:

Superclase Punto

Page 7: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Protected: Superclase Punto

public void setX(int coordenadaX)

{

x = coordenadaX;

}

public int getX()

{

return x;

}

public void setY(int coordenadaY)

{

y = coordenadaY;

}

public int getY()

{

return y;

}

public String toString()

{

return "[" + x + ", " + y + "]";

}

} // fin de la clase Punto

Page 8: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Protected: Subclase Circulo

// Definición de la clase Circulo

public class Circulo extends Punto { // hereda de Punto

protected double radio;

public Circulo() // constructor sin argumentos

{

setRadio( 0 ); // llamada implicita al constructor de superclase

}

public Circulo( double valorRadio, int coordenadaX,

int coordenadaY ) // constructor

{

// llamada explicita al constructor de superclase

super( coordenadaX, coordenadaY);

// asignar radio

setRadio( valorRadio );

}

Page 9: Unidad I. Lenguaje de Programación Orientado a Objetos

public void setRadio( double valorRadio )

{

radio = ( valorRadio >= 0.0 ? valorRadio : 0.0 );

}

public double getRadio()

{

return radio;

}

public double calcularArea() // calcula area del Circulo

{

return Math.PI * radio * radio;

}

public String toString() // convierte el Circulo a String

{

return "Centro = "+ "[" + x + ", " + y + "]"+ "; Radio = " + radio;

}

} // fin de clase Circulo

Ejemplo de Protected: Subclase Circulo

Page 10: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Circulo.java

• Un Circulo es una subclase de Punto.

• Un Circulo hereda de clase Punto:

– variables de instancia protegidas

– métodos públicos (excepto el o los constructores)

• Realiza una llamada implícita al constructor de la

superclase Punto.

• Realiza una llamada explícita al constructor de la

superclase Punto.

• Sobreescribe el método toString() de la clase Punto

al usar el mismo prototipo del método.

10

Ejemplo de Protected: Subclase Circulo

Page 11: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Protected: Clase PruebaCirculo

// Clase PruebaCirculo

// Java core packages

import java.text.DecimalFormat;

// Java extension packages

import javax.swing.JOptionPane;

public class PruebaCirculo{

public static void main( String args[] )

{

Punto punto1, punto2;

Circulo circulo1, circulo2;

punto1 = new Punto( 30, 50 );

circulo1 = new Circulo( 2.7, 120, 89 );

Page 12: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Protected: Clase PruebaCirculo

String salida = "Punto punto1: " + punto1.toString() +

"\nCirculo circulo1: " + circulo1.toString();

// utiliza una relacion “es un” para referirse a un Circulo

// usando como referencia un Punto

punto2 = circulo1; //se asigna un Circulo a la referencia de Punto

salida += "\n\nCirculo circulo1(ubicado en referencia de punto2):" +

punto2.toString();

// Para asignar el circulo que esta almacenado en punto2,

//se utilizara “downcasting” (casting una referencia de superclase

//al tipo de dato de la subclase)

circulo2 = ( Circulo ) punto2;

Page 13: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Protected: Clase PruebaCirculo

salida += "\n\nCirculo circulo1 (ubicado en la referencia de

circulo2): " + circulo2.toString();

DecimalFormat precision2 = new DecimalFormat( "0.00" );

salida += "\nArea del circulo1 (ubicado en la referencia de

circulo2): " + precision2.format( circulo2.area() );

// Intento de referir a un objeto Punto con referencia de Circulo

if ( punto1 instanceof Circulo ) {

circulo2 = ( Circulo ) punto1;

salida += "\n\ncasting realizado exitosamente"; }

else

salida += "\n\npunto1 no hace referencia a un Circulo";

JOptionPane.showMessageDialog( null, salida,"Demostracion de

la relacion \“es un\" ", JOptionPane.INFORMATION_MESSAGE );

System.exit( 0 );

}

} // fin de la clase PruebaCirculo

Page 14: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase PruebaCirculo.java

• Crea dos referencias a objetos de tipo Punto y dos de tipo Circulo

• Un circulo invoca el método sobreescrito toString

• Una variable de superclase hace referencia a un objeto de subclase

• Un Punto invoca el método toString sobreescrito de la clase Circulo

• Se convierte el objeto circulo (referenciado por un Punto), a un

objeto Circulo, utilizando downcasting

• Circulo invoca el método calcularArea()

• Usar el método instanceof() para determinar si un Punto hace

referencia a un Circulo

• Si un Punto hace referencia a un Circulo, se puede aplicar el casting

a un Punto para convertirlo a Circulo

– circulo2 = ( Circulo ) punto1;

14

Ejemplo de Protected: Clase PruebaCirculo

Page 15: Unidad I. Lenguaje de Programación Orientado a Objetos

Polimorfismo

• Polimorfismo

– Los programas generalmente procesan los objetos

como objetos de las superclases

• Fácilmente se pueden agregar clases a las aplicaciones

– Las clases deben ser parte de una jerarquía de herencia

– Enlace dinámico de los métodos

• Implementa el procesamiento polimórfico de los objetos

• Utiliza una referencia a la superclase para referenciar un

objeto de la subclase

• El programa selecciona el método correcto del objeto de la

subclase

Page 16: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Enlace Dinámico

de los métodos• Por ejemplo,

– Superclase Figura

– Subclases Circulo, Rectangulo y Cuadrado

cada clase se dibuja ella misma de acuerdo al tipo

de clase

• Figura tiene el método dibujar

• Cada subclase ha sobreescrito el método dibujar

• En una llamada al método dibujar de la superclase

Figura

– El programa determina dinámicamente cual método

dibujar de las subclases es invocado

Page 17: Unidad I. Lenguaje de Programación Orientado a Objetos

Superclases abstractas y clases

concretas• Clases abstractas

– No se pueden crear objetos

– Son muy genéricas para definir objetos reales

• Figura2D

– Proveen una superclase de la cual otras clases pueden

heredar

• Se les conoce como superclases abstractas

• Clases concretas

– Clases desde las cuales los objetos son instanciados

– Especifican como crear objetos

• Cuadrado, Circulo y Triangulo

Page 18: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo con Clases

Abstractas

• Establecer una Jerarquía de herencia

entre: Punto, Circulo, Cilindro

– Modificar la Jerarquía incluyendo una

superclase abstracta Figura

• Demostración del polimorfismo

• Contiene el método abstracto getNombre

– Cada subclase debe implementar el método

getNombre

• Contiene los métodos (no abstractos)

calcularArea y calcularVolumen

– Retornan 0 por omisión

– Cada subclase sobreescribe estos métodos

Page 19: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Abstracta Figura

//Definicion de la clase abstracta Figura

public abstract class Figura extends Object {

// calcula el area de la figura

public double calcularArea()

{

return 0.0;

}

// calcula el volumen de la figura

public double calcularVolumen()

{

return 0.0;

}

// metodo abstracto debe ser definido por las subclases concretas

// para retornar el nombre apropiado

public abstract String getNombre();

} // fin de la clase Figura

Page 20: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase abstracta Figura.java

• Figura no puede ser instanciada

• Las clases abstractas pueden heredar métodos

concretos para las subclases

• Las subclases concretas deben implementar el

método getNombre()

20

Ejemplo de Polimorfismo: Clase Abstracta Figura

Page 21: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Punto

//Definicion de la clase Punto

public class Punto extends Figura {

protected int x, y; // coordenadas del Punto

// constructor sin argumentos

public Punto()

{

setPunto( 0, 0 );

}

// constructor

public Punto( int coordenadaX, int coordenadaY )

{

setPunto( coordenadaX, coordenadaY );

}

// Asignar las coordenadas x y y del Punto

public void setPunto( int coordenadaX, int coordenadaY )

{

x = coordenadaX; //setX() y

y = coordenadaY; //setY(), ambos en un solo metodo

}

Page 22: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Punto

public int getX() // recuperar coordenada x

{

return x;

}

public int getY() // recuperar coordenada y

{

return y;

}

// convierte el Punto a su representacion en String

public String toString()

{

return "[" + x + ", " + y + "]";

}

// retorna el nombre de la figura

public String getNombre()

{

return "Punto";

}

} // fin de la clase Punto

Page 23: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Punto.java

• Punto hereda los métodos públicos de Figura

• Los miembros protegidos solo pueden ser accedidos

por los objetos de las subclases de Punto o de las

clases del mismo paquete

• Punto implementa el método abstracto getNombre

• Punto no sobreescribe el método calcularArea y

calcularVolumen, porque no posee area ni volumen

23

Ejemplo de Polimorfismo: Clase Punto

Page 24: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Circulo

//Definicion de la clase Circulo

public class Circulo extends Punto { // hereda de Punto

protected double radio;

public Circulo() //constructor sin argumentos

{

// llamada implicita al constructor de la superclase aqui

setRadio( 0 );

}

// constructor

public Circulo( double valorRadio, int coordenadaX, int coordenadaY )

{

// invoca el constructor de la superclase

super( coordenadaX, coordenadaY );

setRadio( valorRadio );

}

// asignar radio del Circulo

public void setRadio( double valorRadio )

{

radio = ( valorRadio >= 0 ? valorRadio : 0 );

}

Page 25: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Circulo

// recuperar radio del Circulo

public double getRadio()

{

return radio;

}

public double calcularArea() // calcula area del Circulo

{

return Math.PI * radius * radius;

}

// convierte el Circulo a su representacion en String

public String toString()

{

return "Centro = " + super.toString() +

"; Radio = " + radio;

}

public String getNombre() // retorna nombre de la Figura

{

return "Circulo";

}

} // fin de la clase Circulo

Page 26: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Circulo.java

• Circulo hereda las variables y métodos de Punto y

Figura

• Define métodos para recuperar/asignar los valores

protected

• Sobreescribe el método calcularArea, no así el

método calcularVolumen, ya que no posee volumen

• Implementa el método abstracto getNombre

26

Ejemplo de Polimorfismo: Clase Circulo

Page 27: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Cilindro

//Definicion de la clase Cilindro

public class Cilindro extends Circulo {

protected double altura; // altura del Cilindro

public Cilindro() //constructor sin argumentos

{

// llamada implicita al constructor de la superclase aqui

setAltura( 0 );

}

// constructor

public Cilindro( double alturaCilindro, double radioCilindro,

int coordenadaX, int coordenadaY)

{

// invoca el contrusctor de la superclase

super( radioCilindro, coordenadaX, coordenadaY );

setAltura( alturaCilindro );

}

Page 28: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Cilindro

// asignar altura del Cilindro

public void setAltura( double alturaCilindro )

{

altura = ( alturaCilindro >= 0 ? alturaCilindro : 0 );

// recupera altura del Cilindro

public double getAltura()

{

return altura;

}

// calcula el area del Cilindro ( area de la superficie )

public double calcularArea()

{

return 2 * super.calcularArea() + 2 * Math.PI * radio * altura;

}

// calcula el volumen del Cilindro

public double calcularVolumen()

{

return super.calcularArea() * altura;

}

Page 29: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Cilindro

// convierte el Cilindro a su representación en String

public String toString()

{

return super.toString() + "; altura = " + altura;

}

// retorna el nombre de la Figura

public String getNombre()

{

return "Cilindro";

}

} // fin de clase Cilindro

Page 30: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Cilindro.java

• Cilindro hereda las variables y métodos de Punto,

Circulo y Figura

• Sobreescribe los métodos calcularArea y

calcularVolumen

• Implementa el método abstracto getNombre de

Figura

30

Ejemplo de Polimorfismo: Clase Cilindro

Page 31: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Prueba

// Clase Prueba.java

// Clase que prueba la jerarquia de Figura, Punto, Circulo y Cilindro

// Java core packages

import java.text.DecimalFormat;

// Java extension packages

import javax.swing.JOptionPane;

public class Prueba {

// Prueba la jerarquia de Figura

public static void main( String args[] )

{

// crear Figuras

Punto punto = new Punto( 7, 11 );

Circulo circulo = new Circulo( 3.5, 22, 8 );

Cilindro cilindro = new Cilindro( 10, 3.3, 10, 10 );

// crear arreglo de Figuras

Figura arregloDeFiguras[] = new Figura[ 3 ];

Page 32: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Prueba

// arregloDeFiguras[0] apunta a un objeto de la subclase Punto

arregloDeFiguras[0] = punto;

// arregloDeFiguras[1] apunta a un objeto de la subclase Circulo

arregloDeFiguras[1] = circulo

// arregloDeFiguras[2] apunta a un objeto de la subclase Cilindro

arregloDeFiguras[2] = cilindro; // Obtener de cada Figura su

//nombre y su representacion en String

String salida =

punto.getNombre() + ": " + punto.toString() + "\n" +

circulo.getNombre() + ": " + circulo.toString() + "\n" +

cilindro.getNombre() + ": " + cilindro.toString();

DecimalFormat precision2 = new DecimalFormat( "0.00" );

Page 33: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Prueba

// ciclo sobre el arregloDeFiguras y recupera el nombre

// area y volumen de cada Figura en el arregloDeFiguras

for ( int i = 0; i < arregloDeFiguras.length; i++ ) {

salida += "\n\n" + arregloDeFiguras [ i ].getNombre() +

": " + arregloDeFiguras [ i ].toString() +

"\nArea = " +

precision2.format(arregloDeFiguras[ i ].calcularArea() ) +

"\nVolumen = " +

precision2.format(arregloDeFiguras[ i ].calcularVolumen() );

}

JOptionPane.showMessageDialog( null, salida,

“Demostracion de Polimorfismo",

JOptionPane.INFORMATION_MESSAGE );

System.exit( 0 );

}

} // fin de clase Prueba

Page 34: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Prueba.java

• Crea un objeto de cada subclase de la superclase

Figura

• Crea un arreglo de tres variables de tipo Figura para

referenciar cada objeto de las subclases

• Enlaza dinámicamente el método getNombre

• Enlaza dinámicamente el método calcularArea para

los objetos de Circulo y Cilindro

• Enlaza dinámicamente el método calcularVolumen

para el objeto de Cilindro

34

Ejemplo de Polimorfismo: Clase Prueba

Page 35: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejecución de Prueba.java

Punto: [7, 11]Circulo: Centro = [22, 8]; Radio = 3.5Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0

Punto: [7, 11]Area = 0.00Volumen = 0.00

Circulo: Centro = [22, 8]; Radio = 3.5Area = 38.48Volumen = 0.00

Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0Area = 275.77Volumen = 342.12

Page 36: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo creando y usando

Interfaces• Utilizar la interface Figura

– Substituir la clase abstracta Figura

• Interface

– Su definición inicia con la palabra

interface

– Las clases implementan una interface

(es decir, sus métodos)

– Contiene métodos publicos y

abstractos

• Las clases (que implementan la interface)

deben implementar estos métodos

Page 37: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Interface Figura

//Definicion de la Interface Figura

public Interface Figura extends Object {// calcula el area de la figura

public double calcularArea() ;

// calcula el volumen de la figura

public double calcularVolumen() ;

// retorna el nombre de la figura

public abstract String getNombre();

} // fin de la interface Figura

Page 38: Unidad I. Lenguaje de Programación Orientado a Objetos

Interface Figura.java

• Las clases que implementen la interface Figura

deben implementar sus métodos.

38

Ejemplo de Polimorfismo: Interface Figura

Page 39: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Punto

//Definicion de la clase Punto

public class Punto extends Object implements Figura {protected int x, y; // coordenadas del Punto

// constructor sin argumentos

public Punto()

{

setPunto( 0, 0 );

}

// constructor

public Punto( int coordenadaX, int coordenadaY )

{

setPunto( coordenadaX, coordenadaY );

}

// Asignar las coordenadas x y y del Punto

public void setPunto( int coordenadaX, int coordenadaY )

{

x = coordenadaX;

y = coordenadaY;

}

Page 40: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Punto

public int getX() // recuperar coordenada x

{

return x;

}

public int getY() // recuperar coordenada y

{

return y;

}

// convierte el Punto a su representacion en String

public String toString()

{

return "[" + x + ", " + y + "]";

}

// calcula el area de la figura

public double calcularArea()

{

return 0.0;

}

Page 41: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Punto

// calcula el volumen

public double calcularVolumen()

{

return 0.0;

}

// retorna el nombre de la figura

public String getNombre()

{

return "Punto";

}

} // fin de la clase Punto

Page 42: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Punto.java

• Punto implementa la interface Figura

• Punto implementa los métodos especificados en la

interface Figura

42

Ejemplo de Polimorfismo: Clase Punto

Page 43: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Circulo

//Definicion de la clase Circulo

public class Circulo extends Punto { // hereda de Punto

protected double radio;

public Circulo() //constructor sin argumentos

{

// llamada implicita al constructor de la superclase aqui

setRadio( 0 );

}

// constructor

public Circulo( double radioCirculo, int coordenadaX, int coordenadaY )

{

// invoca el constructor de la superclase

super( coordenadaX, coordenadaY );

setRadio( radioCirculo );

}

// asignar radio del Circulo

public void setRadio( double radioCirculo )

{

radio = (radioCirculo >= 0 ? radioCirculo : 0 );

}

Page 44: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Circulo

// recuperar radio del Circulo

public double getRadio()

{

return radio;

}

public double calcularArea() // calcula area del Circulo

{

return Math.PI * radius * radius;

}

// convierte el Circulo a su representacion en String

public String toString()

{

return "Centro = " + super.toString() +

"; Radio = " + radio;

}

public String getNombre() // retorna nombre de la Figura

{

return "Circulo";

}

} // fin de la clase Circulo

Page 45: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Circulo.java

• Circulo hereda las variables y métodos de Punto,

incluyendo las implementaciones de la interface

Figura

• Sobreescribe el método toString

• Sobreescribe los métodos calcularArea y getNombre,

no así el método calcularVolumen

45

Ejemplo de Polimorfismo: Clase Circulo

Page 46: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Cilindro

//Definicion de la clase Cilindro

public class Cilindro extends Circulo {

protected double altura; // altura del Cilindro

public Cilindro() //constructor sin argumentos

{

// llamada implicita al constructor de la superclase aqui

setAltura( 0 );

}

// constructor

public Cilindro( double alturaCilindro, double radioCilindro,

int coordenadaX, int coordenadaY)

{

// invoca el contrusctor de la superclase

super( radioCilindro, coordenadaX, coordenadaY );

setAltura( alturaCilindro );

}

Page 47: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Cilindro

// asignar altura del Cilindro

public void setAltura( double alturaCilindro )

{

altura = ( alturaCilindro >= 0 ? alturaCilindro : 0 );

// recupera altura del Cilindro

public double getAltura()

{

return altura;

}

// calcula el area del Cilindro ( area de la superficie )

public double calcularArea()

{

return 2 * super.calcularArea() + 2 * Math.PI * radio * altura;

}

// calcula el volumen del Cilindro

public double calcularVolumen()

{

return super.calcularArea() * altura;

}

Page 48: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Cilindro

// convierte el Cilindro a su representación en String

public String toString()

{

return super.toString() + "; Altura = " + altura;

}

// retorna el nombre de la Figura

public String getNombre()

{

return "Cilindro";

}

} // fin de clase Cilindro

Page 49: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Cilindro.java

• Cilindro hereda las variables y métodos de Punto,

Circulo y las implementaciones de la interface Figura

• Sobreescribe el método toString

• Sobreescribe los métodos calcularArea,

calcularVolumen y getNombre

49

Ejemplo de Polimorfismo: Clase Cilindro

Page 50: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Prueba

// Clase Prueba.java

// Clase que prueba la jerarquia de Punto, Circulo y Cilindro,

// con la interface Figura

// Java core packages

import java.text.DecimalFormat;

// Java extension packages

import javax.swing.JOptionPane;

public class Prueba {

// Prueba la jerarquia de Punto con la interface Figura

public static void main( String args[] )

{

// crear Figuras

Punto punto = new Punto( 7, 11 );

Circulo circulo = new Circulo( 3.5, 22, 8 );

Cilindro cilindro = new Cilindro( 10, 3.3, 10, 10 );

// crear arreglo de Figuras

Figura arregloDeFiguras[] = new Figura[ 3 ];

Page 51: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Prueba

// arregloDeFiguras[0] apunta a un objeto de la subclase Punto

arregloDeFiguras[0] = punto;

// arregloDeFiguras[1] apunta a un objeto de la subclase Circulo

arregloDeFiguras[1] = circulo

// arregloDeFiguras[2] apunta a un objeto de la subclase Cilindro

arregloDeFiguras[2] = cilindro; // Obtener de cada Figura su

//nombre y su representacion en String

String salida =

punto.getNombre() + ": " + punto.toString() + "\n" +

circulo.getNombre() + ": " + circulo.toString() + "\n" +

cilindro.getNombre() + ": " + cilindro.toString();

DecimalFormat precision2 = new DecimalFormat( "0.00" );

Page 52: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejemplo de Polimorfismo: Clase Prueba

// ciclo sobre el arregloDeFiguras y recupera el nombre

// area y volumen de cada Figura en el arregloDeFiguras

for ( int i = 0; i < arregloDeFiguras.length; i++ ) {

salida += "\n\n" + arregloDeFiguras [ i ].getNombre() +

": " + arregloDeFiguras [ i ].toString() +

"\nArea = " +

precision2.format(arregloDeFiguras[ i ].calcularArea() ) +

"\nVolumen = " +

precision2.format(arregloDeFiguras[ i ].calcularVolumen() );

}

JOptionPane.showMessageDialog( null, salida,

“Demostracion de Polimorfismo",

JOptionPane.INFORMATION_MESSAGE );

System.exit( 0 );

}

} // fin de clase Prueba

Page 53: Unidad I. Lenguaje de Programación Orientado a Objetos

Clase Prueba.java

• Es idéntica a la clase utilizada en el ejemplo con la

clase abstracta Figura

• La salida es idéntica a la presentada en el ejemplo

con la clase abstracta Figura

53

Ejemplo de Polimorfismo: Clase Prueba

Page 54: Unidad I. Lenguaje de Programación Orientado a Objetos

Ejecución de Prueba.java

con interface Figura

Punto: [7, 11]Circulo: Centro = [22, 8]; Radio = 3.5Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0

Punto: [7, 11]Area = 0.00Volumen = 0.00

Circulo: Centro = [22, 8]; Radio = 3.5Area = 38.48Volumen = 0.00

Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0Area = 275.77Volumen = 342.12

Page 55: Unidad I. Lenguaje de Programación Orientado a Objetos

• Como declarar una clase para que sea reutilizada

– Declararla como una clase pública

– Agregar una declaración del paquete (package) al

archivo del código fuente

• Normalmente se escribe en minusculas

• Debe ser la primera instrucción ejecutable en el archivo

• El nombre del paquete debería consistir del nombre de los

directorios en la estructura del paquete

– Ejemplo: banco.cuentas

– El nombre del paquete es parte de un nombre de clase válido

» Permite distinguir entre muchas clases con el mismo nombre y

que pertenecen a diferentes paquetes

» Previene conflictos de nombre (colisión de nombres)

– El nombre de la clase se escribe sin el nombre del paquete55

Paquetes

Page 56: Unidad I. Lenguaje de Programación Orientado a Objetos

56

Importar Clase Reutilizable– Como importar la clase reutilizable en un programa

• Usando una declaración simple de import

– Importando una sola clase

– Ejemplo: import java.util.Random;

• Usando una declaración del paquete

– Importa todas las clases del paquete

– Ejemplo: import java.util.*;

– Error común de programación

• Usar la declaración de import “import java.*;” que

causaría un error de compilación.

• Se debe especificar el exacto nombre del paquete que

contiene la clase que se quiere importar.

Page 57: Unidad I. Lenguaje de Programación Orientado a Objetos

57

Acceso del paquete

• Acceso del paquete

– Métodos y variables declaradas sin ningun modificador tienen

acceso de paquete

– Esto no afecta si el programa consiste de una sola clase

– Si tiene efectos si el programa contiene más de una clase en el

mismo paquete

• Los miembros con acceso de paquete pueden ser accedidos

directamente mediante una referencia apropiada al objeto, desde las

otras clases que pertenecen al mismo paquete

• Mantener dentro del mismo paquete las clases

dependientes para que soporten la funcionalidad del

paquete.

Page 58: Unidad I. Lenguaje de Programación Orientado a Objetos

58

Ejemplo de Uso de Paquetes

• Codificar el siguiente diagrama de clases

Page 59: Unidad I. Lenguaje de Programación Orientado a Objetos

59

Ejemplo de Uso de Paquetes

• En el método main, crear un objeto de tipo cuenta y

asignarle un propietario, realizarle un cargo y un abono

• La clase Cuenta define dos atributos de tipo colección:

una colección de Clientes y otra de Movimientos.

– Ya que la clase Movimiento se encuentra en el mismo

paquete, no será necesario importarla.

– La clase Cliente se encuentra en un paquete diferente al de la

clase Cuenta, por lo tanto será necesario importarla.

• La clase PruebaCuenta define el método main, en el

cual se crearán objetos de tipo Cuenta.

– Ya que la clase Cuenta se encuentra en otro paquete, será

necesario importarla a la clase PruebaCuenta.