Tecnicas de Programacion
Tecnicas de Programacion
DE
PROGRAMACIÓN
TÉCNICAS DE
PROGRAMACIÓN
TÉCNICAS DE PROGRAMACIÓN
Martín Gustavo Salcedo Quiñones
Editado por:
Universidad Católica Los Ángeles de Chimbote
Jr. Tumbes S/N, L8, Centro Comercial Financiero, Chimbote, Ancash - Perú
Telf: (51-043) 327846
www.uladech.edu.pe
Diagramación digital:
Ediciones Carolina (Trujillo).
Introducción 11
Capítulo I
USO Y CREACIÓN DE MÉTODOS, ATRIBUTOS,
RELACIONES ENTRE CLASES Y MODIFICADORES
DE ACCESO
TÉCNICAS DE PROGRAMACIÓN | 7
CONTENIDO
AUTOEVALUACIÓN 141
Capítulo II
HERENCIA, CLASES ABSTRACTAS, INTERFACES,
POLIMORFISMO, PAQUETES Y EXCEPCIONES
9. HERENCIA DE CLASES
9.1 ¿Qué es herencia de clases? 155
9.2. Modificador de acceso protected 157
9.3. Objetos de la superclase y objetos de subclase 157
9.4. Programas resueltos en Java usando NetBeans 160
12. POLIMORFISMO
12.1. ¿Qué es polimorfismo? 203
12.2. Tipos de polimorfismo 212
TÉCNICAS DE PROGRAMACIÓN | 9
CONTENIDO
AUTOEVALUACIÓN 247
Estimado estudiante:
La asignatura Técnicas de Programación se ubica en el II ciclo
según el plan de estudios de la Escuela Profesional de Ingeniería de
Sistemas, facultad de Ingeniería de la Universidad Católica Los Ánge-
les de Chimbote. El curso está desarrollado para que el estudiante logre
la competencia de elaborar aplicaciones a nivel de consola usando la
programación orientado al objeto y como lenguaje de programación
Java a través de la utilización del entorno de desarrollo Netbeans.
Este curso de Técnicas de Programación es de suma importancia
en la línea de la programación ya que sienta las bases para el logro de
desarrollar sistemas informáticos y por estrategia pedagógica se ha
dividido en dos unidades de aprendizaje, las misma que contienen los
temas necesarios para programar pensando en objetos.
La primera unidad, contiene el uso de los métodos de las prin-
cipales clases de Java, la creación y uso de los métodos estáticos,
recursividad de métodos, uso de arreglos en métodos, creación de
clases y sus miembros (atributos y métodos) y posterior instancia de
objetos, utilización de relaciones de clases y uso de modificadores de
nivel de acceso a los miembros de una clase.
La segunda unidad, contiene el uso del operador o palabra
reservada this y manejo de métodos constructores, herencia de cla-
ses, clases abstractas, interfaces, polimorfismo, paquetes y uso de
excepciones y finalmente el desarrollo de una proyecto o aplicación
que abarque lo mayoría de los temas mencionados anteriormente.
TÉCNICAS DE PROGRAMACIÓN | 11
Capítulo I
TÉCNICAS DE PROGRAMACIÓN | 15
MÉTODOS DE CLASES DE JAVA
TÉCNICAS DE PROGRAMACIÓN | 17
MÉTODOS DE CLASES DE JAVA
Comprobaciones booleanas
Character.isLowerCase(c) //devuelve verdadero si el character está en
minúscula
Character.isUpperCase(c) //devuelve verdadero si el character está en
mayúscula
Character.isDigit(c) // devuelve verdadero si el carácter es un dígito numérico
Character.isSpace(c) //devuelve verdadero si el character es un espacio y
falso todo lo contrario
A partir de la variable objeto Character C, no se podría hacer
C.isUpperCase(), porque la variable C no ha sido instanciado con el
predicado new. Instanciarlo permitirá hacer uso de los métodos de la
clase Character
Traslaciones de caracteres
char c1 = Character.toLowerCase( c ); //lo pone en minúscula el contenido
de c y lo almacena en c1
char c2 = Character.toUpperCase( c ); //lo pone en mayúscula el
contenido de c y lo almacena en c2
Traslaciones de carácter/dígito
int i = Character.digit( c,base ); //toma el contenido de c y devuelve el
número para ser almacenado en i
TÉCNICAS DE PROGRAMACIÓN | 19
MÉTODOS DE CLASES DE JAVA
Conversiones de Clase/Cadena
String s = Float.toString( f ); //toma el contenido de f y lo convierte a String y
lo almacena en s
f = Float.valueOf( "3.14" ); //toma el dato de cadena “3.14”, lo convierte a
float y lo almacena en f
Comprobaciones
boolean b = Float.isNaN( f );
boolean b = Float.isInfinite( f );
El método isNaN() comprueba si f es un No-Número . Un ejem-
plo de no-número es raiz cuadrada de -2. El método isInfinite() eva-
lúa si un número específico es infinitamente grande en magnitud
devolviendo verdadero.
Declaraciones
La primera instrucción creará una variable double y la segunda un
objeto Double:
double d;
Double D;
TÉCNICAS DE PROGRAMACIÓN | 21
MÉTODOS DE CLASES DE JAVA
Por ejemplo:
“Computación”, “Java es fácil”, “Viva el Perú”, “ULADECH 2020”
if(nombre1.equalsIgnoreCase(nombre2))
System.out.println(“Los nombres son iguales”);
else
System.out.println(“Los nombres no son iguales”);
¿Por qué?
Compara los primeros caracteres “M” == “M” y sigue adelante
Luego compara los segundos caracteres “a” == ”a” y sigue adelante
TÉCNICAS DE PROGRAMACIÓN | 23
MÉTODOS DE CLASES DE JAVA
c a d e n a 1 . c o m p a re To I g n o re C a s e ( c a d e n a 2 ) : E l m é t o d o
compareToIgnoreCase ignora la diferencia existente entre letras
mayúsculas y minúsculas al momento de realizar la comparación de
la cadena 1 con la cadena2.
Ejemplo:
String dato1=”mariano”;
String dato2=”Mariana”;
if(dato1.compareToIgnoreCase(dato2)>0)
System.out.println(“El dato1 es mayor que el dato2”)
else
if(dato1.comparaToIgnoreCase(dato2)<0)
System.out.println(“El dato 1 es menor que el dato2”);
else
System.out.println(“El dato 1 es igual al dato2”);
Ejemplo:
String nombre=”Fernando”;
String nom=nombre.toUpperCase();
System.out.println(nom);
TÉCNICAS DE PROGRAMACIÓN | 25
MÉTODOS DE CLASES DE JAVA
if(nombre2.starsWith(nombre1))
System.out.println(nombre2+” comienza con “+nombre1);
else
System.out.println(nombre2+” no comienza con “+nombre1);
Ejemplo:
String cadena=”ULADECH es el mejor”;
int indice=cadena.indexOf(“e”,9);
System.out.println(“La expresión “+cadena+” la letra e se encuentra
en la posición “+indice);
TÉCNICAS DE PROGRAMACIÓN | 27
MÉTODOS DE CLASES DE JAVA
Ejemplo:
String cadena=”ULADECH CATÓLICA”;
int indice=cadena.indexOf(“CA”;10);
System.out.println(“La expresión “+cadena+” la última expresión es
se encuentra en la posición “+indice);
TÉCNICAS DE PROGRAMACIÓN | 29
MÉTODOS DE CLASES DE JAVA
Ejemplo:
String cad1 = String.valueOf(12);
String cad2 = String.valueOf(true);
String cad3 = String.valueOf('T');
String cad4 = String.valueOf(12.9867);
Interpretación de la programación:
Al usar import.java.io.*; importamos el paquete io (input output) que
permitirá luego para el ingreso y salida de datos. Tenemos la clase
AreaTriangulo que tienen al método estático llamado main que al
colocar (String args[]) indica que no hay argumento alguno para el
método y al colocar throws IOException son nuestra indicación al
compilador de que estamos conscientes del hecho de que puede
ocurrir una excepción (intercepción de error) de entrada/salida
cuando el programa intente leer del teclado y que deliberadamente
estamos haciendo caso omiso de tales excepciones de entrada/salida
en nuestro programa. Luego se declara las variables base, altura y
TÉCNICAS DE PROGRAMACIÓN | 31
MÉTODOS DE CLASES DE JAVA
Interpretación de la programación:
La novedad en la segunda aplicación es el uso del método pow() que
permite calcular la potencia dado la base y el exponente, así por
ejemplo Math.pow(lado1,2) calcula el cuadrado del contenido de la
variable lado1. Con el método sqrt() se logra calcular la raíz cuadrada
de un número, así por ejemplo Math.sqrt(4) calcula la raíz cuadrada
de 4. Tanto el método pow y el método sqrt son métodos estáticos de
la clase Math lo que permite usarlos directamente de la clase.
TÉCNICAS DE PROGRAMACIÓN | 33
MÉTODOS DE CLASES DE JAVA
TÉCNICAS DE PROGRAMACIÓN | 35
2. CREACIÓN DE MÉTODOS
ESTÁTICOS
Donde:
tipo_de_valor_retorno: Es el tipo de valor que el método retornará
una vez ejecutado las instrucciones elaboradas en el método. Si el
método no retorna valor significa que dicho método deberá ser
declarado como void.
nombre_del_método: Es cualquier expresión válida que permita
identificar al método.
lista_de_parámetros: Es una lista de argumentos o parámetros que
deberán ser separadas por comas donde se establecerán las
TÉCNICAS DE PROGRAMACIÓN | 37
CREACIÓN DE MÉTODOS ESTÁTICOS
int sumaenteros(int n)
{
int i, suma=0;
for(i=1;i<=n;i++)
{
suma=suma+i;
}
return suma;
}
void mostrarMensaje()
{
System.out.println(“ULADECH Católica es lo máximo”);
}
En este caso el método mostrarMensaje no devuelve un valor, es
por eso que el tipo de retorno a colocar es void. Lo único que ejecuta
el método es mostrar un mensaje.
TÉCNICAS DE PROGRAMACIÓN | 39
CREACIÓN DE MÉTODOS ESTÁTICOS
Por ejemplo:
TÉCNICAS DE PROGRAMACIÓN | 41
CREACIÓN DE MÉTODOS ESTÁTICOS
Interpretación de la programación:
Se tiene el método factorial que tiene un solo parámetro de tipo entero
llamado n y que devuelve o retorna un valor de tipo entero. Este
método declara dos variables de tipo entero i y f, éste último con un
valor inicial de 1 para que el cálculo de sucesivas multiplicaciones no
se perjudique. El método factorial es un método estático por lo que no
será necesario crear o instanciar un objeto (recuerda que para
instanciar un objeto se usa el operador new). En el método main se
inicia con crear el objeto leer del tipo BufferedReader (para lectura
de datos), luego se declara una variable n de tipo n (recuerda que esta
variable no es el mismo del parámetro del método factorial ya que se
declara en otro método). A través de la sentencia repetitiva do se
busca validar el ingreso del valor para la variable n que debe ser un
valor positivo, si es negativo volverá a solicitar el ingreso de otro
valor para la variable n. Finalmente la instrucción
System.out.println("el Factorial de “+n+” es: "+factorial(n));
imprimirá el factorial de n haciendo uso del método factorial.
Interpretación de la programación:
El método estático mcd posee dos parámetros a y b que servirá para
almacenar los datos numéricos enteros, de los cuales se aplicará el
TÉCNICAS DE PROGRAMACIÓN | 43
CREACIÓN DE MÉTODOS ESTÁTICOS
Interpretación de la programación:
El método estático mensaje imprime una expresión en línea según el
contenido de la variable de memoria m, como no retorna valor alguno
el método se le antepone a su nombre la palabra void. El método
estático reporteDivisores evalúa los posibles divisores desde del
valor 1 hasta el valor del número del cual se esta sacando los
divisores, para esto es necesario hacer uso de una sentencia repetitiva
como for que evalúa cada posible divisor y si cumple que no hay
residuo imprime el divisor seguido de un espacio para el posible
siguiente divisor. Este método reporteDivisores como no retorna
valor alguno se hace uso de la expresión void antes del nombre del
método. Finalmente, en el método estático main, que significa
principal, se alista la variable objeto leer para lectura de datos, se pide
el ingreso del número, validando que sea un número entero positivo y
luego se hace uso del método reporteDivisores dando como valor al
parámetro lo que almacena la variable num.
Ejecución del programa:
TÉCNICAS DE PROGRAMACIÓN | 45
CREACIÓN DE MÉTODOS ESTÁTICOS
TÉCNICAS DE PROGRAMACIÓN | 47
CREACIÓN DE MÉTODOS ESTÁTICOS
TÉCNICAS DE PROGRAMACIÓN | 49
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
Por ejemplo:
public static int sumaParesRecursivo(int n)
{
if(n ==0)
return 0;
else
return n*2+sumaParesRecursivo(n-1);
}
TÉCNICAS DE PROGRAMACIÓN | 51
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
Por ejemplo:
import java.io.*;
public class sobrecargaMetodos{
TÉCNICAS DE PROGRAMACIÓN | 53
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
Interpretación de la programación:
El método recursivo llamado factorial tiene un parámetro de tipo
entero llamado n. Se evalúa su valor si es igual cero usando la
sentencia IF, si es falso se retorna el valor de n multiplicado con lo
que retornará el método factorial al darle el valor de n disminuido
en 1.
Retorna 24
factorial(4)
Retorna 6
4 * factorial(4-1)
Llamada 1
Retorna 2
3 * factorial(3-1)
Llamada 2
Retorna 1
2 * factorial(2-1)
Llamada 3
1 * factorial(1-1)
Llamada 4
TÉCNICAS DE PROGRAMACIÓN | 55
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
Interpretación de la programación:
El programa está compuesto por tres métodos estáticos: el primero
llamado mensaje que es un método no recursivo, el segundo llamado
potencia que es un método recursivo y el tercero llamado main
(principal) que hace uso de los dos métodos anteriores. El método
recursivo llamado método evalúa a través de una sentencia de
selección if si el exponente es 0 y si no lo es entonces retorna el valor
de la base x multiplicado por la ejecución nuevamente del método
TÉCNICAS DE PROGRAMACIÓN | 57
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
Interpretación de la programación:
En este programa se crea dos métodos de lectura de datos, uno para
leer un dato de tipo entero y otro método para leer dato de tipo real.
Además, se tiene dos métodos con el mismo nombre llamados
sueldoNeto (sobrecarga de métodos), el primero con tres parámetros
para calcular el sueldo neto de un administrativo y el segundo con dos
parámetros para calcular el sueldo neto de un docente. En el método
main, se solicita primero indicar si el trabajador es de tipo
TÉCNICAS DE PROGRAMACIÓN | 59
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 61
RECURSIVIDAD Y SOBRECARGA DE MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 63
4. ARREGLOS UNIDIMENSIONALES
EN MÉTODOS
Por ejemplo:
numeros 45 38 12 56 42
índice 0 1 2 4 5
TÉCNICAS DE PROGRAMACIÓN | 65
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
Ejemplo:
int numeros [] = { 1, 2, 3, 4, 5};
boolean arreglo[] = { true, false, true, true};
String meses[] = { “Enero”, ”Febrero”, ”Marzo”, ”Abril”,
”Mayo”, “Junio”};
TÉCNICAS DE PROGRAMACIÓN | 67
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
import java.io.*;
public class ReferenciandoArreglos{
public static void main(String args[])
{
int pares[] = {2, 4, 6, 8,10};
int impares[] = {1, 3, 5, 7, 9, 11};
int arreglo[];
arreglo=pares;
System.out.println("Primer Arreglo de Numeros Pares");
A
for(int i=0;i<arreglo.length;i++)
System.out.println(arreglo[i]); 1
arreglo=impares;
System.out.println(”SegundoArreglo de Números Impares");
B
for(int i=0;i<arreglo.length;i++)
System.out.println(arreglo[i]);
}
}
TÉCNICAS DE PROGRAMACIÓN | 69
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
par=par+2;
pares[i]=par;
}
return pares;
}
TÉCNICAS DE PROGRAMACIÓN | 71
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
Interpretación de la programación:
En el método main se inicia creando el objeto leer del tipo
BuffreredReader, luego se declara variables de memoria de tipo
double. Se aprecia la variable numeros[] que es una arreglo o vector
que todavía no se define el tamaño o el número de elementos. Luego se
declara dos variables enteras n, i. A través de la sentencia repetitiva se
valida el valor de n dentro de un rango de 1 a 100, es decir, no se acepta
un valor menor o igual a 0 ni un número mayor de 100. Posteriormente
se crea el arreglo números con la instrucción números=new double[n];
ya que se define el tamaño del arreglo números con el valor de la
variable n. A continuación, se usa la sentencia for que permite leer los
datos para cada elemento del arreglo, la misma va desde un valor de 0
hasta i<n, es decir, si n es igual a 10 entonces la variable i irá desde 0
hasta 9. En cada interacción solicitará el ingreso de un número, la
misma que se almacenará en el elemento correspondiente del arreglo.
Cabe señalar que el objeto leer con su método readLine() lee el dato
como cadena (String) entonces existe la necesidad de hacer la
conversión, para ello se usa el método parseDouble de la clase Double
que permite convertir el dato ingresado en valor numérico double.
Luego se imprime los valores ingresados usando nuevamente la
sentencia for. Para el cálculo del mayor y menor número ingresados en
el arreglo vector se inicializa las variables con la instrucción
mayor=números[0], menor=números[0]; donde la variable mayor y la
variable menor recibe el valor del primer elemento del arreglo x. A
continuación, con la sentencia for se recorre por cada elemento del
arreglo números desde el segundo elemento hasta el último elemento
del arreglo. En cada interacción se usa la sentencia IF para evaluar si el
elemento es mayor a la variable mayor, si es verdadero se cambia el
valor contenido en la variable mayor por el valor del elemento en
evaluación, si es falso se cambia el valor del contenido en la variable
menor. Posteriormente a través de otra sentencia for se procede a
realizar la suma de todos los números contenidos en el arreglo y se va
acumulando en la variable suma, que previamente se inicializó con el
valor de cero. A continuación, se calcula el promedio y se muestra los
resultados obtenidos.
TÉCNICAS DE PROGRAMACIÓN | 73
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
Interpretación de la programación:
El programa tenía un solo método main y ahora tiene 8 métodos
estáticos más. Se establece un método mensaje para imprimir cualquier
expresión de cadena de caracteres, el método leerDatoEntero() sirve
para la lectura de un dato de tipo entero, el método leerDatoReal() sirve
para la lectura de un dato de tipo real, el método leerDatosArreglo()
sirve para el llenado de un arreglo de tipo double, el método
mostrarDatosArreglo() sirve para imprimir los datos almacenados en
un arreglo de tipo double, el método mayorNumeroArreglo() permite
calcular el número mayor de los números almacenados en el arreglo, el
método menorNumeroArreglo() permite calcular el número menor de
los números guardados en el arreglo y el método
sumaNumerosArreglo() permite calcular la suma de todos los números
almacenados en el arreglo de tipo double.
TÉCNICAS DE PROGRAMACIÓN | 75
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
Interpretación de la programación:
La novedad en esta programación es el método arregloInvertido()
dado que busca invertir los valores del arreglo haciendo que el último
valor ubicado en el último elemento del arreglo sea el primero, En el
proceso de cambio de datos es necesario el uso de la variable
temporal temp para salvar el dato a mover y luego colocar en la
posición correspondiente. Los demás métodos se han usado de
manera similar en el programa anterior.
TÉCNICAS DE PROGRAMACIÓN | 77
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 79
ARREGLOS UNIDIMENSIONALES EN MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 81
5. ESTRUCTURA DE UNA CLASE:
ATRIBUTOS Y MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 83
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
Rectangulo
base: double
altura: double
Rectangulo()
setBase(): void
setAltura(): void
getBase(): double
getAltura(): double
area(): double
perímetro(): double
diagonal(): double
toString(): String
import java.io.*;
class Rectángulo
{
private double base;
private double altura;
TÉCNICAS DE PROGRAMACIÓN | 85
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
double b, h;
Rectangulo R;
System.out.print("Ingrese el valor de la base : ");
b=Double.parseDouble(br.readLine());
System.out.print("Ingrese el valor de la altura : ");
h=Double.parseDouble(br.readLine());
R = new Rectangulo(b,h);
System.out.println("Rectangulo : "+R);
System.out.println("Area : "+R.area());
System.out.println(“Perimetro : “+R.perimetro());
System.out.println("Diagonal : "+R.diagonal());
}
}
TÉCNICAS DE PROGRAMACIÓN | 87
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
Cilindro
radio: double
altura: double
Cilindro()
setRadio(): void
setAltura(): void
getRadio(): double
getAltura(): double
area(): double
volumen(): double
toString(): String
TÉCNICAS DE PROGRAMACIÓN | 89
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
Interpretación de la programación:
Se crea clase Cilindro con los atributos radio y altura de tipo double.
Luego se crea el método constructor Cilindro que permite establecer
los valores de los dos atributos a través de los parámetros r y a. Luego
se construye los métodos setRadio() y setAltura() que permite
cambiar el valor del atributo radio y altura respectivamente. Con los
métodos getRadio() y getAltura() se obtiene el contenido del
atributo radio y altura respectivamente. Con los métodos area() y
volumen() se calcula el área y el volumen del cilindro. El método
toString() permite imprimir el radio y la altura del cilindro según el
contenido de los atributos.
Con la clase ProbandoCilindro, se tiene el método mensaje para
imprimir una cadena de texto y el método leerDatoReal para la
lectura de datos de tipo real. En el método main, se declara las
variables de memoria r y h de tipo double y se declara la variable C
del tipo de la clase Cilindro. Se ingresa los valores del radio y de la
altura. Luego en la instrucción C = new Cilindro(r,h); se crea el objeto
C (que previamente había sido declarado Cilindro C;) haciendo uso
del método constructor Cilindro pasando los valores ingresados del
radio y la altura a través de las variables de memoria r y h. A
continuación, con la instrucción mensaje("Cilindro : "+C+"\n"); se
imprime la expresión “Cilindro:” con lo programado en el método
toString(), es decir, es lo mismo colocar C que colocar C.toString().
Finalmente se imprime el área y el volumen del cilindro usando los
métodos no estáticos area() y volumen() invocados desde el objeto
C.
Ejecución del programa:
2) Crear una clase Producto que tenga los atributos nombre, stock y
preciounitario, que permita calcular el inventario (stock *
preciounitario). Desarrollar un programa que permita el ingreso
de n productos para luego listar los datos con su respectivo
inventario e indica el nombre del producto de mayor inventario.
Hacer uso de arreglos.
TÉCNICAS DE PROGRAMACIÓN | 91
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
Interpretación de la programación:
Se define la clase Producto con sus tres atributos nombre, stock y
precio unitario. Luego se crea el método constructor con tres
parámetros para definir los valores de los atributos cuando sea usado
en un proceso de creación de objeto. También se crea los métodos de
set y get para cada atributo y el método inventario para el cálculo del
stock por el precio unitario. En la clase Probando Producto se crea
varios métodos estáticos: el método mensaje que ayuda a imprimir
texto, los métodos de lectura para dato de tipo entero y real, el método
listarProductos está diseñado para imprimir los datos almacenados
en los arreglos, el método producto Mayor Inventario que se encarga
de obtener el producto de mayor inventario y por último se tiene al
método main que solicitará la cantidad de productos a ingresar, se
ingresa los datos y posteriormente se hace listado de lo ingresado y se
muestra el nombre del producto de mayor inventario.
TÉCNICAS DE PROGRAMACIÓN | 93
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 95
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 97
ESTRUCTURA DE UNA CLASE: ATRIBUTOS Y MÉTODOS
TÉCNICAS DE PROGRAMACIÓN | 99
6. RELACIONES ENTRE CLASES
1 Bebidas
2 Lácteos
3 Condimentos
class Categoría
{
private int codcategoria;
private String descripción;
.
.
.
}
class Producto
{
private int codproducto;
private String nombre;
private int stock;
private double preciounitario;
private int codcategoria;
return codproducto;
}
.
.
.
}
des=leer.readLine();
C2=new Categoria(codcat, des);
System.out.print(“Codigo de Categoria: “);
codcat = Integer.parseInt(leer.readLine());
System.out.print(“Descripción de la Categoria: “);
des=leer.readLine();
C3=new Categoria(codcat, des);
System.out.print(“Codigo de Producto: “);
codpro = Integer.parseInt(leer.readLine());
System.out.print(“Nombre del Producto: “);
nom=leer.readLine();
System.out.print(“Stock del Producto: “);
s = Integer.parseInt(leer.readLine());
System.out.print(“Precio del Producto: “);
pu = Double.parseDouble(leer.readLine());
System.out.print(“Codigo de Categoria: “);
codcat = Integer.parseInt(leer.readLine());
P1=new Producto(codpro, nom, s, pu, codcat);
System.out.print(“Codigo de Producto: “);
codpro = Integer.parseInt(leer.readLine());
System.out.print(“Nombre del Producto: “);
nom=leer.readLine();
System.out.print(“Stock del Producto: “);
s = Integer.parseInt(leer.readLine());
System.out.print(“Precio del Producto: “);
pu = Double.parseDouble(leer.readLine());
System.out.print(“Codigo de Categoria: “);
codcat = Integer.parseInt(leer.readLine());
P2=new Producto(codpro, nom, s, pu, codcat);
System.out.print(“Codigo de Producto: “);
codpro = Integer.parseInt(leer.readLine());
System.out.print(“Nombre del Producto: “);
nom=leer.readLine();
System.out.print(“Stock del Producto: “);
s = Integer.parseInt(leer.readLine());
System.out.print(“Precio del Producto: “);
pu = Double.parseDouble(leer.readLine());
System.out.print(“Codigo de Categoria: “);
codcat = Integer.parseInt(leer.readLine());
P3=new Producto(codpro, nom, s, pu, codcat);
}
}
Arreglo: categorías
0 1 2
Interpretación de la programación:
La programación se inicia con la creación de las clases Categoría y
Producto con sus atributos y métodos. En la clase Usando Categoría
Producto se define varios métodos, uno denominado imprime que
sirve para imprimir una cadena de texto, otro denominado ler
DatoEntero para la lectura de un valor numérico entero, otro
denominado ler Dato Real para la lectura de un valor numérico real,
otro denominado leerDatoTexto para la lectura de un dato de tipo
cadena de texto, otro llamado buscaCategoria que consiste en buscar
la descripción de la categoría dado el valor del código de la categoría
y otro método llamado productoMayorStock que retorna el nombre
del producto de mayor stock. En estos dos últimos métodos se hace
uso de los métodos get como por ejemplo getCategoria() para obtener
el código de la categoría del elemento especificado del arreglo. En el
método main, después de declarar variables de memoria se pide el
ingreso de la cantidad de categoría a almacenar como también la
cantidad de productos a ingresar, se procede al ingreso de los datos en
ambos arreglos con la ayuda de la sentencia repetitiva for donde
además se crea objetos de la clase Categoría y de la Clase Producto
que sirven para el llenado de cada elemento del arreglo. Luego se
hace un listado de los productos mostrando en lugar del código de
categoría la descripción de la categoría. Finalmente se muestra el
producto de mayor stock.
Interpretación de la programación:
La aplicación se inicia con la creación de la clase Facultad y la clase
EscuelaProfesional. La novedad en esta programación está en el ter-
cer atributo de la clase EscuelaProfesional es de tipo clase Facultad,
esta otra forma de relacionar una clase con otra. En el método cons-
tructor EscuelaProfesional, el tercer parámetro que es f es de tipo
Facultad. El método toString establece una cadena de texto que indi-
ca el nombre de la escuela profesional y a qué facultad pertenece. En
la clase RelacionFacultadEscuela se establece los métodos imprime
y leerDatoTexto. En el método main se solicita el ingreso de datos de
dos escuelas profesionales indicando a qué facultad pertenece y ter-
mina con la impresión de los datos ingresados.
Interpretación de la programación:
Esta es la primera aplicación donde el código de la programación es
distribuido en varios archivos de extensión java, es decir, en varias
clases. Se crea una clase LecturaDatos para programar métodos que
permiten la lectura de datos desde el teclado. Luego, se crea las clases
Marca y Artefacto con los atributos indicados en el enunciado y
finalmente se tiene la clase TiendaArtefactos que solicita el ingreso
de una cantidad de marcas y de artefactos para luego listar los
artefactos y posteriormente, se pide el ingreso del nombre de una
marca para luego mostrar los artefactos de la marca indicado.
Por ejemplo:
package p01;
public class Matematicas
i{
public int suma(int x,int y)
{
return x+y;
}
package p02;
import java.io.*;
import paquete01.Matematicas;
package p01;
class A
{
private void imprime(String m)
{
System.out.println(m);
}
}
public class B
{
public static void main(String args[])
{
A objeto=new A();
//tratando de acceder al metodo privado imprime que está en A
Objeto.imprime(“Esto es fácil”);
}
}
package p01;
public class A
{
protected void imprime(String m)
{
System.out.println(m);
}
}
package p02;
import p01.*;
public class B extends A
{
package p02;
public class B
{
public static void main(String args[])
{
A objeto=new A();
objeto.imprime(“Esto no funciona”);
}
}
package p01;
public class A
{
static int cuenta=0;
public A()
{
cuenta=cuenta+1;
}
}
package p01;
public class B
{
7.3.2. Final
Una variable o atributo, método o clase no se podrá modificar su
contenido. Si un atributo o variable se le coloca la palabra reservada
final no se puede asignarle otro valor. Si una clase se le pone la
palabra reservada final no podrá extender la clase, es decir, no podrá
dar herencia a una nueva clase. Si a un método se le crea con la
palabra reservada final no se podrá sobrescribir sobre él. Por
ejemplo, lo que se programa a continuación no funcionaría.
1) Crear una clase Trabajador que haga uso del modificador static y
luego crea dos objetos de la clase Trabajador.
Interpretación de la programación:
En la clase Trabajador se hace uso de un atributo private static y un
método public static. El atributo contador se inicializa con un valor
igual cero. Este atributo va contando el número de Objetos de la Clase
Trabajador en la medida en que se van creando los objetos, es decir, se
va incrementando en el constructor cada vez que se crea un objeto. Para
saber en un momento dado cuántos objetos de la clase Trabajador se ha
creado basta con ejecutar el método estático getContador() que
devuelve el valor de la variable contador. Un método definido con static
no puede acceder a miembros de una clase que no usa la palabra
reservada static. La aplicación hace uso de 3 clases: la clase
LecturaDatos que tiene los métodos para leer desde el teclado, la clase
Trabajador donde se declara el atributo contador como entero y como
estáticos y los atributos nombres y apellidos, aparte de los métodos set y
get y el método toString. La tercera clase es ProbandoTrabajador que en
la línea 4 de la programación se importa el paquete que contiene a la
clase LecturaDatos para ser usado en el método main. En la medida que
se crea un objeto a partir de la clase Trabajador la variable entera y
estática llamada contador se incrementa en 1.
Interpretación de la programación:
Se crea la clase Articulo con los atributos indicados en el enunciado. Fue
necesario crear una variable estática entera llamada cuenta para ir
generando los nuevos códigos de los artículos en la medida que se iba
creando más artículos. En la programación de la clase UsandoArtículo
en la línea 4 se importa el paquete que contiene la clase LecturaDatos.
HERENCIA, CLASES
ABSTRACTAS, INTERFACES,
POLIMORFISMO, PAQUETES
Y EXCEPCIONES
8. MÉTODOS CONSTRUCTORES
Y LA REFERENCIA THIS
Por ejemplo:
public class Operaciones
{
private int número1;
private int número2;
public Operaciones()
{
número1=0;
número2=0;
}
}
public Operaciones()
{
número1=0;
número2=0;
}
Interpretación de la programación
La clase camisa tiene cuatro atributos referido a la descripción, talla,
stock y precio. El método constructor Camisa hace usa de referencia
this. Se crea los métodos set y get y se adiciona los métodos toString,
preciodescontado y precioaumntado para luego ser usado en la clase
PedidoCamisas. En esta última clase hace uso de la clase
LecturaDatos que se encuentra en el paquete Capítulo I. Sesión_06.
En el método main se ingresa los datos de una camisa y luego se
solicita la cantidad de pedido y la forma de pago para finalmente
mostrar al final el precio total del pedido y en caso la forma de pago es
al crédito se visualiza el monto de la cuota.
Ejecución del programa:
Interpretación de la programación
En la clase Figura se crea tres métodos constructores, el primero sólo
usa uno de los tres atributos y está diseñado para la figura del cuadrado.
El segundo método constructor usa dos atributos y está creado para la
figura del rectángulo. El tercer método constructor usa tres atributos y
está diseñado para la figura del triángulo. Se crea tres métodos para el
cálculo del área y tres métodos para el cálculo de los perímetros. Tam-
bién está los métodos set y get de cada uno de los atributos.
En la clase UsandoFigura se importa nuevamente la clase LecturaDatos
que se encuentra en el paquete Capítulo_I.Sesión_06. En el método
main se procede a solicitar la figura geométrica a usar para los cálculos
y según la figura seleccionada se solicita el ingreso de los valores de los
lados. Finalmente se muestra el cálculo del área y del perímetro de la
figura. En el caso del triángulo se hace una validación en caso que los
datos ingresados de los tres lados no lleguen a formar un triángulo.
Ejecución del programa:
import java.io.*;
class Cuadrado
{
protected double lado;
}
public double getAltura()
{
return altura;
}
public double areaPrisma()
{
return super.área()*2+altura*lado*4;
}
}
Punto
x: double
y: double
Punto()
setX() : void
getX() : double
…
toString(): String
Circulo
radio: double
Circulo()
setRadio() : void
getRadio() : double
área() : double
…
Interpretación de la programación
La clase Circulo hereda de la clase Punto que en código de Java se
escribe
Class Círculo extends Punto
La palabra reservada extends significa extendido que es lo mismo
heredado, es decir, la clase Circulo hereda de la clase Punto todos sus
atributos y métodos, siempre y cuando ninguno de los miembros de la
clase Punto tenga nivel de acceso tipo private. Los métodos
constructores de la clase Circulo puede invocar a los métodos
constructores de la clase Punto. Para poder invocar al constructor de
la clase Punto se hace uso el método o referencia super. La subclase
puede nuevamente implementar un método heredado de la
superclase, es decir, se puede sobrescribir lo realizado y se necesita
tomar algo programado en la superclase se le invoca con la referencia
super. En el método toString de la clase Circulo se muestra en el
retorno super.toString() lo que significa que invoca la ejecución del
método toString de la clase Punto.
2) Crea una clase vehículo con los atributos placa, marca, nroejes y
tipocombustible. A partir de la clase Vehiculo se crea la clase Bus
con los atributos propios nroasientos y tiposervicio y la clase
Carga con el único atributo propio denominado capacidad.
Elabora un programa que permita el ingreso de datos de un bus o
de un vehículo de carga. Tener en cuenta el siguiente diagrama
de clases:
Vehículo
placa : String
marca : String
nroejes : int
tipocombustible : String
Vehiculo ()
…
Bus Carga
nroasientos : int capacidad : int
tiposervicio : String
Bus() Carga()
… …
Interpretación de la programación
En el programa se aprecia que la clase Bus y la clase Carga hereda de
la clase Vehículo. Esta vez se establece en las subclases y en la
superclase el uso del método toString. En este método se hace uso del
método toString de la clase Vehículo logrando obtener una cadena de
texto con los datos de los atributos obtenidos de la superclase y de la
subclase. En la clase HerenciaBusCarga en el método main se solicita
el ingreso de los datos ya sea del vehículo Bus o del vehículo Carga,
se instancia un objeto de la clase Bus o de clase Carga y se muestra
luego los datos ingresados.
Administrativo Docente
sueldobasico : double horastrabajadas : int
minutostardanza : int pagoxhora : double
diasfalta : int
Administrativo() Docente()
… …
sueldoNeto() : double sueldoNeto() : double
Interpretación de la programación
En el programa se aprecia que las clases Administrativo y Docente
hereda los atributos y métodos de la clase Empleado. El método
sueldoNeto tienen implementación diferente por la naturaleza de
cálculo de los sueldos de los administrativos y de los docentes. En la
clase HerenciaAdministrativoDocente se establece métodos para
leer datos para los arreglos de objetos definidos con las clases
Administrativo y Docente y los métodos para listar los datos
ingresados mostrando los sueldos netos de todos los trabajadores.
Por ejemplo:
Empleado
codempleado : int
apellidos : String
nombres : String
Empleado ()
…
sueldoNeto():double
Administrativo Docente
sueldobasico : double horastrabajadas : int
minutostardanza : int pagoxhora : double
diasfalta : int
Administrativo() Docente()
… …
sueldoNeto() : double sueldoNeto() : double
{
return codempleado;
}
...
public abstract double sueldoNeto();
}
Figura_Geometrica
x : int
y : String
Figura_Geometrica()
…
perimetro():double
area(): double
Circulo Rectangulo
radio : double lado1 : double
lado2 : double
Circulo() Rectangulo()
… …
perimetro() : double perimetro() : double
area(): double area() : double
Interpretación de la programación
En el programa se tiene la clase abstracta FuguraGeometrica con dos
métodos abstractos llamados perímetro y área. La clase Circulo y
Rectángulo heredan de la clase abstracta FiguraGeometrica y se
procede a implementar los métodos abstractos de acuerdo a los
cálculos de las figuras geométricas.
En la clase UsoFigurasGeomtricas se solicita el ingreso del tipo de
figura geométrica (Circulo o Rectáingulo) y según lo seleccionado se
solicita los datos para proceder a crear los objetos y mostrar los
resultados invocando a los métodos implementados en la clase
Circulo y Rectángulo.
Ejecución del programa:
FiguraCirculo
radio : double
FiguraCirculo()
…
area():double
volumen(): double
Esfera Cilindro
altura : double
Esfera() Cilindro()
… …
area() : double areaBase() : double
volumen(): double areaLateral() : double
area() : double
volumen() : double
Interpretación de la programación
En el programa se tiene la clase abstracta FiguraCirculo con los dos
métodos abstractos área y volumen. En la clase abstracta
FiguraCirculo se define el atributo radio. En la subclase Esfera se
implementa los métodos área y volumen y no se define ningún
atributo, por lo tanto, el método constructor de la clase Esfera invoca
al método constructor de la clase abstracta FIguraCirculo. En la
subclase Cilindro se implementa los métodos área y volumen, pero
antes se encuentra implementado el método areaBase y areaLateral,
eta programación define las instrucciones de los métodos área y
volumen del cilindro. En la clase UsoEsferaCilindro se solicita
primero el tipo de figura geométrica (esfera o cilindro) y se procede a
solicitar los datos como el radio y en el caso del cilindro se pide
adicionalmente el valor de la altura. Se instancia el objeto respectivo
y se muestra los reultados.
Ejecución de la programación:
Por ejemplo:
interface GeneraNumeros
{
int siguienteNumero();
void comienza();
void comenzarEn(int n);
}
public NumerosPares()
{
dato=0;
}
public NumerosImpares()
{
dato=-1;
}
System.out.print(NI.siguienteNumero()+" ");
}
System.out.println("");
}
}
}
Por ejemplo:
int n;
GeneraNumeros numero=new NumeroPares();
n=numero.siguienteNumero();
Por ejemplo:
Figura
area() : double
perimetro() : double
Interpretación de la programación
La interface Figura tiene dos métodos no implementados llamados
area y perímetro. La clase Cuadrado se implementa de Figura,
establece un atributo llamado lado, define los métodos constructores,
getter y setter y se implementa los métodos área y perímetro que
fueron declarados en la interface Figura. De la misma manera se
trabaja con la clase Rectangulo y Triangulo. En el método main se
solicita elegir la figura geométrica a calcular el área y el perímetro,
luego se ingresa los datos para los atributos, se instancia el objeto
respectivo (C para cuadrado, R para rectángulo o T para triangulo).
Finalmente se imprime los resultados invocando a los métodos área y
perímetro a partir del objeto instanciado.
Ejecución de la programación:
MaterialBibliografico Prestamo
codigo : String
titulo :String
aniopublicacion : int
estado : int
MaterialBibliografico() prestado()
… disponible()
enReparacion()
Libro Revista
prestado() prestado()
disponible() disponible()
enReparacion() enReparacion()
Interpretación de la programación
En esta aplicación se está usando el concepto de herencia múltiple. Se
crea una superclase llamada MaterialBibliografico y una interface
Préstamo que sirven para aplicar lo que se ha definido como herencia
múltiple. La clase revista y la clase Libro hereda de la clase
MaterialBibliográfico y se implementa de la interface Préstamo. Los
métodos denominados prestado, disponible y enReparación se
implementa en las subclases Libro y Revista. En el método main se
hace uso de las subclases instanciado el objeto respectivo, luego de
solicitar el ingreso del tipo de material bibliográfico como la
indicación de prestar o devolver dicho material.
Ejecución de la programación:
import java.io.*;
}
comisionXProducto=comision;
cantidadProductos=cantpro;
}
{
return salarioBasico+
comisionXProducto*cantidadProductos;
}
return salarioXTareaCumplida;
}
}
System.out.print(m);
}
EmpleadoGanaComision C=new
EmpleadoGanaComision(ape,nom,sb,comision,c);
imprimir("==========================\n");
imprimir(" DATOS DE EMPLEADO QUE GANA POR
TAREAS\n");
imprimir("==========================\n");
imprimir("Ingrese el apellido: ");
ape=leer.readLine();
imprimir("Ingrese el nombre: ");
nom=leer.readLine();
imprimir("Ingrese el salario por tarea cumplida: ");
st=Double.parseDouble(leer.readLine());
imprimir("Ingrese la cantidad de tareas realizadas: ");
c=Integer.parseInt(leer.readLine());
EmpleadoXTarea T=new
EmpleadoXTarea(ape,nom,st,c);
imprimir("==========================\n");
imprimir(" DATOS DE EMPLEADO QUE GANA POR
HORAS\n");
imprimir("==========================\n");
imprimir("Ingrese el apellido: ");
ape=leer.readLine();
imprimir("Ingrese el nombre: ");
nom=leer.readLine();
imprimir("Ingrese el pago por hora: ");
ph=Double.parseDouble(leer.readLine());
imprimir("Ingrese la cantidad de horas trabajadas: ");
ch=Integer.parseInt(leer.readLine());
EmpleadoPorHora H=new
EmpleadoPorHora(ape,nom,ph,ch);
E = G;
imprimir(E.toString() + " y percibe " + E.ingresos()+"\n");
E = C;
imprimir(E.toString() + " y percibe " + E.ingresos()+"\n");
E = T;
imprimir(E.toString() + " y percibe " + E.ingresos()+"\n");
E = H;
imprimir(E.toString() + " y percibe " + E.ingresos()+"\n");
}
}
Interpretación de la programación
La clase abstracta FiguraGeo define 3 métodos: área, volumen y
obtenerNombre, este último es el método abstracto. A partir de la
clase abstracta FiguraGeo se crea por herencia las clases Punto,
Circulo, Cilindro y Esfera. Se establece una jerarquía de clases que se
aprecia cuando la clase Punto hereda de FiguraGeo, la clase Cilindro
hereda de Punto y la clase Cilindro hereda de la clase Circulo. Los
métodos de area y volumen se implementan en las subclases y se
implementa el método obtenerNombre. La clase Esfera hereda de la
clase Circulo. Luego, al momento de hacer uso de las clases antes
mencionadas en el método main se procede a solicitar las
coordenadas de un punto, luego el valor de un radio y la altura de un
cilindro. Se crea los objetos P, C, CI y E a partir de los datos
ingresados. El polimorfismo se aprecia desde el momento que se crea
una arreglo Figuras[] de tamaño 4 a partir de la clase abstracta
FiguraGeo y luego cada elemento del arreglo recibe los objetos P, C,
CI y E, haciendo que el arreglo haga referencias a cada uno de los
objetos antes mencionado. A través de una sentencia repetitiva for se
procede a mostrar información de cada figura usando los métodos
implementados dado que el arreglo hace referencia a cada objeto
teniendo un comportamiento polimórfico.
Ejecución de la programación:
Interpretación de la programación
La clase abstracta Polígono tiene 3 métodos abstractos:
obtenerNombre, perímetro y área. A partir de la clase Polígono se aplica
herencia para crear las subclases Cuadrado, Rectángulo y Triangulo
donde se implementa los métodos abstractos definidos en la clase
abstracta Polígono. La clase Usando Polígono se crea varios métodos
estáticos, uno de ellos es el método leerTipoPoligono donde se
implementa la selección de tipo de polígono y según el tipo se invoca a
métodos como leerCuadrado, leerRectángulo y leerTríangulo. En la
clase UsandoPoligono se crea un arreglo estático llamado polígonos a
partir de la clase Polígono y una variable de memoria entera estática
cuenta con valor inicial 0. El programa está elaborado para poder
ingresar los datos de 20 polígonos distintos. El programa culmina en
mostrar los datos del perímetro y el área de los polígonos ingresados
donde se aprecia el uso del polimorfismo.
package Matematica;
...
class Cilindro {
Circulo circulo;
...
}
package Geometría;
class Círculo {
private int radio;
public Círculo(int r)
{
radio=r;
}
}
package Matematica;
import Geometria.*;
class Cilindro {
Circulo circulo;
...
}
class Cilindro {
Geometria.Círculo círculo;
...
}
Sin embargo, si no se usa la cláusula import es necesario
especificar el nombre del package cada vez que se desee usar la clase
Circulo. La cláusula import se puede hacer uso en un mismo
programa varias veces. Se usa después de la declaración de la palabra
reservada package y antes de la definición de las clases. El
compilador de Java cuando no encuentra la clase en el mismo paquete
o paquete actual busca en los paquetes indicados a través de import.
Hacer uso de import no implica copiar código hacia el nuevo
programa sino más bien una extensión del programa actual hacia
aquellas clases o interfaces que se encuentran en otros paquetes.
import Capitulo_I.Sesion_06.LecturaDatos;
import java.io.*;
Interpretación de la programación
La clase Excepcion_Aritmetica pertenece al paquete
Capitulo_II.Sesion_13 y para esta aplicación se está importando la
clase LecturaDatos que se encuentra en el paquete
CapituloI.Sesion_06. En el método main se hace uso del bloque try{
…} que permite proteger las instrucciones ante el posible error que
pueda cometer el usuario de la aplicación. Las instrucciones en el
bloque try una vez que se inicia la ejecución del programa y se
presente algún error dispara una excepción que deberá ser
recepcionada por un catch que ejecuta lo programado. En este
programa se ha establecido el uso de dos excepciones para cuando el
usuario cometa el error de ingresar un dato no adecuado como por
Interpretación de la programación
La clase Artefacto contiene los atributos codartefacto, descripcion,
tipoartefacto, stock y preciounitario. Además, tiene el método
constructor y los métodos set y get para dar y obtener los datos a cada
uno de los atributos. En la clase Excepcion_Arreglo, en el método main
inicia con la solicitud de cuántos artefactos se van ingresar. A partir de
este dato se crea el arreglo de objetos artefactos a partir de la clase
Artefacto. Luego se procede al ingreso de datos de cada artefacto
usando excepciones como por ejemplo en el caso del ingreso del código
de artefacto se valida el ingreso de un, valor numérico entero para lo
cual se hace uso de la excepción general denominada Exception
programado en el catch. Existe una variable booleana verifica que
permite manejar mejor el ingreso de datos. Al final se crea un objeto A, a
partir de la clase Artefacto y con los datos ingresados del artefacto y
posteriormente, se invoca la ejecución del método listarArtefactos que
visualiza todos los datos de los artefactos.
Ejecución del programa:
Sistema_Tienda.java contiene:
Almacen.java contiene:
Producto.java contiene:
Pedido.java contiene:
DetallePedido.java contiene:
Ejecución de lo programado:
Ingresando el nombre de un almacén luego de seleccionar la opción1
del menú principal.