Libro Poo PDF
Libro Poo PDF
TABLA DE CONTENIDO
INTRODUCCIÓN ............................................................................................... 3
UNIDADES DE APRENDIZAJE......................................................................... 5
ENCAPSULAMIENTO ....................................................................................... 6
Constructores ............................................................................................................8
Métodos ....................................................................................................................8
HERENCIA ...................................................................................................... 38
POLIMORFISMO ............................................................................................. 54
Polimorfismo ........................................................................................................... 54
Casting .................................................................................................................... 55
INTRODUCCIÓN
Este modulo tiene como objetivo servir como material de estudio principal en el
desarrollo del curso de programación orientada a objetos. Su contenido separa la parte
teórica de la parte práctica como guías de laboratorio.
En la decimo tercera semana se crea una base de datos con una tabla utilizando
mysql workbench y se establece la conexión desde netbeans. Se desarrolla la guía de
labortorio nro. 13
UNIDADES DE APRENDIZAJE
ENCAPSULAMIENTO HERENCIA
POLIMORFISMO
PERSISTENCIA
SEMANA 01
ENCAPSULAMIENTO
Herencia, a través de la cual se puede extender y/o agregar y/o modificar y/o reutilizar
la funcionalidad de una clase existente, llamada padre, en otra clase llamada hija para
evitar la redundancia en el código ya desarrollado. Esta característica resume la frase
“aprovecha lo que ya está hecho”.
Niveles de acceso
Diseño de clases
Una clase, en la práctica es un nuevo tipo de dato particularizado que se compone de:
nombre, atributos, constructores y métodos. Los atributos representan los datos y/o
características de la clase, los constructores permiten crear objetos de la clase y los
métodos representan la funcionalidad de la clase que será utilizada por los objetos.
Nombre
Atributos
Constructores
Métodos
El nombre de una clase debe empezar con letra mayúscula. Los atributos deben ser
de acceso privado/protegido y los métodos pueden ser de acceso público y/o
// constructores públicos
Constructores
Una clase puede tener varios constructores. Sin embargo, deben diferenciarse por la
cantidad y/o tipo de parámetros (sobrecarga). Cuando se crea un objeto, se invoca
automáticamente al constructor que corresponda a los parámetros dados. Si no
encuentra un constructor adecuado, se produce un error.
Métodos
Los métodos de una clase expresan la funcionalidad con la que dispone una clase
para el accionar de sus objetos. Por lo general son de acceso público.
Los métodos necesarios para el acceso de los atributos son conocidos como get/set y
los demás métodos son conocidos como métodos adicionales que permiten realizar
procesos de cálculo, búsqueda, clasificación, ordenamiento, etc.
Los métodos get son aquellos que permiten obtener el valor de los atributos. Los
métodos set permiten modificar el valor de los atributos.
Estos métodos se han estandarizado, por eso se les conoce como los métodos
get/set. Incluso, los entornos de programación modernos, como NetBeans, generan la
escritura del código correspondiente.
La palabra reservada this se utiliza para diferenciar el nombre del atributo con el
nombre del parámetro cuando éstos coinciden.
Creación de objetos
Un objeto, en la práctica es una variable cuyo tipo de dato es una clase. Cuando el
objeto es creado, obtiene una copia de los atributos de la clase para uso exclusivo de
dicho objeto. Por ésta razón, todos los objetos de una clase tendrán los mismos
atributos pero cada uno con valores diferentes.
Sintaxis general:
// declara 2 objetos
Clase objeto1, objeto2;
Ejemplo 1
Diseñe una clase, de nombre Producto con los siguientes atributos privados: código
(cadena), descripción (cadena), precio (real) y los métodos públicos get/set. Considere
un constructor implícito.
// métodos get
public String getCodigo(){return codigo;}
public String getDescripcion(){return descripcion;} public
double getPrecio(){ return precio;}
// métodos set
public void setCodigo(String c){
codigo =c;
}
public void setDescripcion(String d){
descripcion=d;
}
public void setPrecio(double p){
precio=p;
}
}
Considere el siguiente diseño de una GUI y programe la acción del botón Nuevo
// lee los valores de la GUI y los coloca como atributos del objeto
nuevo.setCodigo(leeCodigo()); nuevo.setDescripcion(leeDescripcion());
nuevo.setPrecio(leePrecio());
Ejemplo 2
Diseñe una clase de nombre Persona con los siguientes atributos privados: nombres
(cadena), apellidos (cadena), edad(entero), peso(real) y los métodos get/set.
Considere un constructor explícito con parámetros.
// métodos set
public void setNombres(String nombres){
this.nombres = nombres;
}
public void setApellidos(String apellidos){
this.apellidos = apellidos;
}
public void setEdad(int edad){
this.edad = edad;
}
public void setPeso(double peso){
this.peso = peso;
}
}
Considere el siguiente diseño de una GUI y programe la acción del botón Nuevo
PROGRAMACIÓN I
Ejemplo 3
Diseñe una clase de nombre TV con los siguientes atributos privados: serie (cadena),
marca (entero), tamaño en pulgadas(entero), precio (real) y con los métodos get/set,
con un método adicional que devuelve el precio en soles dado el tipo de cambio como
parámetro, y con un método adicional que retorne el nombre de la marca. Considere
las siguientes marcas: Sony, LG, Samsung, Panasonic, otro. Considere un constructor
implícito.
Considere el siguiente diseño de una GUI y programe la acción del botón Nuevo
Ejemplo 4
Diseñe una clase de nombre Fecha con los siguientes atributos privados: dia(entero),
mes(entero), año(entero) y con los métodos get/set. Considere un constructor
explícito.
Diseñe otra clase de nombre DNI con los siguientes atributos privados:
numero(cadena), dueño(Persona), fecha de emisión (Fecha), fecha de
caducidad(Fecha) y con los métodos get/set. Considere un constructor explícito.
Considere el siguiente diseño de una GUI y programe la acción del botón Nuevo.
PROGRAMACIÓN I
Ejemplo 5
Diseñe una clase de nombre Punto con los siguientes atributos privados: x (entero), y
(entero), con un constructor explícito y con los métodos get/set.
Diseñe una clase de nombre Triangulo con los siguientes atributos privados:
a(Punto), b(Punto), c(Punto), con un constructor implícito y con los métodos get/set
además de los métodos de cálculo para los lados del triángulo, para el perímetro del
triángulo y para el área del triángulo.
Considere el diseño de una GUI para programar la acción del botón nuevo.
SEMANA 02
ENCAPSULAMIENTO
Clase administradora
Una clase administradora es aquella que tiene todo lo necesario para administrar
información de cualquier tipo, considerando los atributos y funcionalidad necesarios
para ello.
Arreglo de objetos
Un arreglo de objetos es aquel cuyos elementos que componen el arreglo son objetos.
Es decir, cada casillero del arreglo es un objeto. Sin embargo, la posición de los
casilleros siguen siendo enteros consecutivos a partir de 0.
Clase ArrayList
La clase ArrayList es una clase que administra un arreglo de objetos de cualquier
tipo. No tiene restricciones de capacidad. Su tamaño se ajusta en forma dinámica
utilizando eficientemente la memoria del computador.
Método Interpretación
int size() Retorna el número de objetos guardados.
Añade un objeto al final del arreglo, incrementando su
void add(Object obj)
tamaño actual en 1.
Devuelve el objeto almacenado a la posición index en
Object get(int index)
el arreglo. index tiene que ser un entero entre 0 y size()-1.
void set(int index, Object obj) reemplaza el objeto de la posición index por el objeto obj.
Elimina el objeto a la posición index (index entre 0 y
size()-1). Devuelve el objeto eliminado. Los objetos
Object remove(int index)
después de este objeto se trasladan a una posición
anterior. El tamaño del ArrayList disminuye en 1.
Busca el objeto obj dentro del arreglo, si lo encuentra
int indexOf(Object obj) devuelve la posición donde lo ha encontrado. Si no lo
encuentra, devuelve -1.
Ejemplo 1:
Diseñe una clase administradora para un arreglo de objetos de tipo Producto
considerando la siguiente GUI:
Diseñe la clase Producto con constructor explícito y genere los métodos get-set:
// constructor
public Producto(String codigo, String descripcion, double precio){
this.codigo=codigo;
this.descripcion=descripcion;
this.precio=precio;
}
// métodos get-set
}
// constructor explícito
public ArregloProductos(){
a = new ArrayList<Producto>();
}
// métodos de administración
public int tamaño(){ return a.size(); }
public void agrega(Producto p){
a.add(p);
}
public Producto obtiene(int i){ // retorna un producto de la posición i
return a.get(i);
}
public void actualiza(Producto p, int i){
// reemplaza un producto
a.set(i, p);
}
// retorna la posición de un producto según su código.
public int busca(String codigo){
for(int i=0; i<tamaño(); i++){
if(obtiene(i).getCodigo().equals(codigo))
return i;
}
return -1; // no lo encontró
}
public void elimina(int p){// elimina el producto de la posición p
a.remove(p);
}
public double mayorPrecio(){// retorna el mayor precio
double m=a.get(0).getPrecio();
for(Producto p: a){ // for each: por cada producto p en a
if(p.getPrecio() > m)
m =p.getPrecio();
}
return m;
}
public double menorPrecio(){// retorna el menor precio
double m=a.get(0).getPrecio();
for(Producto p: a){ // for each: por cada producto p en a
if(p.getPrecio() < m)
m =p.getPrecio();
}
return m;
}
public double precioPromedio(){// retorna el precio promedio
double suma=0;
Ejemplo 2:
Diseñe una clase administradora con soporte para un arreglo de objetos tipo Persona
considerando la siguiente GUI:
dni
El botón Busca ubica una persona según el dni ingresado y muestra sus datos
donde corresponda.
El botón Modifica reemplaza los datos de la persona ubicada con el botón
Busca.
El botón Elimina saca del arreglo la persona según el dni ingresado.
El botón Lista muestra una relación de todas las personas guardadas en el
arreglo.
El botón Reporte muestra el resultado de todos los métodos adicionales.
El botón Borrar limpia todo el contenido del GUI.
Ejemplo 3
Diseñe una clase administradora con soporte para un arreglo de objetos tipo TV.
Considere una GUI adecuada para los datos de la clase TV que se indica a
continuación.
Diseñe la clase TV con los siguientes atributos: serie (cadena), marca (entero), tamaño
en pulgadas(entero), precio en dólares (real). Considere un constructor explícito y sus
métodos get/set. Considere un método adicional que devuelve el precio en soles dado
el tipo de cambio como parámetro, y un método adicional que retorne el nombre de la
marca. Considere las siguientes marcas: Sony, LG, Samsung, Panasonic, otro.
Diseñela clase administradora ArregloTV, que tenga como atributo privado un objeto
de la clase ArrayList particularizado para la clase TV donde se guardarán los objetos.
Ejemplo 4
e) Retorne en un arreglo los productos cuya descripción empiece con una letra
dada como parámetro.
Ejemplo 5
b) Incremente el peso de las personas cuyo peso actual sea inferior a un valor
dado como parámetro.
c) Disminuya el peso de las personas cuyo peso actual esté en un rango dado
como parámetro.
e) Retorne en un arreglo las personas cuya edad sea superior a un valor dado
como parámetro.
Ejemplo 6
SEMANA 03
ENCAPSULAMIENTO
Una clase administradora es aquella que tiene todo lo necesario para administrar
información de cualquier tipo, considerando los atributos y funcionalidad necesarios
para ello.
Lista de objetos
Una lista de objetos es aquella cuyos elementos que la componen son objetos que
están vinculados a través de un enlace. A diferencia de los arreglos, una lista no tiene
casilleros ni se dimensiona, van creciendo o decreciendo de uno en uno.
Clase LinkedList
La clase LinkedList es una clase que administra una lista de objetos de cualquier tipo.
Sin embargo, para un uso adecuado se recomienda particularizarlo al objeto que se
quiera administrar. Utiliza eficientemente la memoria del computador ajustado
estrictamene a la cantidad de objetos que lo contenga.
Cuando una lista sólo utiliza addFirst para agregar objetos, se le conoce como lista
tipo pila. Cuando sólo utiliza addLast se le conoce como lista tipo cola y cuando utiliza
indistintamente addFirst, addLast, add se le conoce como lista general.
Método Interpretación
void addLast (Object info) agrega un nuevo objeto info al final de la lista.
void add(int posición, Object info) agrega un nuevo objeto en la posición entera que
se indique.
Ejemplo 1:
Diseñe una clase administradora para una lista tipo pila de objetos de tipo Producto
considerando la siguiente GUI:
Diseñe la clase Producto con constructor explícito y genere los métodos get-set:
public class Producto {
// atributos privados
private String codigo, descripcion;
private double precio;
// constructor
public Producto(String codigo, String descripcion, double precio){
this.codigo=codigo;
this.descripcion=descripcion;
this.precio=precio;
}
// métodos get-set
}
// constructor explícito
public ListaProductos(){
pila = new LinkedList<Producto>();
}
// métodos de administración
public int tamaño(){ return pila.size(); }
public void agrega(Producto p){
pila.addFirst(p);
}
public Producto obtiene(int i){ // retorna un producto de la posición i
return pila.get(i);
}
// retorna la posición de un producto según su código.
public int busca(String codigo){
for(int i=0; i<tamaño(); i++){
if(obtiene(i).getCodigo().equals(codigo))
return i;
}
return -1; // no lo encontró
}
public void elimina(){// elimina el primer producto de la pila
pila.removeFirst();
}
public double mayorPrecio(){// retorna el mayor precio
double m=pila.get(0).getPrecio();
for(Producto p: pila){ // for each: por cada producto p en pila
if(p.getPrecio() > m)
m =p.getPrecio();
}
return m;
}
public double menorPrecio(){// retorna el menor precio
double m=pila.get(0).getPrecio();
for(Producto p: pila){ // for each: por cada producto p en pila
if(p.getPrecio() < m)
m =p.getPrecio();
}
return m;
}
public double precioPromedio(){// retorna el precio promedio
double suma=0;
for(Producto p: pila){ // for each: por cada producto p enpil a
suma += p.getPrecio();
}
return suma / tamaño();
}
} // fin de la clase ListaPilaProductos
Busca.
El botón Elimina saca de la lista el primer producto.
El botón Lista muestra una relación de todos los productos guardados en la
lista.
El botón Reporte muestra los precios mayor, menor y promedio.
El botón Borrar limpia todo el contenido del GUI.
Ejemplo 2:
Diseñe una clase administradora con soporte para una lista tipo cola de objetos tipo
Persona considerando la siguiente GUI:
this.peso=peso;
}
// métodos get-set
}
Ejemplo 3
public ListaDobleEmpleados(){
lista = new LinkedList<Empleado>();
}
// métodos de administración
public int tamaño(){ return lista.size(); }
public Empleado obtiene(int i){ return lista.get(i);}
Ejemplo 4
Diseñe la clase TV con los siguientes atributos: serie (cadena), marca (entero), tamaño
en pulgadas (entero), precio en dólares (real). Considere un constructor explícito y sus
métodos get/set. Considere un método adicional que devuelve el precio en soles dado
el tipo de cambio como parámetro, y un método adicional que retorne el nombre de la
marca. Considere las siguientes marcas: Sony, LG, Samsung, Panasonic, otro.
Diseñela clase administradora ListaPilaTV, que tenga como atributo privado un objeto
de la clase LinkedList particularizado para la clase TV donde se guardarán los
objetos.
lista.
El botón Reporte muestra el resultado de todos los métodos adicionales.
El botón AumentaPrecio aplica el resultado del método c) y muestra el
resultado del botón Lista.
El botón Borrar limpia todo el contenido del GUI.
SEMANA 04
EVALUACIÓN
SEMANA 05
HERENCIA
En programación sucede lo mismo, por ejemplo: Existiendo una clase Fecha (clase
Padre) cuya funcionalidad soporta un formato de presentación DD/MM/AA, se puede
construir una nueva clase FechaM (clase Hija) cuya funcionalidad soporte más
formatos de presentación como DD/NOMBRE DEL MES/AAAA, AA/MM/DD, etc.
Cuando uno va a desarrollar por primera vez una clase y piensa que con el tiempo se
podría utilizar como clase Padre, entonces el nivel de acceso a sus atributos deja de
ser prívate y se debe considerar como protected ya que sigue permitiendo el
encapsulamiento pero además dispone su acceso directo de todas sus clases
descendientes. En cambio, cuando la clase que se va a heredar ya existe con un nivel
de acceso prívate para sus atributos, entonces la clase hija tiene que utilizar la
funcionalidad pública de acceso a sus atributos.
La clase Hija puede tener métodos con el mismo nombre que algún método de la
clase Padre. Para diferenciar su invocación al método de la clase Padre se le
antepone la palabra reservada super.
Ejemplo 1
Considere la existencia de la clase TV desarrollada anteriormente y diseñe una nueva
clase hija de nombre TVH, aplicando herencia, considerando los siguientes atributos
protegidos adicionales: origen(entero), tecnología(entero). Considere para el campo
origen: nacional, americano, japonés, koreano, chino, otro. Considere para el campo
tecnología: Tradicional, LCD, Plasma, Digital. Considere métodos adicionales para que
retornen el nombre del origen y el nombre de la tecnología.
La nueva clase hija debe ser utilizada para el proceso de la siguiente GUI:
// constructor explícito
public TVH(String serie, int marca, int tamaño, double precio, int
origen, int tecnologia){
// invocación al constructor de la clase Padre
super(serie, marca, tamaño, precio);
// métodos get-set
public int getOrigen() {
return origen;
}
public void setOrigen(int origen) {
this.origen = origen;
}
public int getTecnologia() {
return tecnologia;
}
public void setTecnologia(int tecnologia) {
this.tecnologia = tecnologia;
}
// metodos adicionales
public String nombreOrigen(){
switch(origen){
case 1: return "Nacional";
case 2: return "Americano";
case 3: return "Japonés";
case 4: return "Koreano";
case 5: return "Chino";
default: return "Otro";
}
}
public String nombreTecnologia(){
switch(tecnologia){
case 1: return "Tradicional";
case 2: return "LCD";
case 3: return "Plasma";
default: return "Digital";
}
}
}// fin de la clase hija
La nueva clase hija tiene sus atributos con nivel de acceso protected porque
estamos previniendo que ésta sea heredada por otras clases.
Ejemplo 2
La nueva clase hija debe ser utilizada para el proceso de la siguiente GUI:
42
PROGRAMACIÓN I
Ejemplo 3
Diseñe una clase padre de nombre PuntoP cuyos atributos sean las coordenadas x,y
de su ubicación en el plano. Considere un constructor con parámetros, la funcionalidad
de acceso a sus atributos y un método adicional que retorne la distancia desde su
ubicación hasta el punto de origen. Luego, diseñe una clase hija de nombre PuntoE
que herede a la clase PuntoP y considere un atributo adicional para la coordenada z
de su ubicación en el espacio. Considere un constructor con parámetros, la
funcionalidad de acceso a su atributo y un método adicional que retorne la distancia
desde su ubicación hasta el punto de origen. Considere una clase de GUI donde utilice
objetos de ambas clases para mostrar su información.
PROGRAMACIÓN I
Ejemplo 4
Diseñe la clase ListaPilaTVH, que administre una lista tipo pila de objetos tipo TVH y
que considere los siguientes métodos adicionales:
a) Incremente el precio de todos los televisores en 8%
Ejemplo 5
Diseñe la clase ListaColaPersonasH, que administre una lista tipo cola de objetos
tipo PersonaH y que considere los siguientes métodos adicionales:
a) Incremente el peso de todas las personas en 5%
b) Incremente el peso de las personas cuyo peso actual sea inferior a un valor
dado como parámetro.
c) Disminuya el peso de las personas cuyo peso actual esté en un rango dado
como parámetro.
e) Retorne en un arreglo las personas cuya edad sea superior a un valor dado
como parámetro.
SEMANA 06
HERENCIA
Vamos a tomar como clase padre a una clase administradora, heredamos toda su
funcionalidad y a la clase hija le agregamos la funcionalidad que permita grabar en el
archivo y leer desde el archivo.
Antes de aplicar dicha herencia, debemos reconocer las clases ya existentes que nos
van a facilitar operar en un archivo según el proceso que queramos.
Para leer los datos del archivo hacia el objeto ArrayList o LinkedList utilizaremos las
siguientes clases: FileReader, BufferedReader, StringTokenizer.
ArrayList o LinkedList
Archivo de texto
Lee una línea del archivo
Descompone los datos
Crea nuevo objeto
Lo guarda en el objeto
ArrayList o LinkedList
ArrayList o LinkedList
Archivo de texto
Ejemplo 1
// constructor
public ArchivoTVH(String nombre){
super();
this.nombre=nombre;
lee();
Ejemplo 2
Sobrecarga de métodos
Por ejemplo, si existiera un método que suma dos números enteros que recibe como
parámetros, tendría la siguiente declaración:
public int suma(int a, int b)
a.add(t);
}
public void agrega(String serie, int marca, int tamaño, double precio,
int origen, int tecnologia){
a.add(new TVH(serie, marca,tamaño,precio,origen,tecnologia));
}
SEMANA 07
EVALUACION
SEMANA 08
EVALUACION INTEGRAL
SEMANA 09
POLIMORFISMO
Polimorfismo
Es una de las características fundamentales para cualquier lenguaje orientado a
Objetos, La derivación de su significado: Poli = Multiple, morfismo= Formas, implica
que Objetos de la misma clase pueden tomar diversas formas de comportamiento.
Por ejempo, el comportamiento de una figura puede ser el de un círculo o el de un
triángulo dado que ambas son figuras. Igualmente, el comportamiento de un
instrumento puede ser el de una guitarra o el de un piano o el de un saxofón dado
que todos ellos son instrumentos.
El poder manipular un Objeto como si éste fuera de un tipo genérico otorga mayor
flexibilidad al momento de programar con Objetos. Observe el siguiente fragmento de
código:
Figura a = new Circulo();
Figura b = new Triangulo();
Casting
El término "Casting" viene de la palabra "Cast" que significa Molde, por lo que el
termino literal es Hacer un Molde. En Polimorfismo se lleva a cabo este proceso de
"Casting" en dos sentidos: hacia arriba (up-custing) o hacia abajo (down-custing).
Cuando la relación es up-custing el proceso es implícito y no requiere aplicar el molde.
Por ejemplo, un círculo es una figura y un triangulo también es una figura por tanto no
requieren molde. Sin embargo cuando la relación es down-custing el proceso requiere
aplicar un molde que lo represente. Por ejemplo, una figura requiere el molde de un
circulo para utilizar su propia funcionalidad específica. Asimismo, una figura requiere el
molde de un triangulo para utilizar su propia funcionalidad.
Clases Abstractas
Son clases Padre donde se consideran métodos que aún no se conoce su desarrollo.
Recién se conocerá en alguna clase Hija. A éstos métodos se les conoce como
métodos abstractos y utilizan la palabra reservada abstract para su identificación.
Cuando una Clase Padre contiene por lo menos un método abstracto se le conoce
como Clase Abstracta y también debe estar precedía por la palabra reservada
abstract.
Estas clases pueden tener además métodos no abstractos que invoquen a métodos
abstractos si lo necesitan para definir un comportamiento. Sin embargo, no se puede
Las clases Hija deben desarrollar todos los métodos abstractos de la clase Padre.
Además, la clase Hija puede redefinir cualquier método de la clase Padre, con el
mismo nombre. Incluso pueden utilizar la palabra reservada super para referirse a
cualquier método del mismo nombre que esté definido en la clase Padre.
Ejemplo 1
Diseñe una clase abstracta de nombre Figura que tenga un atributo protegido para el
nombre de la figura, métodos get-set, métodos abstractos para el area() y el
perimetro() y un método no abstracto que retorne la información correspondiente al
nombre, area y perímetro de cualquier figura.
Aplique polimorfismo y diseñe una clase hija de nombre Circulo que tenga un atributo
para el radio, constructor, métodos get-set y desarrollo de los métodos abstractos de la
clase padre. Luego diseñe una clase hija de nombre Cuadrado que tenga un atributo
para el lado, constructor, métodos get-set, y desarrollo de los métodos abstractos de la
clase padre.
// método no abstracto
public String info(){
return "Figura\t: "+nombre+"\n"+ "Area\t: "+ area()+"\n"+
"Perímetro\t: "+perimetro();
}
}
Ejemplo 2
Diseñe una clase abstracta de nombre Empleado que tenga atributos protegidos para
el nombre, apellidos, dni, métodos get-set, métodos abstractos para ingresos(),
bonificaciones(), descuentos(), un método no abstracto que retorne el sueldoNeto() y
otro método no abstracto que retorne la información correspondiente al nombre,
apellidos, dni, ingresos, bonificaciones, descuentos, sueldo neto de cualquier
empleado.
Ejemplo 3:
Diseñe la clase abstracta Celular con los siguientes atributos: número, dueño, precio,
marca (1=samsung, 2=htc, 3=lg, 4=otro). Considere un método abstracto para el
cálculo del impuesto. Considere un método no abstracto para que retorne el número,
dueño, nombre de marca y monto de impuestos. Asuma los métodos get-set, no los
desarrolle.
Ejemplo 4:
Diseñe una clase abstracta de nombre Vehiculo con los siguientes atributos: placa,
marca, precio. Con el siguiente método no abstracto: info() que retorna, en una cadena
los siguientes datos tabulados: placa, marca, precio, impuesto. Considere que el
monto del impuesto depende del precio y del tipo de vehículo que sea.
Aplique polimorfismo y diseñe una clase hija de nombre Automovil cuyo monto de su
impuesto es el 13% de su precio si éste supera los 10,000 dólares y 9% en caso
contrario. Diseñe otra clase hija de nombre Camion cuyo monto de su impuesto es el
21% de su precio si éste supera los 20,000 dólares y 7% en caso contrario.
SEMANA 10
POLIMORFISMO
Ejemplo 1
Considere la existencia de la clase abstracta de nombre Figura, las clases hijas
Cuadrado y Circulo.
public ArregloFiguras(){
coleccion = new ArrayList<Figura>();
}
// métodos de administración
public void agrega(Figura f){
coleccion.add(f);
}
public Figura obtiene(int i){
return coleccion.get(i);
}
public int tamaño(){ return coleccion.size();}
Ejemplo 2
Considere la existencia de la clase abstracta de nombre Empleado, las clases hijas
EmpleadoVendedor y EmpleadoPermanente.
Ejemplo 3
Considere la existencia de la clase abstracta de nombre Celular, las clases hijas
CelularSmart y Celular4G.
Ejemplo 4:
Considere la existencia de la clase abstracta de nombre Vehiculo, las clases hijas
Automovil y Camion.
SEMANA 11
EVALUACIÓN
SEMANA 12
POLIMORFISMO
Colecciones de objetos y persistencia con archivos de texto
En esta parte utilizaremos archivos de texto para guardar los datos de los objetos
polimórficos que se encuentren en las colecciones.
Ejemplo 1
Considere la existencia de la clase ColeccionFiguras desarrollada anteriormente y
aplique herencia desarrollando la clase ArchivoFiguras que permita conservar la
información de las figuras en un archivo de texto.
}
pw.close();
}catch(Exception ex){ }
}
public void lee(){
try{
FileReader fr = new FileReader(nombre);
BufferedReader br = new BufferedReader(fr);
String linea = br.readLine();
while(linea!=null){
StringTokenizer st =new StringTokenizer(linea,"/");
int tipo=Integer.parseInt(st.nextToken());
if(tipo==1){ // circulo
double radio=Double.parseDouble(st.nextToken());
Figura a=new Circulo(radio);
agrega(a);
}else{// cuadrado
double lado=Double.parseDouble(st.nextToken());
Figura b=new Cuadrado(lado);
agrega(b);
}
linea=br.readLine();
}
br.close();
}catch(Exception ex){}
}
}
Ejemplo 2
Considere la existencia de la clase ColeccionEmpleados desarrollada anteriormente
y aplique herencia desarrollando la clase ArchivoEmpleados que permita conservar
la información de los empleados en un archivo de texto.
Ejemplo 3
Considere la existencia de la clase ColeccionCelulares desarrollada anteriormente y
aplique herencia desarrollando la clase ArchivoCelulares que permita conservar la
información de los celulares en un archivo de texto.
Ejemplo 4
Considere la existencia de la clase ColeccionVehiculos desarrollada anteriormente y
aplique herencia desarrollando la clase ArchivoVehiculos que permita conservar la
información de los vehiclos en un archivo de texto.
SEMANA 13
Cuando instalamos JDK (Java Development Kit) automáticamente se instala esta API
(JDBC) y con ella en forma muy sencilla podemos hacer consultas, mantenimientos y
todo tipo de transacciones a una base de datos.
Damos clic derecho en la nueva conexión creada y elegimos Query Database para
llegar a la siguiente ventana:
Escribimos el nombre del esquema (dbempleados) y damos clic en el botón Apply para
llegar a la siguiente ventana:
Damos clic en Open Connection to Start Querying para llegar a la siguiente ventana
donde escribimos el nombre del esquema (dbempleados):
Damos clic en el botón OK, ingresamos el password para llegar a la siguiente ventana:
Damos clic en el botón Next hasta finalizar. Vamos al inicio del Workbench para
verificar que se ha creado la conexión y la instancia del servidor:
Ahora vamos a la ficha Services para conectar el servidor localhost que inicialmente
está desconectado:
Para conectarlo, le damos clic derecho y elegimos Connect para que quede asi:
(Observe que nuestra base de datos creada en Workbench (dbempleados) ya es
reconocida ):
Ahora, vamos a crear una aplicación con un formulario para hacer el mantenimiento de
la tabla de empleados considerando el siguiente diseño:
SEMANA 14
INTRODUCCIÓN A BASE DE DATOS
Métodos comlementarios:
Ejecute su aplicación:
SEMANA 15
EVALUACIÓN
SEMANA 16
EXPOSICION DE PROYECTO
SEMANA 17
EVALUACION INTEGRAL
SEMANA 01
GUIA DE LABORATORIO 1
Ejercicio 1
Cada vez que hace clic en el botón Nuevo debe crear un objeto de la clase Producto
y mostrar la información de sus atributos. Cada vez que hace clic en el botón Borrar
debe borrar la información del área de texto, de las cajas de texto y enfocar el ingreso
en la caja de texto del código.
}
private String leeCodigo(){return txtCodigo.getText();}
private String leeDescripcion(){return txtDescripcion.getText();}
private double leePrecio(){return Double.parseDouble(txtPrecio.getText());}
private void lista(Producto p){
imprime("Codigo\t:"+p.getCodigo());
imprime("Descripcion\t:"+p.getDescripcion());
imprime("Precio\t:"+p.getPrecio());
}
private void imprime(String s){
txtSalida.append(s+"\n");
}
Ejecute su aplicación.
Ejercicio 2
Clic derecho en el paquete creado, elegimos New Java Class y escribimos el nombre
Persona y escribimos lo siguiente:
Ahora, vamos a utilizar NetBeans para que genere, automáticamente, los métodos
get/set. Clic derecho en la clase creada, elegimos Refactor, Encapsulate Fields y
nos aparece la siguiente ventana donde seleccionamos todo ( Select All).
En Javadoc elegimos none para evitar los comentarios que genera NetBeans y por
último hacemos clic en el botón Refactor. Ver los métodos get-set generados
Cada vez que hace clic en el botón Nuevo debe crear un objeto de la clase Persona y
mostrar la información de sus atributos. Cada vez que hace clic en el botón Borrar
debe borrar la información del área de texto, de las cajas de texto y enfocar el ingreso
en la caja de texto de nombres.
Ejecute su aplicación.
Ejercicio 3
Cada vez que hace clic en el botón Nuevo debe crear un objeto de la clase TV y
mostrar la información de sus atributos además de su precio en soles considerando un
tipo de cambio actual. Cada vez que hace clic en el botón Borrar debe borrar la
información del área de texto, de las cajas de texto y enfocar el ingreso en la caja de
texto de serie.
nuevo.setPrecio(leePrecio());
lista(nuevo);
}
private String leeSerie(){return txtSerie.getText();}
private int leeMarca(){return cboMarca.getSelectedIndex();}
private int leeTamaño(){return Integer.parseInt(txtTamaño.getText());}
private double leePrecio(){return Double.parseDouble(txtPrecio.getText());}
private void lista(TV t){
imprime("Nro. Serie\t:"+t.getSerie());
imprime("Marca\t:"+t.nombreMarca());
imprime("Tamaño\t:"+t.getTamaño());
imprime("Precio us$\t:"+t.getPrecio());
imprime("Precio S/.\t:"+t.precioSoles(2.85));
imprime("----------------------------------");
}
private void imprime(String s){
txtSalida.append(s+"\n");
}
Ejecute su aplicación.
Ejercicio 4
Ejecute su aplicación.
SEMANA 02
GUIA DE LABORATORIO 2
Ejercicio 1:
Cree un proyecto nuevo de nombre P02E01. Cree un paquete nuevo de nombre
p02e01. Diseñe una clase administradora para un arreglo de objetos de tipo Producto
considerando la siguiente GUI:
Diseñe la clase Producto con constructor explícito y genere los métodos get-set:
public class Producto {
// atributos privados
private String codigo, descripcion;
private double precio;
// constructor
public Producto(String codigo, String descripcion, double precio){
this.codigo=codigo;
this.descripcion=descripcion;
this.precio=precio;
}
// métodos get-set
// constructor explícito
public ArregloProductos(){
a = new ArrayList<Producto>();
}
// métodos de administración
public int tamaño(){ return a.size(); }
public void agrega(Producto p){
a.add(p);
}
public Producto obtiene(int i){ // retorna un producto de la posición i
return a.get(i);
}
public void actualiza(Producto p, int i){
// reemplaza un producto
a.set(i, p);
}
// retorna la posición de un producto según su código.
public int busca(String codigo){
for(int i=0; i<tamaño(); i++){
if(obtiene(i).getCodigo().equals(codigo))
return i;
}
return -1; // no lo encontró
}
public void elimina(int p){// elimina el producto de la posición p
a.remove(p);
}
public double mayorPrecio(){// retorna el mayor precio
double m=a.get(0).getPrecio();
for(Producto p: a){ // for each: por cada producto p en a
if(p.getPrecio() > m)
m =p.getPrecio();
}
return m;
}
public double menorPrecio(){// retorna el menor precio
double m=a.get(0).getPrecio();
for(Producto p: a){ // for each: por cada producto p en a
if(p.getPrecio() < m)
m =p.getPrecio();
}
return m;
}
public double precioPromedio(){// retorna el precio promedio
double suma=0;
for(Producto p: a){ // for each: por cada producto p en a
suma += p.getPrecio();
}
return suma / tamaño();
}
} // fin de la clase ArregloProductos
Ejercicio 2:
// constructor explícito
public Persona(String dni, String nombres, String apellidos, int edad,
double peso){
this.dni=dni;
this.nombres=nombres;
this.apellidos=apellidos;
this.edad=edad;
this.peso=peso;
}
// métodos get-set
}
Ejercicio 3
Diseñe la clase TV con los siguientes atributos: serie (cadena), marca (entero), tamaño
en pulgadas (entero), precio en dólares (real). Considere un constructor explícito y sus
métodos get/set. Considere un método adicional que devuelve el precio en soles dado
el tipo de cambio como parámetro, y un método adicional que retorne el nombre de la
marca. Considere las siguientes marcas: Sony, LG, Samsung, Panasonic, otro.
Diseñela clase administradora ArregloTV, que tenga como atributo privado un objeto
de la clase ArrayList particularizado para la clase TV donde se guardarán los objetos.
Ejercicio 4
e) Retorne en un arreglo los productos cuya descripción empiece con una letra
dada como parámetro.
Ejercicio 5
b) Incremente el peso de las personas cuyo peso actual sea inferior a un valor
dado como parámetro.
c) Disminuya el peso de las personas cuyo peso actual esté en un rango dado
como parámetro.
e) Retorne en un arreglo las personas cuya edad sea superior a un valor dado
como parámetro.
Ejercicio 6
SEMANA 03
GUIA DE LABORATORIO 3
Ejercicio 1:
Cree un proyecto nuevo de nombre P03E01. Cree un paquete nuevo de nombre
p03e01. Diseñe una clase administradora para una lista tipo pila de objetos de tipo
Producto considerando la siguiente GUI:
Diseñe la clase Producto con constructor explícito y genere los métodos get-set:
public class Producto {
// atributos privados
private String codigo, descripcion;
private double precio;
// constructor
public Producto(String codigo, String descripcion, double precio){
this.codigo=codigo;
this.descripcion=descripcion;
this.precio=precio;
}
// métodos get-set
}
// constructor explícito
public ListaProductos(){
pila = new LinkedList<Producto>();
}
// métodos de administración
public int tamaño(){ return pila.size(); }
public void agrega(Producto p){
pila.addFirst(p);
}
public Producto obtiene(int i){ // retorna un producto de la posición i
return pila.get(i);
}
// retorna la posición de un producto según su código.
public int busca(String codigo){
for(int i=0; i<tamaño(); i++){
if(obtiene(i).getCodigo().equals(codigo))
return i;
}
return -1; // no lo encontró
}
public void elimina(){// elimina el primer producto de la pila
pila.removeFirst();
}
public double mayorPrecio(){// retorna el mayor precio
double m=pila.get(0).getPrecio();
for(Producto p: pila){ // for each: por cada producto p en pila
if(p.getPrecio() > m)
m =p.getPrecio();
}
return m;
}
public double menorPrecio(){// retorna el menor precio
double m=pila.get(0).getPrecio();
for(Producto p: pila){ // for each: por cada producto p en pila
if(p.getPrecio() < m)
m =p.getPrecio();
}
return m;
}
public double precioPromedio(){// retorna el precio promedio
double suma=0;
for(Producto p: pila){ // for each: por cada producto p enpil a
suma += p.getPrecio();
}
return suma / tamaño();
}
} // fin de la clase ListaPilaProductos
Ejercicio 2:
Cree un proyecto nuevo de nombre P03E02. Cree un paquete nuevo de nombre
p03e02. Diseñe una clase administradora para una lista tipo cola de objetos tipo
Persona considerando la siguiente GUI:
Ejercicio 3
public ListaDobleEmpleados(){
lista = new LinkedList<Empleado>();
}
// métodos de administración
public int tamaño(){ return lista.size(); }
public Empleado obtiene(int i){ return lista.get(i);}
Ejercicio 4
Cree un proyecto nuevo de nombre P03E04. Cree un paquete nuevo de nombre
p03e04. Diseñe la clase TV con los siguientes atributos: serie (cadena), marca
(entero), tamaño en pulgadas (entero), precio en dólares (real). Considere un
constructor explícito y sus métodos get/set. Considere un método adicional que
devuelve el precio en soles dado el tipo de cambio como parámetro, y un método
adicional que retorne el nombre de la marca. Considere las siguientes marcas: Sony,
LG, Samsung, Panasonic, otro.
Diseñela clase administradora ListaPilaTV, que tenga como atributo privado un objeto
de la clase LinkedList particularizado para la clase TV donde se guardarán los
objetos.
Diseñe la GUI Principal donde considere como atributo un objeto de tipo ListaPilaTV y
programe la acción de los botones de acuerdo a lo siguiente:
El botón Nuevo permite registrar un nuevo televisor evitando que se repita la
serie.
El botón Busca ubica un televisor según la serie ingresada y muestra sus datos
donde corresponda.
El botón Modifica reemplaza los datos del televisor ubicado con el botón Busca.
SEMANA 04
EVALUACION
SEMANA 05
GUIA DE LABORATORIO 5
Herencia
Ejercicio 1
Cree un proyecto nuevo de nombre P05E01. Cree un paquete nuevo de nombre
p05e01. Considere la existencia de la clase TV desarrollada anteriormente y diseñe
una nueva clase hija de nombre TVH, aplicando herencia, considerando los siguientes
atributos protegidos adicionales: origen(entero), tecnología(entero). Considere para el
campo origen: nacional, americano, japonés, koreano, chino, otro. Considere para el
campo tecnología: Tradicional, LCD, Plasma, Digital. Considere métodos adicionales
para que retornen el nombre del origen y el nombre de la tecnología.
La nueva clase hija debe ser utilizada para el proceso de la siguiente GUI:
// constructor explícito
public TVH(String serie, int marca, int tamaño, double precio, int
origen, int tecnologia){
// invocación al constructor de la clase Padre
super(serie, marca, tamaño, precio);
// métodos get-set
public int getOrigen() {
return origen;
}
public void setOrigen(int origen) {
this.origen = origen;
}
public int getTecnologia() {
return tecnologia;
}
public void setTecnologia(int tecnologia) {
this.tecnologia = tecnologia;
}
// metodos adicionales
public String nombreOrigen(){
switch(origen){
case 1: return "Nacional";
case 2: return "Americano";
case 3: return "Japonés";
case 4: return "Koreano";
case 5: return "Chino";
default: return "Otro";
}
}
public String nombreTecnologia(){
switch(tecnologia){
case 1: return "Tradicional";
case 2: return "LCD";
case 3: return "Plasma";
default: return "Digital";
}
}
}// fin de la clase hija
Diseñe la GUI Principal donde considere como atributo un objeto de tipo TVH y
programe la acción de los botones de acuerdo a lo siguiente:
Ejercicio 2
Cree un proyecto nuevo de nombre P05E02. Cree un paquete nuevo de nombre
p05e02. Considere la existencia de una clase base de nombre Persona ya
desarrollada anteriormente y diseñe una nueva clase hija de nombre PersonaH,
aplicando herencia, con los siguientes atributos protegidos adicionales: dni (cadena),
email(cadena), foto(cadena).
La nueva clase hija debe ser utilizada para el proceso de la siguiente GUI:
Diseñe la GUI Principal donde considere como atributo un objeto de tipo PersonaH y
programe la acción de los botones.
Ejercicio 3
Ejercicio 4
Ejercicio 5
Cree un proyecto nuevo de nombre P05E05. Cree un paquete nuevo de nombre
p05e05. Diseñe la clase ListaColaPersonasH, que administre una lista tipo cola de
objetos tipo PersonaH y que considere los siguientes métodos adicionales:
a) Incremente el peso de todas las personas en 5%
b) Incremente el peso de las personas cuyo peso actual sea inferior a un valor
dado como parámetro.
c) Disminuya el peso de las personas cuyo peso actual esté en un rango dado
como parámetro.
e) Retorne en un arreglo las personas cuya edad sea superior a un valor dado
como parámetro.
SEMANA 06
GUIA DE LABORATORIO 6
Ejercicio 1
// constructor
public ArchivoTVH(String nombre){
super();
this.nombre=nombre;
lee();
}
}// fin de la clase
Ejercicio 2
Cree un proyecto nuevo de nombre P06E02. Cree un paquete nuevo de nombre
p06e02. Considere la existencia de una clase administradora de nombre
ListaColaPersonasH desarrollada anteriormente. Aplique herencia y desarrolle la
clase hija ArchivoPersonasH donde se consideren métodos para leer y para grabar
en un archivo de texto.
SEMANA 07
EVALUACION
SEMANA 08
EVALUACION INTEGRAL
SEMANA 09
GUIA DE LABORATORIO 9
Polimorfismo
Ejercicio 1
Aplique polimorfismo y diseñe una clase hija de nombre Circulo que tenga un atributo
para el radio, constructor, métodos get-set y desarrollo de los métodos abstractos de la
clase padre. Luego diseñe una clase hija de nombre Cuadrado que tenga un atributo
para el lado, constructor, métodos get-set, y desarrollo de los métodos abstractos de la
clase padre.
// método no abstracto
public String info(){
return "Figura\t: "+nombre+"\n"+ "Area\t: "+ area()+"\n"+
"Perímetro\t: "+perimetro();
}
}
this.lado = lado;
}
// desarrollo de los métodos abstractos
public double area(){ return lado * lado;}
public double perimetro(){ return 4*lado;}
}
Implemente, en la interfaz gráfica de usuario (GUI), lo necesario para la
programación de los botones.
Ejercicio 2
empleado.
Ejercicio 3:
Ejercicio 4:
Aplique polimorfismo y diseñe una clase hija de nombre Automovil cuyo monto de su
impuesto es el 13% de su precio si éste supera los 10,000 dólares y 9% en caso
contrario. Diseñe otra clase hija de nombre Camion cuyo monto de su impuesto es el
21% de su precio si éste supera los 20,000 dólares y 7% en caso contrario.
SEMANA 10
GUIA DE LABORATORIO 10
Ejercicio 1
public ArregloFiguras(){
coleccion = new ArrayList<Figura>();
}
// métodos de administración
public void agrega(Figura f){
coleccion.add(f);
}
public Figura obtiene(int i){
return coleccion.get(i);
}
}
//... complete métodos adicionales
}
Ejercicio 2
Ejercicio 3
Ejercicio 4:
SEMANA 11
EVALUACION
SEMANA 12
GUIA DE LABORATORIO 12
Ejercicio 1
Cree un proyecto nuevo de nombre P12E01. Cree un paquete nuevo de nombre
p12e01. Considere la existencia de la clase ColeccionFiguras desarrollada
anteriormente y aplique herencia desarrollando la clase ArchivoFiguras que permita
conservar la información de las figuras en un archivo de texto.
double lado=Double.parseDouble(st.nextToken());
Figura b=new Cuadrado(lado);
agrega(b);
}
linea=br.readLine();
}
br.close();
}catch(Exception ex){}
}
}
Ejercicio 2
Cree un proyecto nuevo de nombre P12E02. Cree un paquete nuevo de nombre
p12e02. Considere la existencia de la clase ColeccionEmpleados desarrollada
anteriormente y aplique herencia desarrollando la clase ArchivoEmpleados que
permita conservar la información de los empleados en un archivo de texto.
Ejercicio 3
Cree un proyecto nuevo de nombre P12E03. Cree un paquete nuevo de nombre
p12e03. Considere la existencia de la clase ColeccionCelulares desarrollada
anteriormente y aplique herencia desarrollando la clase ArchivoCelulares que
Ejercicio 4
Cree un proyecto nuevo de nombre P12E04. Cree un paquete nuevo de nombre
p12e04. Considere la existencia de la clase ColeccionVehiculos desarrollada
anteriormente y aplique herencia desarrollando la clase ArchivoVehiculos que
permita conservar la información de los vehiclos en un archivo de texto.
SEMANA 13
GUIA DE LABORATORIO 13
Damos clic derecho en la nueva conexión creada y elegimos Query Database para
llegar a la siguiente ventana:
Escribimos el nombre del esquema (dbempleados) y damos clic en el botón Apply para
llegar a la siguiente ventana:
Damos clic en Open Connection to Start Querying para llegar a la siguiente ventana
donde escribimos el nombre del esquema (dbempleados):
Damos clic en el botón OK, ingresamos el password para llegar a la siguiente ventana:
Damos clic en el botón Next hasta finalizar. Vamos al inicio del Workbench para
verificar que se ha creado la conexión y la instancia del servidor:
Ahora vamos a la librería Services para conectar el servidor localhost que inicialmente
está desconectado:
Para conectarlo, le damos clic derecho y elegimos Connect para que quede asi:
(Observe que nuestra base de datos creada en Workbench (dbempleados) ya es
reconocida ):
Ahora, vamos a crear una aplicación con un formulario para hacer el mantenimiento de
la tabla de empleados considerando el siguiente diseño:
SEMANA 14
GUIA DE LABORATORIO 14
Mantenimiento y consultas en una base de datos
Métodos comlementarios:
Ejecute su aplicación:
SEMANA 15
ASESORIA PROYECTO
SEMANA 16
EXPOSICION DE TRABAJOS
SEMANA 17
EVALUACION INTEGRAL
BIBLIOGRAFIA
6. VASQUEZ, J. (2010). Super Java SE for Windows with NetBeans IDE. 2da.
Edición. Perú: Fondo Editorial UCH (Código en Biblioteca: 005.133.V33)
INDICE
BIBLIOGRAFIA, 163 I
C INTRODUCCIÓN, 1
INTRODUCCIÓN A BASE DE DATOS, 67
Casting, 54
Clase administradora, 15
L
Clase ArrayList, 15
Clase LinkedList, 25 Lista de objetos, 25
Clases Abstractas, 54
Colección de objetos polimórficos, 59 M
Conexión a una Base de Datos, 72
Constructores, 6 Mantenimiento y consultas a una base de datos, 77
CONTENIDO, 1 Métodos, 6
Creación de objetos, 7
Creación de una Base de Datos, 67 N
Niveles de acceso, 4
D
Diseño de clases, 5 P
Persistencia con archivos de texto, 63
E Polimorfismo, 53
ENCAPSULAMIENTO, 4, 15 POLIMORFISMO, 53
Programación orientada a objetos, 4
G
S
GUIA DE LABORATORIO 1, 87
GUIA DE LABORATORIO 10, 134 Sobrecarga de métodos, 49
GUIA DE LABORATORIO 12, 139
GUIA DE LABORATORIO 13, 143 U
GUIA DE LABORATORIO 14, 153
GUIA DE LABORATORIO 2, 95 UNIDADES DE APRENDIZAJE, 3
GUIA DE LABORATORIO 3, 104
GUIA DE LABORATORIO 5, 115