Unidad I. Lenguaje de Programación Orientado a Objetos. Segunda Parte 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 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” 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 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 Ejemplo de Protected: Superclase Punto // 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 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 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 ); } Ejemplo de Protected: Subclase Circulo 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 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: 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 ); 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; 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 Ejemplo de Protected: Clase PruebaCirculo 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 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 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 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 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 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 Ejemplo de Polimorfismo: Clase Abstracta Figura 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 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 } 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 Ejemplo de Polimorfismo: Clase Punto 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 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 ); } 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 Ejemplo de Polimorfismo: Clase Circulo 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 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 ); } 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; } 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 Ejemplo de Polimorfismo: Clase Cilindro 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 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 ]; 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" ); 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 Ejemplo de Polimorfismo: Clase Prueba 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 Ejecución de Prueba.java Punto: [7, 11] Circulo: Centro = [22, 8]; Radio = 3.5 Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0 Punto: [7, 11] Area = 0.00 Volumen = 0.00 Circulo: Centro = [22, 8]; Radio = 3.5 Area = 38.48 Volumen = 0.00 Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0 Area = 275.77 Volumen = 342.12 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 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 Ejemplo de Polimorfismo: Interface Figura Interface Figura.java • Las clases que implementen la interface Figura deben implementar sus métodos. 38 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; } 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; } 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 Ejemplo de Polimorfismo: Clase Punto Clase Punto.java • Punto implementa la interface Figura • Punto implementa los métodos especificados en la interface Figura 42 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 ); } 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 Ejemplo de Polimorfismo: Clase Circulo 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 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 ); } 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; } 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 Ejemplo de Polimorfismo: Clase Cilindro 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 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 ]; 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" ); 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 Ejemplo de Polimorfismo: Clase Prueba 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 Ejecución de Prueba.java con interface Figura Punto: [7, 11] Circulo: Centro = [22, 8]; Radio = 3.5 Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0 Punto: [7, 11] Area = 0.00 Volumen = 0.00 Circulo: Centro = [22, 8]; Radio = 3.5 Area = 38.48 Volumen = 0.00 Cilindro: Centro = [10, 10]; Radio = 3.3; Altura = 10.0 Area = 275.77 Volumen = 342.12 Paquetes • 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 paquete 55 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. 56 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. 57 Ejemplo de Uso de Paquetes • Codificar el siguiente diagrama de clases 58 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. 59