You are on page 1of 206

Texto para el curso de Tcnicas de Programacin del II ciclo de la escuela de Ingeniera de Sistemas de la ULADECH

PROGRAMACION ORIENTADO A OBJETOS


Contiene el uso de las clases de Java y sus mtodos, creacin de mtodos, recursividad y sobrecarga de mtodos, arreglos, miembros de una clase, relaciones de clases, niveles de acceso de los miembros de una clase, operador this, herencia de clases, clases abstractas, interfaces, polimorfismo, paquetes y excepciones

Elaborado por: Ing. Martn Salcedo Quiones

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

INDICE
CAPITULO I: Uso y creacin de mtodos. Mtodos de clases de Java Creacin de mtodos Recursividad y sobrecarga de mtodos Arreglos unidimensionales en mtodos CAPITULO II:Programacin orientada a objetos Clases y sus miembros Relaciones entre clases Modificadores de acceso a los miembros de una clase Mtodos constructores y la referencia this Herencia de clases Clases abstractas Interfaces y herencia mltiple Polimorfismo CAPITULO IV: Paquetes, excepciones y desarrollo de un proyecto Paquetes Manejo de excepciones e hilos Proyecto Tienda Pgina 03 04 22 34 45 59 60 79 92 107 120 137 149 163 179 180 185 193

CAPITULO III: Herencia, clases abstractas, interfaces y polimorfismo 119

Docente: Ing. Martn Salcedo Quiones

Pagina: 2

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CAPITULO I
USO Y CREACION DE METODOS

Docente: Ing. Martn Salcedo Quiones

Pagina: 3

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

METODOS DE CLASES DE JAVA

ESTRUCTURA DE UNA APLICACIN DE JAVA SENCILLA public class HolaMundo{ public static void main(String args[]) { System.out.println(! Hola Mundo ! ); } } Al escribir una aplicacin sencilla de Java se debe definir un mtodo main, que se procesa cuando el programa inicia su ejecucin. En el mtodo main se especifican las funciones que realiza el programa. Toda aplicacin se comienza declarando una clase con la palabra public class y un nombre, y este nombre tiene que ser idntico al nombre del archivo que se va a grabar pero con extensin Java. En el ejemplo al colocar public class HolaMundo se esta declarando la clase llamada HolaMundo. El archivo se debe grabar como HolaMundo.java igual que el nombre de la clase. Dentro de main, la aplicacin utiliza el metodo System.out.println para desplegar el mensaje Hola Mundo! en la consola del Sistema. Para compilar un programa de Java se hace lo siguiente Docente: Ing. Martn Salcedo Quiones Pagina: 4

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote C:\JDK1.3\BIN>javac HolaMundo.java <Intro> Al hacer esto se crea un archivo llamado HolaMundo.class que es un archivo que se encuentra en bytecode Despus de esto se utiliza el comando java para interpretar y ejecutar el bytecode de la aplicacin. C:\JDK1.3\BIN>java HolaMundo <Intro> Hola Mundo ! Las instrucciones en un programa Java se escriben en minsculas El smbolo de punto y coma (;) se utiliza para separar una instruccin de la siguiente. Un bloque de cdigo es una serie de instrucciones y/o declaraciones de Java rodeadas por un par de llaves {} Por ejemplo para comenzar la clase comienza con { y termina con }. Asi mismo el mtodo main comienza con un { y termina con un }. El uso de los bloque de cdigo es importante para indicar que se van a realizar un conjunto de instrucciones. La clase BufferedReader para entrada de datos La E/S bsica por terminal con formato se lleva a cabo mediante readLine y println . La entrada estndar es System.in y la salida estndar es System.out. El mecanismo bsico para E/S con formato utiliza el tipo String. En la salida + combina dos valores de tipo String. Si el segundo argumento no es un valor de tipo String, se crea un valor temporal de tipo String para el, siempre que sea de tipo primitivo. Estas conversiones al tipo String se pueden definir tambin para objetos. Ejemplo: System.out.println(El resultado es +R);

Docente: Ing. Martn Salcedo Quiones

Pagina: 5

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Un modo sencillo de realizar una lectura de la entrada es leer una sola lnea almacenndola en un objeto de tipo String, para lo que se emplea el mtodo readLine. Este mtodo lee hasta que encuentra un final de lnea o el final del fichero. Los caracteres ledos salvo el final de Lnea (en el caso de que se encuentre), se devuelven como un nuevo String. Para emplear readLine, se debe construir un objeto BufferedReader sobre un objeto InputStreamReader que a su vez se crea a partir de System.in. Ejemplo: BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String nombre; System.out.println(Introduzca una nombre : ); nombre = in.readLine(); En este ejemplo se ha declarado una variable nombre de tipo String y se esta leyendo desde la consola utilizando un objeto llamado in el cual llama al mtodo readLine para leer una cadena y asignarle a la variable nombre. La clase Math La clase Math representa la librera matemtica de Java. Las funciones que contiene son las de todos los lenguajes, parece que se han metido en una clase solamente a propsito de agrupacin, por eso se encapsulan en Math, y lo mismo sucede con las dems clases que corresponden a objetos que tienen un tipo equivalente (Character, Float, etc.). El constructor de la clase es privado, por los que no se pueden crear instancias de la clase. Sin embargo, Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que inicializarla. Math tiene una referencia a las dos constantes ms utilizadas en matemtica con una precisin de 15 decimales (suficiente para la mayora de los mortales). Si ejecutamos: System.out.println("e = " + Math.E); Docente: Ing. Martn Salcedo Quiones Pagina: 6

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.println("pi = " + Math.PI); veremos: e = 2.718281828459045 pi = 3.141592653589793 Los mtodos que tiene la clase Math son: Math.abs( x ) para int, long, float y double Math.sin( double ) Math.cos( double ) Math.tan( double ) Math.asin( double ) Math.acos( double ) Math.atan( double ) Math.atan2( double,double ) Math.exp( double ) Math.log( double ) Math.sqrt( double ) Math.ceil( double ) Math.floor( double ) Math.rint( double ) Math.pow( a,b ) Math.round( x ) para double y float Math.random() devuelve un double Math.max( a,b ) para int, long, float y double Math.min( a,b ) para int, long, float y double Math.E para la base exponencial Math.PI para PI La clase Integer Cada tipo numrico tiene su propia clase de objetos. As el tipo int tiene el objeto Integer. Se han codificado muchos mtodos tiles dentro de la clase Integer como son: String Integer.toString( int i,int base ); String Integer.toString( int i ); Por ejemplo: int valor=38; String cadena; Docente: Ing. Martn Salcedo Quiones Pagina: 7

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote cadena=Integer.toString(valor); //no colcarle base se assume que es base 10 int I.parseInt( String s,int base ); int I.parseInt( String s ); Por ejemplo: String dato=20; int valor; valor=Integer.parseInt(dato); //no colcarle base se assume que es base 10 Integer Integer.valueOf( String s,int base ); Integer Integer.valueOf( String s ); int I.intValue(); long I.longValue(); float I.floatValue(); double I.doubleValue(); String I.toString();

La clase Character Al trabajar con caracteres se necesitan muchas funciones de comprobacin y traslacin. Estas funciones estn empleadas en la clase Character . De esta clase s que se pueden crear instancias, al contrario que sucede con la clase Math . Declaraciones La primera sentencia crear una variable carcter y la segunda un objeto Character:
char c; Character C;

Comprobaciones booleanas Docente: Ing. Martn Salcedo Quiones Pagina: 8

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote
Character.isLowerCase(c) //devuelve verdadero si el character est en minscula Character.isUpperCase(c) //devuelve verdadero si el character est en mayscula Character.isDigit(c) // devuelve verdaero si el carcter es un dgito numrico Character.isSpace(c) //devuelve verdaero si el character es un espacio y falso todo lo contrario

En este caso, si tuvisemos un objeto Character C , no se podra hacer C.isLowerCase , porque no se ha hecho un new de Character. Estas funciones son estticas y no conocen al objeto, por eso hay que crearlo antes. Traslaciones de caracteres
char c2 = Character.toLowerCase( c ); char c2 = Character.toUpperCase( c );

Traslaciones de carcter/dgito
int i = Character.digit( c,base ); char c = Character.forDigit( i,base );

Mtodos de la clase Character


C = new Character( 'J' ); char c = C.charValue(); String s = C.toString();

La clase Float Cada tipo numrico tiene su propia clase de objetos. As el tipo float tiene el objeto Float. De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Float . Declaraciones La primera sentencia crear una variable float y la segunda un objeto Float:
float f; Float F;

Docente: Ing. Martn Salcedo Quiones

Pagina: 9

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Conversiones de Clase/Cadena
String s = Float.toString( f ); f = Float.valueOf( "3.14" );

Comprobaciones
boolean b = Float.isNaN( f ); boolean b = Float.isInfinite( f );

La funcin isNaN() comprueba si f es un No-Nmero . Un ejemplo de nonmero es raiz cuadrada de -2. Conversiones de Objetos
Float F = new Float( Float.PI ); String s = F.toString(); int i = F.intValue(); long l = F.longValue(); float F = F.floatValue(); double d = F.doubleValue();

La clase Double Cada tipo numrico tiene su propia clase de objetos. As el tipo double tiene el objeto Double . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Double . Declaraciones La primera sentencia crear una variable double y la segunda un objeto Double:
double d; Double D;

Mtodos ms usados en Double Docente: Ing. Martn Salcedo Quiones Pagina: 10

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote
boolean D.equals(); String D.toString(); int D.intValue(); long D.longValue(); float D.floatValue(); double D.doubleValue(); Double V.valueOf( String s );

Clase String Esta clase almacena una cadena de caracteres. Una cadena es una serie de caracteres que se trata como una unidad. Una cadena puede incluir letras, dgitos y diversos caracteres especiales como +,-,*,/,$ y otros. Una cadena en Java es un objeto de la clase String. Los literales de cadena o constantes de cadena en Java se escriben como una secuencia de caracteres cerrada entre comillas. Ejemplo: Computacin, Java es fcil, Los mtodos mas utilizados son: cadena.length() : El mtodo length Devuelve el numero de Caracteres de una cadena. Ejemplo: String nombre = Francisco; int n; n = cadena.length(); System.out.println(El nombre : + nombre + tiene + n + Caracteres);

cadena1.equals(cadena2) : El mtodo equals devuelve true si las dos cadenas son iguales y false en caso contrario.. cadena1.equalsIgnoreCase(cadena2) : El mtodo equalsIgnoreCase no toma en cuenta la diferencia entre letras maysculas y minsculas de cada String al realizar la comparacin. cadena1.compareTo(cadena2) : El mtodo compareTo devuelve un numero entero: > 0 Si cadena1 es mayor que cadena2 = 0 Si las cadenas son exactamente iguales Docente: Ing. Martn Salcedo Quiones Pagina: 11

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote < 0 Si cadena1 es menor que cadena2 Este mtodo emplea una comparacin lexicogrfica. cadena1.compareToIgnoreCase(cadena2) : El mtodo compareToIgnoreCase no toma en cuenta la diferecia entre las maysculas y minsculas de cada String al realizar la comparacin. cadena.charAt(indice) : El mtodo charAt delvuelve el carcter que indica el indice. Ejemplo: String nombre = Felipe; Char x; X=nombre.charAt(3); // x toma el valor del carcter i. Los indices de una cadena comienzan en 0. cadena.toUpperCase() : Convierte la cadena a maysculas cadena.toLowerCase() : Convierte la cadena en minsculas cadena.trim() : Elimina los espacios al inicio y al final de la cadena. cadena1.startsWith(cadena2) : Devuelve verdadero si cadena1 comienza con cadena2. cadena1.endsWith(cadena2) : Devuelve verdadero si cadena1 finaliza con cadena2. cadena.indexOf(caracter) : Devuelve el ndice de la primera ocurrencia del carcter. cadena.indexOf(carcter,posicion) : Devuelve el ndice de la primera ocurrencia del carcter , comenzando la bsqueda a partir de posicin. cadena1.indexOf(cadena2) : devuelve el ndice de la primera ocurrencia de cadena2 en cadena1. cadena1.indexOf(cadena2,posicin): Devuelve el ndice de la primera ocurrencia de la cadena2 en cadena1, comenzado la bsqueda a partir de posicin. cadena.lastIndexOf(caracter) : Devuelve el ndice de la ultima ocurrencia del carcter. cadena.lastIndexOf(carcter,posicion) : Devuelve el ndice de la ultima ocurrencia del carcter , comenzando la bsqueda a partir de posicin. Docente: Ing. Martn Salcedo Quiones Pagina: 12

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

cadena1.lastIndexOf(cadena2) : devuelve el ndice de la ultima ocurrencia de cadena2 en cadena1. cadena1.lastIndexOf(cadena2,posicin): Devuelve el ndice de la ultima ocurrencia de la cadena2 en cadena1, comenzado la bsqueda a partir de posicin. cadena.substring(indice) : Devuelve una subcadena que esta conformada por todos los caracteres que comienzan en indice e incluye todos los caracteres siguientes hasta el fin de la cadena. cadena.substring(indiceInicial, indiceFinal) : Devuelve una subcadena que esta conformada por todos los caracteres cuyo indice comienza en indiceInicial e incluye todos los caracteres hasta el IndiceFinal-1. String.valueOf() : Convierte tipos primitivos a cadenas. La clase String sobrecarga el mtodo valueOf para soportar cada uno de los tipos primitivos de Java. Ejemplo: String cad1 = String.valueOf(12); String cad2 = String.valueOf(true); String cad3 = String.valueOf(T); String cad4 = String.valueOf(12.9867);

Aqu presentaremos algunas aplicaciones sencillas.

PROGRAMAS RESUELTOS 1) Hacer un programa para calcular el area de un triangulo dada la base y la altura import java.io.*; public class AreaTriangulo{ Docente: Ing. Martn Salcedo Quiones Pagina: 13

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public static void main(String arg[]) throws IOException { float base,altura,area; BufferedReader InputStreamReader(System.in)); System.out.print("Ingrese base del triangulo :"); base=Float.parseFloat(in.readLine()); System.out.print("Ingrese altura del triangulo :"); altura=Float.parseFloat(in.readLine()); area=base*altura/2; System.out.println("El area del triangulo es : "+area); } } Interpretacin de la programacin: 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 mtodo esttico llamado main que al colocar (String args[]) indica que no hay argumento alguno para el mtodo y al colocar throws IOException son nuestra indicacin al compilador de que estamos conscientes del hecho de que puede ocurrir una excepcin (intercepcin 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 area de tipo float. Posteriormente se declara la variable in del tipo BufferedReader y se crea el objeto in con el operador new usando el mtodo constructor BufferedReader, la misma que usa el InputStreamReader, clase o interfaz que permite la lectura de entrada a travs del teclado, es decir, la variable objeto in es la permitir luego lograr ingresar datos. Luego con el mtodo print usado a partir de System.out permite imprimir una expresin como por ejemplo Ingrese la base del tringulo:. En la lnea de la programacin base= Float.parseFloat(in.readLine()); se busca el ingreso de un dato que se lee con el mtodo readLine() a partir del objeto in Docente: Ing. Martn Salcedo Quiones Pagina: 14 in = new BufferedReader(new

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote previamente creado. Dado que el dato ingresado es de tipo String o cadena es necesario la conversin a un dato del tipo de la variable que almacenar dicho dato, por lo que es necesario usar un mtodo de conversin como es el caso de parseFloat() que hace que el dato ingresado sea convertido al tipo de dato Float y luego asignado a la variable base. Lo mismo se hace con respecto a la variable altura. En la variable rea se hace el clculo del rea del tringulo para luego imprimir el rea del tringulo con la instruccin System.out.println("El area del triangulo es : "+area); donde se observa el uso del mtodo println() que permite imprimir una expresin y luego la impresin continuar en la siguiente lnea. Observa dentro del parntesis el uso del operador + que se usa como concatenacin (no como operador de suma), es decir, imprime la expresin El rea del tringulo es con el contenido de la variable area. 2) Calcular el perimetro, el area y la diagonal de un rectangulo si se ingresan los lados. import java.io.*; public class Rectangulo{ public static void main(String arg[]) throws IOException { double lado1,lado2,perimetro,area,diagonal; BufferedReader InputStreamReader(System.in)); System.out.print("Ingrese valor del primer lado :"); lado1=Double.parseDouble(in.readLine()); System.out.print("Ingrese valor del segundo lado :"); lado2=Double.parseDouble(in.readLine()); perimetro=2*(lado1+lado2); area=lado1*lado2; diagonal=Math.sqrt(Math.pow(lado1,2)+Math.pow(lado2,2)); Docente: Ing. Martn Salcedo Quiones Pagina: 15 in = new BufferedReader(new

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.println("El perimetro es : "+perimetro); System.out.println("El area es : "+area); System.out.println("La diagonal es : "+diagonal); } } Interpretacin de la programacin: La novedad en la segunda aplicacin es el uso del mtodo 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 mtodo sqrt() se logra calcular la raz cuadrada del un nmero, as por ejemplo Math.sqrt(4) calula la raz cuadrada de 4.

3) Calcular el salario neto de un trabajador. Se debe leer el nombre, horas trabajadas, precio de la hora y sabiendo que los impuestos aplicados son el 10 por ciento sobre el salario bruto. import java.io.*; public class Trabajador{ public static void main(String arg[]) throws IOException { String nombre; double sb,sn,ph,ht; BufferedReader InputStreamReader(System.in)); System.out.print("Ingrese nombre del trabajador :"); nombre=in.readLine(); System.out.print("Ingrese numero de horas trabajadas :"); ht=Double.parseDouble(in.readLine()); System.out.print("Ingrese precio de la hora :"); Docente: Ing. Martn Salcedo Quiones Pagina: 16 in = new BufferedReader(new

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote ph=Double.parseDouble(in.readLine()); sb=ph*ht; sn=sb-0.10*sb; System.out.println("El Salario neto del trabajador : "+nombre+ " es : "+sn); } }

4) Hacer un programa para convertir metros a pies y pulgadas 1 metro = 39.37 pulgadas public class Conversion{ public static void main(String arg[]) throws IOException { double metros,pies,pulgadas; BufferedReader InputStreamReader(System.in)); System.out.print("Ingrese valor en Metros :"); metros=Double.parseDouble(in.readLine()); pies=metros*3.2; pulgadas=metros*39.37; System.out.println("El valor en pies es : "+pies); System.out.println("El valor en pulgadas es : "+pulgadas); } } 5) Ingresar una letra entre a y e y reportar el mensaje de acuerdo a: a excelente b bueno c regular d malo e pesimo import java.io.*; Docente: Ing. Martn Salcedo Quiones Pagina: 17 in = new BufferedReader(new 1 metro = 3.2 pies

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

public class p403{ public static void main(String arg[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String cadena; char letra; System.out.print("Ingrese letra (a-e) : "); cadena=br.readLine(); letra=cadena.charAt(0); switch(letra) { case 'a': case 'A': System.out.println("EXCELENTE"); break; case 'b': case 'B': System.out.println("BUENO"); break; case 'c': case 'C': System.out.println("REGULAR"); break; case 'd': case 'D': System.out.println("MALO"); break; case 'e': case 'E': System.out.println("PESIMO"); break; default : System.out.println("letra equivocada"); } } }

EJECUTANDO LA PRIMERA APLICACION 1. Crea un proyecto denominado: Sesion01_Aplicaciones Docente: Ing. Martn Salcedo Quiones Pagina: 18

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Observa que debes crear la clase principal AreaTriangulo dentro del paquete sesion01_aplicaciones. Luego dar clic en el botn de comando Terminar. 2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

3. Asi debe quedar luego de colocar las instrucciones de la primera aplicacin.

Docente: Ing. Martn Salcedo Quiones

Pagina: 19

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4. Luego proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo

Docente: Ing. Martn Salcedo Quiones

Pagina: 20

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Ingresar el valor de la base y luego de la altura y se lograr observar lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 21

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CREACION DE METODOS

Los mtodos en java permiten modularizar sus programas. Todas las variables declaradas en las definiciones de mtodos son variables locales es decir solo se conocen en el mtodo que se definen. Casi todos los mtodos tienen una lista de parmetros que permiten comunicar informacin entre mtodos. Los parmetros de un mtodo tambin son variables locales. La sintaxis para declarar un mtodo es la siguiente: tipo_de_valor_devuelto nombre_del_mtodo ( lista_de_parmetros) { Declaraciones e instrucciones } Donde: tipo_de_valor_devuelto: Indica el tipo de valor que se devuelve al mtodo invocador. Si un mtodo no devuelve un valor, el tipo_de_valor_devuelto se declara como void. nombre_del_mtodo: Es cualquier identificador vlido lista_de_parmetros: Es una lista separada por comas que contiene las declaraciones de las variables que se pasarn al mtodo. Si un mtodo no recibe parmetros las lista_de_parmetros se deja vaca. Docente: Ing. Martn Salcedo Quiones Pagina: 22

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote El cuerpo del mtodo es el conjunto de declaraciones e instrucciones que constituyen el mtodo. Cuando un programa encuentra una llamada a un mtodo, se transfiere el control desde el punto de invocacin al mtodo invocado, se ejecuta el mtodo y el control regresa al invocador. Un mtodo invocado puede devolver el control al invocador de tres maneras. Si el mtodo no devuelve valor, el control se devuelve al llegar a la llave derecha que termina el mtodo o ejecutando la sentencia return; Si el mtodo devuelve un valor, la sentencia return expresin Devuelve el valor de Expresin. Por ejemplo si se desea calcular la suma de dos nmeros enteros. Se podra definir el siguiente mtodo: int suma(int x, int y) { return x+y; } el tipo_de_valor_devuelto es int, tiene dos parmetros enteros x e y. Supongamos que deseamos un mtodo para mostrar el mensaje Java es fcil de aprender. Se podra definir el mtodo de la siguiente manera void mensaje() { System.out.println(Java es fcil de Aprender); } En este caso el mtodo no devuelve un valor, por eso el

tipo_de_valor_devuelto es void. Lo que hace solamente el mtodo es mostrar un mensaje. Docente: Ing. Martn Salcedo Quiones Pagina: 23

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote PROGRAMAS RESUELTOS 1) Hacer un programa para calcular el factorial de un nmero. import java.io.*; public class Metodos01 { public static int factorial(int n) { int f=1,i; for(i=1;i<=n;i++) f=f*i; return f; } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n; do{ System.out.print("Ingrese numero :"); n=Integer.parseInt(br.readLine()); }while(n<0); System.out.println("el Factorial es : "+factorial(n)); } }

Interpretacin de la programacin: Se tiene el mtodo factorial que tiene un solo parmetro de tipo entero llamado n y que devuelve o retorna un valor de tipo entero. Es un mtodo esttico por lo que no ser necesario crear o instanciar un objeto (recuerda que para instanciar un objeto se usa el operador new). En el mtodo main se inicia con crear el objeto br 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 paramtro del mtodo factorial ya que se declara en otro mtodo). A travs de Docente: Ing. Martn Salcedo Quiones Pagina: 24

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote 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 instruccin System.out.println("el Factorial es : "+factorial(n)); imprimir el factorial de n haciendo uso del mtodo factorial. 2) Calcular el MCD de dos nmeros enteros. import java.io.*; class Metodos02{ public static int mcd(int a, int b) { int d=2,p=1; while(d<=a && d<=b) if(a%d==0 && b%d==0) { p=p*d; a=a/d; b=b/d; } else d++; return p; } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int x,y,m; do{ System.out.print("Ingrese primer numero :"); x=Integer.parseInt(br.readLine()); }while(x<0); do{ System.out.print("Ingrese el segundo numero : "); y=Integer.parseInt(br.readLine()); }while(y<0); m=mcd(x,y); Docente: Ing. Martn Salcedo Quiones Pagina: 25

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.println("El m.c.d de "+x+" y "+y+" es : "+m); } } 3) Programa para reportar todos los divisores de un nmero entero N import java.io.*; class Metodos03{ public static void reporteDivisores(int n) { int d; System.out.println("Los divisores del numero son :"); for(d=1;d<=n;d++) if(n%d==0) System.out.print(d+" "); System.out.println(); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num; do{ System.out.print("Ingrese numero :"); num=Integer.parseInt(br.readLine()); }while(num<=0); reporteDivisores(num); } } 4) Programa para ingresar un numero y se reporte si es primo import java.io.*; class Metodos05{ public static boolean esPrimo(int n) { int d=1; do{ d=d+1; Docente: Ing. Martn Salcedo Quiones Pagina: 26

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote }while( n%d!=0 && d*d<=n); if(d*d>n) return true; else return false; } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num; do{ System.out.print("Ingrese numero :"); num=Integer.parseInt(br.readLine()); }while(num<=0); if(esPrimo(num)) System.out.println("El numero es primo"); else System.out.println("El numero no es primo"); } } Cuando una clase tiene mtodos estticos se puede invocar a esos mtodos de la siguiente manera: NombreClase.nombreMetodo, como se hace con los mtodos de la clase Math, para la raiz cuadrada se coloca Math.sqrt(x), para la potencia Math.pow(x,n). Por ejemplo crearemos una clase llamada Aritmtica que contenga mtodos estaticos esPrimo (que verifica si un numero es primo), factorial, mcd(Calcula el m.c.d. de dos nmeros) , reporteDivisores y reporteFactoresPrimos. Estos mtodos como son estticos pueden ser llamados como: Aritmtica.nombre_metodo(parmetros) Como se ve en el programa que sigue a la clase Aritmetica class Aritmetica{ public static boolean esPrimo(int n) { int d=1; do{ d=d+1; }while(n%d!=0 && d*d<=n); if(d*d>n) return true; Docente: Ing. Martn Salcedo Quiones Pagina: 27

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote else return false; } public static int factorial(int n) { int f=1,i; for(i=1;i<=n;i++) f=f*i; return f; } public static int mcd(int a, int b) { int d=2,p=1; while(d<=a && d<=b) if(a%d==0 && b%d==0) { p=p*d; a=a/d; b=b/d; } else d++; return p; } public static void reporteDivisores(int n) { int d; System.out.println("Los divisores del numero son :"); for(d=1;d<=n;d++) if(n%d==0) System.out.print(d+" "); System.out.println(); } public static void reporteFactoresPrimos(int n) { int d=2; while(n>1) { while(n % d !=0) d=d+1; Docente: Ing. Martn Salcedo Quiones Pagina: 28

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.print(d+" "); n=n/d; } System.out.println(); } } Programa que usa la clase Aritmtica class PruebaAritmetica{ public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n; do{ System.out.print("Ingrese numero :"); n=Integer.parseInt(br.readLine()); }while(n<0); System.out.println("el Factorial es : "+Aritmetica.factorial(n)); if(Aritmetica.esPrimo(n)) System.out.println("El numero es primo"); else System.out.println("El numero no es primo"); } } Duracin y alcance de un identificador La duracin de un identificador determina cuando dicho identificador existe en la memoria. El alcance de un identificador es la porcin del programa en la que se puede hacer referencia a dicho identificador. Los identificadores que representan variables locales de un mtodo (esto es, los parmetros y la variables declaradas en el cuerpo del mtodo) tienen duracin automtica. Las variables de duracin automtica se crean cuando se ingresa en el bloque en el que se declaran, existen mientras dicho bloque est activo y se destruyen cuando se sale del bloque. Docente: Ing. Martn Salcedo Quiones Pagina: 29

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Java tambin tiene mtodos de duracin esttica. Las variables y mtodos de duracin esttica existen desde el momento en el que la clase en la que se definen se carga en la memoria para ejecutarse, hasta que el programa termina. El espacio de almacenamiento para las variables de duracin esttica se asigna e inicializa una vez cuando su clase se carga en la memoria. En el caso de los mtodos de duracin esttica comienza a existir cuando su clase se carga en la memoria. Los alcances para un identificador son alcance de clase y alcance de bloque. Una variable de ejemplar declarada fuera de cualquier mtodo tiene alcance de clase. El identificador correspondiente se conoce en todos los mtodos de la clase. Los identificadores declarados de un bloque tienen alcance de bloque. El alcance de bloque termina en la llave derecha que cierra el bloque. Los variables locales declaradas al principio de un mtodo tienen alcance de bloque, lo mismo que los parmetros del mtodo, que se consideran variables locales en ese mtodo. Cualquier bloque puede contener declaracin de variables. EJECUTANDO LA PRIMERA APLICACION 1. Crea un proyecto denominado: Sesion02_Aplicaciones

Docente: Ing. Martn Salcedo Quiones

Pagina: 30

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Observa que debes crear la clase principal Metodos01 dentro del paquete sesion02_aplicaciones. Luego dar clic en el botn de comando Terminar. 2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

3. Asi debe quedar luego de colocar las instrucciones de la primera aplicacin

Docente: Ing. Martn Salcedo Quiones

Pagina: 31

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4. Luego a proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo.

Docente: Ing. Martn Salcedo Quiones

Pagina: 32

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Ingresar el valor de un nmero y luego se mostrar lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 33

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

RECURSIVIDAD Y SOBRECARGA DE METODOS

RECURSIVIDAD Un mtodo es recursivo cuando se llama a si mismo ya sea directamente e indirectamente. Si un mtodo recursivo se invoca con un caso base, simplemente devuelve un resultado. Si el mtodo se invoca con un problema ms complejo, divide el problema en dos o ms partes conceptuales: una parte del mtodo sabe cmo resolver y una versin un poco ms pequea del problema original. Dado que este nuevo problema se asemeja al problema original, el mtodo emite una llamada recursiva para trabajar con el problema reducido. Para que la recursividad termine, cada vez que el mtodo recursivo se llama a si mismo con una versin un poco ms sencilla del problema original, la secuencia de problemas cada vez menores debe convergir hacia el caso base. Cuando el mtodo reconoce el caso base, devuelve el resultado a la llamada de mtodo previa, y se inicia una secuencia de devoluciones que termina cuando la llamada del mtodo original devuelve el resultado final.

Docente: Ing. Martn Salcedo Quiones

Pagina: 34

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Recursividad vs Iteracin Tanto la iteracin como la recursin se basan en una estructura de control.: La iteracin usa una estructura de repeticin; la recursin una estructura de seleccin. Tanto la iteracin como la recursin implican repeticin: la iteracin emplea explcitamente una estructura de repeticin; la recursin logra la repeticin mediante llamadas de mtodos repetidas Tanto la iteracin como la recursin incluyen una prueba de terminacin; la iteracin termina cuando deja de cumplirse la condicin para continuar el ciclo; la recursin termina cuando se reconoce el caso base. PROGRAMAS RESUELTOS 1) Hacer un programa para calcular el factorial de un nmero. import java.io.*; public class Recursividad01{ public static int factorial(int n) { if(n==0) return 1; else return n*factorial(n-1); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num; do{ System.out.print("Ingrese numero :"); num=Integer.parseInt(br.readLine()); }while(num<=0); System.out.println("El factorial es : "+factorial(num)); Docente: Ing. Martn Salcedo Quiones Pagina: 35

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } } Interpretacin de la programacin: El mtodo recursivo llamado factorial tiene un permetro de tipo entero llamado n. Se evala 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 mtodo factorial al darle el valor de n disminuido en 1. Si observamos la figura que se coloca al inicio de esta sesin:

En la figura se observa el mtodo Fact (que en nuestro programa se llama factorial) calcula el factorial de 3. En la primera llamada retorna 3 * Fact(3-1), el Fact(3-1) en la segunda llamada del mtodo retorna 2 * Fact(2-1) y as sucesivamente hasta que en la ltima llamada al aplicar Fact(1-1) devolver el valor de 1. En el mtodo main se crea el objeto br de tipo BufferedReader (para lectura de datos), luego se declara la variable num de tipo entero. A travs de la sentencia repetitiva se pide el ingreso del nmero para la variable num y si es un valor negativo se volver a solicitar nuevamente el ingreso de dicho nmero. Finalmente a travs del mtodo println se muestra el clculo del mtodo recursivo factorial teniendo como valor de entrada el contenido de la variable num. 2) Calcular la potencia de x elevado a la n en forma recursiva. x real y n entero positivo Docente: Ing. Martn Salcedo Quiones Pagina: 36

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

import java.io.*; class recursividad02{ public static double potencia(double x, double n) { if(n==0) return 1; else return x*potencia(x,n-1); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n; double x; System.out.print("Valor de x :"); x= Double.parseDouble(br.readLine()); do{ System.out.print("valor de n : "); n=Integer.parseInt(br.readLine()); }while(n<=0); System.out.println(x+" elevado a la "+n+" es igual a "+potencia(x,n)); } }

3) Hacer un programa para que reporte los n trminos de la serie de Fibonacci import java.io.*; class recursividad03{ public static int fibonacci(int n) { if(n==1) return 1; else if(n==2) return 1; Docente: Ing. Martn Salcedo Quiones Pagina: 37

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote else return fibonacci(n-1) + fibonacci(n-2); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n,i ; do{ System.out.print("Nmero de terminos de la serie : "); n=Integer.parseInt(br.readLine()); }while(n<=0); for(i=1;i<=n;i++) System.out.print(fibonacci(i) + " "); System.out.println(); } } 4) Programa para calcular el mximo comn divisor de dos nmeros. import java.io.*; class recursividad04{ public static int mcd(int a,int b) { if(a%b==0) return b; else return mcd(b,a%b); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int x,y; do{ System.out.print("Ingrese primer numero :"); x=Integer.parseInt(br.readLine()); }while(x<=0); do{ Docente: Ing. Martn Salcedo Quiones Pagina: 38

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.print("Ingrese segundo numero :"); y=Integer.parseInt(br.readLine()); }while(y<=0); System.out.println("El mcd de "+x+" y "+y+" es : "+mcd(x,y)); } } 5) Programa para reportar un numero al reves import java.io.*; class recursividad05{ public static void reves(int n) { System.out.print(n % 10); if( n/10 !=0 ) reves(n/10); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num; do{ System.out.print("Ingrese numero :"); num=Integer.parseInt(br.readLine()); }while(num<=0); System.out.print("Numero al reves :"); reves(num); System.out.println(); } }

6) Programa para convertir un nmero de base 10 a base b (entre 2 y 9) import java.io.*; class recursividad06{ Docente: Ing. Martn Salcedo Quiones Pagina: 39

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public static void conversionBase(int n, int b) { if(n<b) System.out.print(n); else { conversionBase(n/b,b); System.out.print(n%b); } } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num,b; do{ System.out.print("Ingrese numero :"); num=Integer.parseInt(br.readLine()); }while(num<=0); do{ System.out.print("Base a la que quiere convertir : "); b=Integer.parseInt(br.readLine()); }while(b<2 || b>9); System.out.print("El numero "+num+" en base "+b+" es : "); conversionBase(num,b); System.out.println(); } } SOBRECARGA DE METODOS Java permite definir varios mtodos con el mismo nombre en tanto dichos mtodos tengan diferentes juegos de parmetros (con base en el nmero y el orden de los parmetros). Esto se denomina sobrecarga de mtodos. Cuando se invoca un mtodo sobrecargado, el compilador de Java selecciona el mtodo adecuado examinando el nmero, los tipos y el orden de los argumentos en la llamada. La sobrecarga de mtodos suele utilizarse para

Docente: Ing. Martn Salcedo Quiones

Pagina: 40

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote crear varios mtodos con el mismo nombre que realizan tareas similares, pero sobre datos de diferentes tipos. import java.io.*; class sobrecarga01{ public static int cuadrado(int x) { return x*x; } public static float cuadrado(float x) { return x*x; } public static double cuadrado(double x) { return x*x; } public static void main(String args[]) throws IOException { int a=3; float b=3.4f; double c=12.5; System.out.println("El cuadrado de "+a+ " es : "+cuadrado(a)); System.out.println("El cuadrado de "+b+" es : "+cuadrado(b)); System.out.println("El cuadrado de "+c+" es : "+cuadrado(c)); } } EJECUTANDO LA PRIMERA APLICACION 1. Crea un proyecto denominado: Sesion03_Aplicaciones

Docente: Ing. Martn Salcedo Quiones

Pagina: 41

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Observa que debes crear la clase principal Recursividad01 dentro del paquete sesion03_aplicaciones. Luego dar clic en el botn de comando Terminar 2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

Docente: Ing. Martn Salcedo Quiones

Pagina: 42

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

3. As debe quedar luego de colocar las instrucciones de la primera aplicacin.

4. Luego proceder a ejecutar la aplicacin. Docente: Ing. Martn Salcedo Quiones Pagina: 43

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Posteriormente dar clic en Ejecutar archivo.

Ingresar el valor numrico y se visualizar el factorial.

Docente: Ing. Martn Salcedo Quiones

Pagina: 44

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

ARREGLOS UNIDIMENSIONALES EN METODOS

ARREGLOS Un arreglo es un grupo contiguo de posiciones de memoria relacionadas entre s. Estas posiciones estn relacionadas por el hecho de que todas tienen el mismo nombre y el mismo tipo. Para referirnos a una posicin o elemento en particular dentro del arreglo, especificamos el nombre del arreglo y el subndice del elemento. Un subndice puede ser un entero o una expresin entera. Si un programa emplea una expresin como subndice, la expresin se evala para determinar el elemento especfico del arreglo. Los arreglos de Java siempre comienzan con el elemento 0. Declaracin de un arreglo En java existen 2 formas de declarar arreglos. Tipo de dato identificador[]; Tipo de dato []identificador; Por ejemplo si se desea declarar un arreglo de enteros, se podra hacer de esta manera: int numeros[]; int []numeros; Pagina: 45

Docente: Ing. Martn Salcedo Quiones

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Creacin de un Arreglo Despus de declarar un arreglo, se tiene que crearlo. Para crearlo se coloca la palabra clave new seguida del tipo de dato y del tamao del arreglo entre corchetes.. Ejm: numeros = new int[100]; // se esta creando un arreglo de 100 elementos enteros Tambin se puede declarar y crear un arreglo en una sola instruccin. Por ejemplo: double promedios[] = new double[50]; Se est declarando y creando 50 elementos de tipo double Inicializacin de un arreglo En Java se pueden inicializar arreglos al declararlos. Cuando se especifica valores iniciales dentro de la declaracin de un arreglo, Java realiza la operacin new y define el tamao del arreglo de forma automtica. Ejemplo: int arreglo1 [] = { 1, 2, 3, 4, 5}; boolean arreglo[] = { true, false, true}; String meses[] = { Enero, Febrero, Marzo, Abril, Mayo, Junio}; Acceso a los arreglos Cada valor dentro de un arreglo se conoce como elemento del arreglo. Para acceder a un elemento de un arreglo especifique el nombre del arreglo con el ndice del elemento entre corchetes []. Docente: Ing. Martn Salcedo Quiones Pagina: 46

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Ejemplo: int numeros = { 12, 20, 60, 80, 100 }; for(int indice = 0; indice < 5 ; indice++) System.out.println(numeros[indice]); En este ejemplo el tamao del arreglo es 5. En java el ndice del primer elemento del arreglo es cero y la ltima posicin es el tamao del arreglo. Debido a esto, para iterar todos los elementos del arreglo, el programa utiliza loa valores 0 a 4 para la variable del ciclo. Como obtener la longitud de un arreglo En java un arreglo es un objeto. La nica variable miembro de un objeto arreglo es la variable length (longitud), que contiene el tamao del arreglo. La variable length es de solo lectura, ya que el tamao del arreglo no puede cambiar despus de crearlo aquel. Ejemplo : El siguiente cdigo muestra cmo utilizar la variable length dentro de un ciclo for que itera por todos los elementos del arreglo. int arreglo[] = {12, 20, 60, 80, 90}; for(indice = 0; indice<arreglo.length; indice++) System.out.println(arreglo[indice]); Referencias a arreglos Java utiliza referencias para apuntar a los arreglos. Por ejemplo: Las siguientes instrucciones utilizan la referencia arreglo para acceder a dos arreglos distintos. import java.io.*; class ReferenciaArreglo{ Docente: Ing. Martn Salcedo Quiones Pagina: 47

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

public static void main(String args[]) { int primero[] = {1, 2, 3, 4}; int segundo[] = {5, 6, 7, 8, 9, 10}; int arreglo[]; arreglo=primero; System.out.println("Primer Arreglo "); for(int indice=0;indice<arreglo.length;indice++) System.out.println(arreglo[indice]); arreglo=segundo; System.out.println("Segundo Arreglo "); for(int indice=0;indice<arreglo.length;indice++) System.out.println(arreglo[indice]); } }

PROGRAMAS RESUELTOS 1) Hacer un programa para ingresar n valores reales en un arreglo y los muestre en la pantalla, adems reportar el mayor, el menor y el promedio. import java.io.*; public class Arreglo01{ public static void main(String arg[])throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); double x[],mayor,menor,promedio,suma=0; int n,i; do{ System.out.print("Cantidad de elementos del arreglo : "); n=Integer.parseInt(br.readLine()); }while(n<=0 || n>100); Docente: Ing. Martn Salcedo Quiones Pagina: 48

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

x=new double[n]; for(i=0; i<n;i++) { System.out.print("x["+i+"]: "); x[i]=Double.parseDouble(br.readLine()); } System.out.println("Elementos del arreglo"); for(i=0; i<n;i++) System.out.println("x["+i+"]: "+x[i]); // Calculo del mayor y menor mayor=menor=x[0]; for(i=1; i<n; i++) if (x[i]>mayor) mayor=x[i]; else if(x[i]<menor) menor=x[i]; // Calculo de la suma de los elementos for(i=0; i<n; i++) suma=suma+x[i]; promedio=suma/n; System.out.println("El mayor es " +mayor); System.out.println("El menor es:"+ menor); System.out.println("El promedio es : "+ promedio); } } Interpretacin de la programacin: En el mtodo main se inicia creando el objeto br del tipo BuffreredReader, luego se declara variables de memoria de tipo double. Se aprecia la variable x[] que es una arreglo o vector que todava no se define el tamao o el nmero de elementos. Luego se declara dos variables enteras n, i. A travs de la sentencia repetitiva se valida el valor de n dentro de un rango de 1 a 100, es Docente: Ing. Martn Salcedo Quiones Pagina: 49

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote decir, no se acepta un valor menor o igual a 0 ni un nmero mayor de 100. Posteriormente se crea el arreglo x con la instruccin x=new double[n]; ya que se define el tamao del arrglo x con el valor de la variable n. A continuacin 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 interaccin solicitar el ingreso de un nmero, la misma que se almacenar en el elemento correspondiente del arreglo. Cabe sealar que el objeto br con su mtodo readLine() lee el dato como cadena (String) entonces existe la necesidad de hacer la conversin, para ello se usa el mtodo parseDouble de la clase Double que permite convertir el dato ingresado en valor numrico double. Luego se imprime los valores ingresados usando nuevamente la sentencia for. Para el clculo del mayor y menor nmero ingresados en el arreglo vector se inicializa las variables con la instruccin mayor=menor=x[0]; donde la variable mayor y la variable menor recibe el valor del primer elemento del arreglo x. A continuacin con la sentencia for se recorre por cada elemento del arreglo x desde el segundo elemento hasta el ltimo elemento del arreglo. En cada interaccin 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 evaluacin, si es falso se cambia el valor del contenido en la variable menor. Posteriormente a travs de otra sentencia for se procede a realizar la suma de todos los nmeros contenidos en el arreglo y se va acumulando en la variable suma, que previamente se inicializ con el valor de cero. A continuacin, se calcula el promedio y se muestra los resultados obtenidos.

2) Programa para ingresar n valores reales en un arreglo y calcular la desviacin standard. import java.io.*; public class arre02{ Docente: Ing. Martn Salcedo Quiones Pagina: 50

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public static void main(String arg[])throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); double x[],suma=0,p,ds; int n,i; do{ System.out.print("Cantidad de elementos del arreglo : "); n=Integer.parseInt(br.readLine()); }while(n<=0); x=new double[n]; for(i=0; i<n;i++) { System.out.print("x["+i+"]: "); x[i]=Double.parseDouble(br.readLine()); } System.out.println("Elementos del arreglo"); for(i=0; i<n;i++) System.out.println("x["+i+"]: "+x[i]); for(i=0; i<n; i++) suma=suma+x[i]; p=suma/n; suma=0; for(i=0;i<n;i++) suma=suma + Math.pow(x[i]-p,2); ds=Math.sqrt(suma/(n-1)); System.out.println("La desviacion standard es : "+ds); } } 3) Programa para ingresar n valores reales en un arreglo y luego invierta el arreglo. Docente: Ing. Martn Salcedo Quiones Pagina: 51

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote import java.io.*; public class arre03{ public static void main(String arg[])throws IOException { double x[],temp; int n,i,j; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); do{ System.out.print("Cantidad de elementos del arreglo : "); n=Integer.parseInt(br.readLine()); }while(n<=0 || n>100); x=new double[n]; for(i=0; i<n;i++) { System.out.print("x["+i+"]: "); x[i]=Double.parseDouble(br.readLine()); } System.out.println("Arreglo Ingresado"); for(i=0; i<n;i++) System.out.println("x["+i+"]: "+x[i]); for(i=0,j=n-1;i<n/2;i++,j--) { temp=x[i]; x[i]=x[j]; x[j]=temp; } System.out.println("Arreglo Invertido"); for(i=0; i<n;i++) System.out.println("x["+i+"]: "+x[i]); } } Docente: Ing. Martn Salcedo Quiones Pagina: 52

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4) Programa para ingresar 2 vectores de n elementos reales cada uno y reportar el producto escalar de ellos import java.io.*; public class arre04{ public static void main(String arg[])throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); double x[],y[],pe; int n,i; do{ System.out.print("Numero de elementos de los vectores : "); n=Integer.parseInt(br.readLine()); }while(n<=0); x=new double[n]; y=new double[n]; System.out.println("Ingreso de datos del primer vector"); for(i=0; i<n;i++) { System.out.print("x["+i+"]: "); x[i]=Double.parseDouble(br.readLine()); } System.out.println("Ingreso de datos del segundo vector"); for(i=0; i<n;i++) { System.out.print("y["+i+"]: "); y[i]=Double.parseDouble(br.readLine()); } System.out.println("Elementos del primer vector"); for(i=0; i<n;i++) System.out.println("x["+i+"]: "+x[i]); Docente: Ing. Martn Salcedo Quiones Pagina: 53

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.println("Elementos del Segundo vector"); for(i=0; i<n;i++) System.out.println("y["+i+"]: "+y[i]); pe=0; for(i=0;i<n;i++) pe=pe+x[i]*y[i]; System.out.println("El Producto escalar es : " +pe); } } 5) Programa para ingresar n nombres en un arreglo y luego Ingresar un Nombre y buscar si este se encuentra en el arreglo ingresado. import java.io.*; public class arre05{ public static void main(String arg[])throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String nombres[],nombus; int n,i,pos; do{ System.out.print("Cantidad de nombres a ingresar : "); n=Integer.parseInt(br.readLine()); }while(n<=0); nombres=new String[n]; for(i=0; i<n;i++) { System.out.print("Nombre["+i+"]: "); nombres[i]=br.readLine(); } System.out.println("Elementos del arreglo"); for(i=0; i<n;i++) System.out.println("Nombre["+i+"]: "+nombres[i]); Docente: Ing. Martn Salcedo Quiones Pagina: 54

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.print("nombres a buscar : "); nombus=br.readLine(); pos=-1; for(i=0;i<n ; i++) if(nombres[i].compareToIgnoreCase(nombus)==0) { pos=i; break; } if(pos!=-1) System.out.println("Nombre se encuentra en la posicin"+pos); else System.out.println("Nombre no se encuentra en el arreglo"); } } EJECUTANDO LA PRIMERA APLICACION

1. Crea un proyecto denominado: Sesion04_Aplicaciones

Observa que debes crear la clase principal Arreglo01 dentro del paquete sesion04_aplicaciones. Luego dar clic en el botn de comando Terminar.

Docente: Ing. Martn Salcedo Quiones

Pagina: 55

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

2. Ahora se observa el entorno de NetBeans listo para colocar la programacin


de la primera aplicacin.

3. Posteriormente colocar la programacin de la primera aplicacin.

4. Luego proceder a ejecutar la aplicacin.

Docente: Ing. Martn Salcedo Quiones

Pagina: 56

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Posteriormente dar clic en Ejecutar archivo

Ingresar el valor de la base y luego de la altura y se lograr observar lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 57

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

AUTOEVALUACION
a) Responde a las siguientes preguntas: 1. Clase que pertenece al paquete java.io y permite hacer lectura de datos desde el teclado: ___________________ 2. Mtodo que permite calcular la potencia dado la base y el exponente: ______________ 3. Mtodo que devuelve el nmero de caracteres o la longitud de caracteres de una cadena de texto: ___________________ 4. Mtodo que permite evaluar si una cadena 1 es igual a una cadena 2 sin importar las maysculas o minsculas: _________________ 5. Los mtodos que no retornan valor usan la instruccin return (verdadero o falso): _____________ b) Desarrolla las siguientes aplicaciones:

1. Construye una aplicacin que permita el ingreso de una cantidad de segundos y muestre su equivalencia en das, horas, minutos y segundos. Posteriormente construye una aplicacin que permita ingresar una cantidad de soles y muestre su equivalencia en billetes de 200 soles, de 100 soles, 50 soles, 20 soles, 10 soles y en monedas de 5 soles, 2 soles y de 1 sol. 2. Construye una aplicacin que permita el ingreso de una cantidad de segundos y muestre su equivalencia en das, horas, minutos y segundos. Esta vez lo haces creando un mtodo. 3. Construye una aplicacin que permita sumar los digitos de un numero entero usando recursividad de mtodos. 4. Construye una aplicacin que permita el ingreso de 5 numeros en unvector A y 5 numeros en un vector B. Luego coloque todos los nmeros tanto del vector A y del vector B en un vector C. Finalmente muestre la suma y el promedio de todos los nmero.

Docente: Ing. Martn Salcedo Quiones

Pagina: 58

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CAPITULO II
PROGRAMACION ORIENTADA A OBJETOS

Docente: Ing. Martn Salcedo Quiones

Pagina: 59

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CLASES Y SUS MIEMBROS

CLASE Una clase es una plantilla o prototipo que define las variables y los mtodos comunes a todos los objetos de cierto tipo. Las clases definen estado (variables) y comportamiento (mtodos) de todos los objetos. Las clases son el mecanismo por el que se pueden crear nuevos Tipos en Java. Las clases son el punto central sobre el que giran la mayora de los conceptos de la Orientacin a Objetos. Una clase es una agrupacin de datos y de cdigo (mtodos) que acta sobre esos datos, a la que se le da un nombre. Una clase contiene: Datos (se denominan Datos Miembro). Estos pueden ser de tipos primitivos o referencias. Mtodos (se denominan Mtodos Miembro). La sintaxis general para la declaracin de una clase es: modificadores class nombre_clase { declaraciones_de_miembros ; Docente: Ing. Martn Salcedo Quiones Pagina: 60

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } Los modificadores son palabras clave que afectan al comportamiento de la clase. Por ejemplo crearemos la clase Rectangulo cuyos atributos son base y altura, ademas queremos calcular el area, permetro y diagonal del Rectangulo import java.io.*; class Rectangulo{ private double base; private double altura; public Rectangulo(double b, double h) // Constructor { base = b; altura=h; } public void setBase(double b) { base=b; } public void setAltura(double h) { altura=h; } public double getBase() { return base; } public double getAltura() { return altura; } public double area() { return base*altura; } public double perimetro() { Docente: Ing. Martn Salcedo Quiones Pagina: 61

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote return 2*base+2*altura; } public double diagonal() { return Math.sqrt(Math.pow(base,2)+Math.pow(altura,2)); } public String toString() { return "base = "+base+" "+altura; } } La clase Rectngulo tiene 2 atributos base y altura los cuales son privados esto quiere decir que estas 2 variables son visibles en la clase Rectngulo. El primer mtodo que se ha implementado es el constructor, este mtodo se llama igual que la clase y no devuelve ningn valor y permite inicializar los atributos de la clase. Este mtodo se llama en el momento de crear un objeto. Como los atributos base y altura son privados, para que los usuarios que usan los objetos puedan modificar los atributos se crean los mtodos setBase(double b) y setAltura(double h). Y si deseamos obtener los valores de los atributos creamos los mtodos getBase() y getAltura(). Adems se han creado los mtodos area(), permetro() y diagonal() que permiten calcular el area, permetro y diagonal del rectangulo. En el mtodo toString() (a cadena) se crea una cadena con la informacin de los atributos de la clase. En realidad podemos colocar cualquier informacin. public class pruebaRectangulo{ public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double b, h; Rectangulo R; System.out.print("Ingrese base : "); b=Double.parseDouble(br.readLine()); Docente: Ing. Martn Salcedo Quiones Pagina: 62

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.print("Ingrese 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()); } } Dentro del mtodo main de la clase PruebaRectangulo se ha declarado dos variables de tipo primitivo b,h y una variable R que es de tipo Rectangulo. Al colocar : Rectangulo R; Se est declarando a R como un Objeto de la Clase Rectangulo. La declaracin no crea nuevos objetos. En la declaracin (Rectangulo R) se declara una variable llamada R la cual ser usada para referirnos a un Objeto Rectangulo. La referencia est vaca. Una referencia vaca es conocida como referencia nula. Al colocar : R = new Rectangulo(3,4); Con el operador new creamos un objeto de la clase Rectangulo.El operador new instancia una clase asignando memoria para el nuevo Objeto. El operador new requiere una llamada a un constructor de la clase a instanciar. El constructor inicializa el nuevo objeto.El operador new retorna una referencia al objeto creado. Una vez creado el objeto para poder llamar a sus mtodos usamos lo siguiente objeto.nombredeMtodo. Por ejemplo para calcular el area usamos R.area(), para calcular el permetro R.perimetro() y para calcular la diagonal R.diagonal(). Al escribir System.out.println(Rectangulo : +R); en realidad se esta llamando tcitamente al mtodo toString de la clase R. Si se deseara modificar el atributo base del Objeto se debe usar el mtodo setBase por ejemplo si despus de crear el objeto queremos que base tenga el Docente: Ing. Martn Salcedo Quiones Pagina: 63

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote valor 10, se colocara la siguiente instruccin: R.setBase(10); lo mismo se hace si se quiere modificar la altura. Si se desea saber el valor de algn atributo del objeto se usa los mtodos get, por ejemplo si quisiera imprimir el valor de la base del objeto R se tendra que escribir lo siguiente : System.out.println(La base es : +R.getBase());

PROGRAMAS RESUELTOS 1) Crear la clase Cilindro con atributos radio y altura y que se pueda calcular el area y el volumen del cilindro. import java.io.*; class Cilindro{ private double radio; private double altura; public Cilindro(double r, double a) { radio=r; altura=a; } public void setRadio(double r) { radio=r; } public void setAltura(double a) { altura=a; } public double getRadio() Docente: Ing. Martn Salcedo Quiones Pagina: 64

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { return radio; } public double getAltura() { return altura; } public double area() { return 2*Math.PI*Math.pow(radio,2)+2*Math.PI*radio*altura; } public double volumen() { return Math.PI*Math.pow(radio,2)*altura; } public String toString() { return "Radio = "+radio+" Altura = "+altura; } } public class PruebaCilindro { public static void main(String args[]) throws IOException {
BufferedReader InputStreamReader(System.in)); br = new BufferedReader(new

double r, h; Cilindro C; System.out.print("Ingrese radio: "); r=Double.parseDouble(br.readLine()); System.out.print("Ingrese altura : "); h=Double.parseDouble(br.readLine()); Docente: Ing. Martn Salcedo Quiones Pagina: 65

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote C = new Cilindro(r,h); System.out.println("Cilindro : "+C); System.out.println("Area : "+C.area()); System.out.println("Volumen : "+C.volumen()); } }

Interpretacin de la programacin: Se crea clase Cilindro con los atributos radio y altura de tipo double. Luego se crea el mtodo constructor Cilindro (los mtodos constructores se ver en la octava sesin) que permite establecer los valores de los dos atributos a travs de los parmetros r y a. Luego se construye los mtodos setRadio() y setAltura() que permite cambiar el valor del atributo radio y altura respectivamente. Con los mtodos getRadio() y getAltura() se obtiene el contenido del atributo radio y altura respectivamente. Con los mtodos area() y volumen() se calcula el rea y el volumen del cilindro. El mtodo toString() permite imprimir el radio y la altura del cilindro segn el contenido de los atributos. Con la clase PruebaCilindro, en el mtodo main se crea la variable objeto br del tipo BufferedReader, 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 instruccin C = new Cilindro(r,h); se crea el objeto C (que previamente haba sido declarado) con el mtodo constructor Cilindro pasando los valores ingresados del radio y la altura a travs de las variables de memoria r y h. A continuacin con la instruccin System.out.println("Cilindro : "+C); se imprime la expresin Cilindro: con lo programado en el mtodo toString(), es decir, es lo mismo colocar C que colocar C.toString(). Finalmente se imprime el rea y el volumen del cilindro usando los mtodos area() y volumen() invocados desde el objeto C. 2) Crear la clase numeros que tenga como atributos dos numeros y se calcule su suma, resta, multiplicacin, divisin. Docente: Ing. Martn Salcedo Quiones Pagina: 66

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote import java.io.*; class Numeros{ private double numero1; private double numero2; public Numeros(double n1,double n2) { numero1=n1; numero2=n2; } public void setNumero1(double n1) { numero1=n1; } public void setNumero2(double n2) { numero2=n2; } public double getNumero1() { return numero1; } public double getNumero2() { return numero2; } public double suma() { return numero1+numero2; } public double resta() { return numero1-numero2; Docente: Ing. Martn Salcedo Quiones Pagina: 67

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } public double multiplicacion() { return numero1*numero2; } public double division() { return numero1/numero2; } public String toString() { return "numero1 = "+numero1+" numero2 = "+numero2; } } public class PruebaNumeros { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double n1,n2; Numeros A; System.out.print("Ingrese primero Numero : "); n1=Double.parseDouble(br.readLine()); System.out.print("Ingrese segundo Numero: "); n2=Double.parseDouble(br.readLine()); A = new Numeros(n1,n2); System.out.println("Numeros : "+A); System.out.println("suma : "+A.suma()); System.out.println("resta : "+A.resta()); System.out.println("Multiplicacion : "+A.multiplicacion()); System.out.println("Division : "+A.division()); } } Docente: Ing. Martn Salcedo Quiones Pagina: 68

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote 3) Crear la clase Alumno que tenga como atributos nombre, nota1 y nota2 y permita calcular el promedio y su condicion (aprobado o desaprobado) import java.io.*; class Alumno{ private String nombre; private double nota1; private double nota2; public Alumno(String nom, double n1, double n2) { nombre=nom; nota1=n1; nota2=n2; } public void setNombre(String nom) { nombre=nom; } public void setNota1(double n1) { nota1=n1; } public void setNota2(double n2) { nota2=n2; } public String getNombre() { return nombre; } public double getNota1() { Docente: Ing. Martn Salcedo Quiones Pagina: 69

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote return nota1; } public double getNota2() { return nota2; } public double promedio() { return (nota1+nota2)/2; } public String condicion() { if(promedio()>=10.5) return "aprobado"; else return "desaprobado"; } public String toString() { return "nombre : "+nombre +"nota1 = "+nota1+" nota2 = "+nota2; } } public class PruebaAlumno{ public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String nom; double n1,n2; Alumno A; System.out.print("Ingrese nombre : "); nom= br.readLine(); System.out.print("Ingrese nota1 : "); n1=Double.parseDouble(br.readLine()); System.out.print("Ingrese nota2 : "); Docente: Ing. Martn Salcedo Quiones Pagina: 70

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote n2=Double.parseDouble(br.readLine()); A = new Alumno(nom,n1,n2); System.out.println("Alumno : "+A); System.out.println("Promedio : "+A.promedio()); System.out.println("Condicion : "+A.condicion()); } }

4) Crear la clase Trabajador que tenga como atributos nombre, preciHora y horasTrabajadas y se calcule salario Bruto, impuestos( 10% del Salario Bruto) y salario Neto (Salario Bruto Impuestos) import java.io.*; class Trabajador{ private String nombre; private double horasTrabajadas; private double precioHora; public Trabajador(String nom, double ht, double ph) { nombre=nom; horasTrabajadas=ht; precioHora=ph; } public void setNombre(String nom) { nombre=nom; } public void setHorasTrabajadas(double ht) { horasTrabajadas=ht; } public void setPrecioHora(double ph) { Docente: Ing. Martn Salcedo Quiones Pagina: 71

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote precioHora=ph; } public String getNombre() { return nombre; } public double getHorasTrabajadas() { return horasTrabajadas; } public double getPrecioHora() { return precioHora; } public double salarioBruto() { return precioHora*horasTrabajadas; } public double impuestos() { return 0.10*salarioBruto(); } public double salarioNeto() { return salarioBruto()-impuestos(); } public String toString() {
return "nombre : "+nombre+ " Horas Trabajadas : "+horasTrabajadas+" Precio Hora : "+precioHora;

} } Docente: Ing. Martn Salcedo Quiones Pagina: 72

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

public class PruebaTrabajador { public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String nom; double ph,ht; Trabajador T; System.out.print("Ingrese nombre : "); nom= br.readLine(); System.out.print("Ingrese numero de horas Trabajadas : "); ht=Double.parseDouble(br.readLine()); System.out.print("Ingrese precio de la Hora : "); ph=Double.parseDouble(br.readLine()); T = new Trabajador(nom,ht,ph); System.out.println("Trabajador : "+T); System.out.println("Salario Bruto : "+T.salarioBruto()); System.out.println("Impuestos : "+T.impuestos()); System.out.println("Salario Neto : "+T.salarioNeto()); } } 5) Crear la clase Mvil con atributos velocidad Inicial, aceleracin y tiempo y se pueda calcular el espacio recorrido por el mvil import java.io.*; class Movil{ private double velocidadInicial; private double aceleracion; private double tiempo; public Movil(double vi, double a, double t) { velocidadInicial=vi; aceleracion=a; tiempo=t; Docente: Ing. Martn Salcedo Quiones Pagina: 73

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } public void setVelocidadInicial(double vi) { velocidadInicial=vi; } public void setAceleracion(double a) { aceleracion=a; } public void setTiempo(double t) { tiempo=t; } public double getVelocidadInicial() { return velocidadInicial; } public double getAceleracion() { return aceleracion; } public double getTiempo() { return tiempo; } public String toString() { return "Velocidad Inicial = "+velocidadInicial+" Aceleracion = "+aceleracion+"Tiempo = "+tiempo; } public double espacioRecorrido() Docente: Ing. Martn Salcedo Quiones Pagina: 74

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { return velocidadInicial*tiempo+(1.0/2.0)*aceleracion*Math.pow(tiempo,2); } } public class PruebaMovil { public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

double vi,a,t; Movil M; System.out.print("Ingrese velocidad Inicial : "); vi=Double.parseDouble(br.readLine()); System.out.print("Ingrese aceleracion : "); a=Double.parseDouble(br.readLine()); System.out.print("Ingrese tiempo : "); t=Double.parseDouble(br.readLine()); M = new Movil(vi,a,t); System.out.println("Movil : "+M); System.out.println("Espacio Recorrido : "+M.espacioRecorrido()); } }

EJECUTANDO LA PRIMERA APLICACION 1. Crea un proyecto denominado: Sesion05_Aplicaciones

Docente: Ing. Martn Salcedo Quiones

Pagina: 75

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Observa que debes crear la clase principal PruebaCilindro dentro del paquete sesion05_aplicaciones. Luego dar clic en el botn de comando Terminar. 2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

3. As debe quedar luego de colocar las instrucciones de la primera aplicacin. Docente: Ing. Martn Salcedo Quiones Pagina: 76

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4. Luego a proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo.

Docente: Ing. Martn Salcedo Quiones

Pagina: 77

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Ingresar el valor de la radio y la altura y se lograr observar lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 78

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

RELACIONES ENTRE CLASES

Un conjunto de objetos aislados tiene escasa capacidad de resolver un problema. En una aplicacin til los objetos colaboran e intercambian informacin, mantienen distintos tipos de relaciones entre ellos. A nivel de diseo podemos distinguir entre 5 tipos de relaciones bsicas entre clases de objetos: dependencia, asociacin, agregacin, composicin y herencia. La dependencia es la relacin menos importante, simplemente refleja que entre dos clases de objetos existe una posible colaboracin temporal con algn propsito. Una dependencia puede indicar la utilizacin de un objeto de una clase como argumento de una operacin o en su implementacin. En cambio, la asociacin es la relacin ms importante y ms comn. Refleja una relacin entre dos clases independientes que se mantiene durante la vidade los objetos de dichas clases o al menos durante un tiempo prolongado. En UML suele indicarse el nombre de la relacin, el sentido de dicha relacin y las cardinalidades en los dos extremos. Veamos el siguiente diagrama de clases: Docente: Ing. Martn Salcedo Quiones Pagina: 79

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Diagrama de clases N 1

Se observa la clase Pedido que tiene como atributos a numero (de tipo entero), fecha (de tipo cadena) y cliente (de tipo cadena). Tiene como operaciones o mtodos a Pedido(), adicionarDetalle(), obtenerDetalle() y calcularTotalPedido(). La segunda clase llamada DetallePedido tiene como atributos a cantidad (de tipo entero) y precio (de tipo flotante), como nico mtodo tiene a DetallePedido(). Existe una relacin entre la clase de Pedido y DetallePedido que consiste que cada Pedido debe estar compuesto de uno a muchos Detalle de Pedidos. Veamos otro diagrama de clases:

Docente: Ing. Martn Salcedo Quiones

Pagina: 80

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Diagrama de clases N 2

Se observa la clase Almacen que tiene como nico atributo nombre (de tipo cadena) y sus mtodos son: Almacen(), adiconarProducto(), obtenerProducto(), adicionarEmpleado() y obtenerEmpleado(). La segunda clase llamada Producto tiene como atributos a nombre (de tipo cadena), stock (de tipo entero) y precio (de tipo flotante) y como nico mtodo Producto(). Existe una relacin entre la clase mAlmacen y la clase Producto que consiste que cada Almacen puede tener uno o muchos productos. Una asociacin se implementa en Java introduciendo referencias a objetos de la clase destino de la relacin como atributos de la clase origen. Si la relacin tiene una cardinalidad superior a uno entonces ser necesario utilizar un arreglo o una estructura de datos. Normalmente la conexin entre los objetos se realiza recibiendo la referencia de uno de ellos en el constructor u otro operacin similar del otro. Veamos el siguiente cdigo escrito en Java:

Docente: Ing. Martn Salcedo Quiones

Pagina: 81

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Se tiene la clase Cliente con los atributos nombre, apellidos, direccion, localidad y fNacimiento (ver en la llave correpondiente a 1). Tenemos como mtodos a Cliente(), nombreCompleto() y direccionCompleta() (ver en 2). Se tiene la clase Cuenta que tiene como atributos a numero, titular (de tipo Cliente ver flecha anaranjada), saldo e interesAnual (ver en la llave correpondiente a 3) . Como mtodos tiene a Cuenta y a leerTitular() (ver en 4). La mayor novedad en este ejemplo es que la Clase Cuenta tiene un atributo llamado titular que es de tipo Cliente, es decir, que este atributo titular es un objeto de la Clase Cliente y por lo tanto contiene a su vez a los atributos de Cliente y con la posibilidad de usar sus mtodos.

PROGRAMAS RESUELTOS Docente: Ing. Martn Salcedo Quiones

Pagina: 82

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

3) Crear la clase Facultad con los atributos codigofac y nombre y luego la clase EscuelaPropfesional con los atributos codigoesc, nombre, facultad. Luego procede a ingresar los datos de dos escuelas profesionales. import java.io.*; class Facultad { String codigofac; String nombre; public Facultad(String cod, String nom) { codigofac=cod; nombre=nom; } } class EscuelaProfesional { String codigoesc; String nombre; Facultad facultad; public EscuelaProfesional(String cod, String nom, Facultad f) { codigoesc=cod; nombre=nom; facultad=f; } public String toString() { return "La escuela profesional "+nombre+" pertenece a la facultad de "+facultad.nombre; } } Docente: Ing. Martn Salcedo Quiones Pagina: 83

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public class RelacionClases01 { public static void main(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String codesc, nomesc, codfac, nomfac; int i; System.out.println("DATOS DE LA PRIMERA ESCUELA PROFESIONAL"); System.out.print("Ingrese el codigo de la escuela profesional : "); codesc=br.readLine(); System.out.print("Ingrese el nombre de la escuela profesional : "); nomesc=br.readLine(); System.out.print("Ingrese el codigo de facultad : "); codfac=br.readLine(); System.out.print("Ingrese el nombre de facultad : "); nomfac=br.readLine(); Facultad F1=new Facultad(codfac,nomfac); EscuelaProfesional EP1=new EscuelaProfesional(codesc,nomesc,F1); System.out.println(""); System.out.println("DATOS DE LA SEGUNDA ESCUELA PROFESIONAL"); System.out.print("Ingrese el codigo de la escuela profesional : "); codesc=br.readLine(); System.out.print("Ingrese el nombre de la escuela profesional : "); nomesc=br.readLine(); System.out.print("Ingrese el codigo de facultad : "); codfac=br.readLine(); System.out.print("Ingrese el nombre de facultad : "); nomfac=br.readLine(); Facultad F2=new Facultad(codfac,nomfac); EscuelaProfesional EP2=new EscuelaProfesional(codesc,nomesc,F2); System.out.println(""); System.out.println(EP1); System.out.println(EP2); } } Docente: Ing. Martn Salcedo Quiones Pagina: 84

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote 4) Tomando el diagrama de clases N 2 proceder a ingresar datos de productos. Hacer uso de arreglos o vectores. Crear un archivo Almacen.java y colocar el siguiente cdigo: public class Almacen { //Atributos propios de la clase private String nombre; //Atributos resultado de la relacion con la clase Producto private int nproductos; private Producto[] productos; public Almacen(String nom) { nombre=nom; //Creacion del arreglo de objetos producto nproductos = 0; productos = new Producto[100]; } public String adicionarProducto(Producto prod) { //Variable que nos mostrar si realmente se registr el producto String rpta; //Consulta si el arreglo tiene menos de 100 items if (nproductos < 100) { //Si tiene menos de 100 items lo agrega al arreglo productos[nproductos] = prod; //Incremente la cantidad de elementos que tiene el arreglo nproductos++; //Un mensaje diciendo que se registro el producto rpta = "Se registro el producto"; } else { //Un mensaje diciendo que no se pudo registrar rpta = "No se registro el producto"; } return rpta; } Docente: Ing. Martn Salcedo Quiones Pagina: 85

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public Producto obtenerProducto(int indice) {
//El indice tiene que ser menor a la cantidad de elementos que tenemos en el arreglo

if (indice < 0 || indice >= nproductos) { //Si el indice esta fuera del rango return null; } else { //Retorma el elemento en la posicion que deseamos return productos[indice]; } } public int getNproductos() { return nproductos; } public String getNombre() { return nombre; } } Crear un archivo Producto.java y colocar el siguiente cdigo: public class Producto { //Atributos de la clase private String nombre; private float precio; private int stock; public Producto(String nom, int cant,float pre ) { nombre = nom; precio = pre; stock = cant; } //Metodos Set y Get public String getNombre() { return nombre; } Docente: Ing. Martn Salcedo Quiones Pagina: 86

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public void setNombre(String nombre) { this.nombre = nombre; } public int getStock() { return stock; } public void setStock(int s) { stock = s; } public float getPrecio() { return precio; } public void setPrecio(float p) { precio = p; } public String toString() { return "Producto{" + "Nombre=" + nombre + ", Precio=" + precio + ", Stock=" + stock + '}'; } } Crear el archivo OperacionesProductos.java y colocar el siguiente cdigo: import java.io.*; public class OperacionesProductos { public static void main(String args[])throws IOException { BufferedReader br = new InputStreamReader(System.in)); String nomalmacen, nompro; int rpta=1, cant; float pre; Almacen oA= null; Docente: Ing. Martn Salcedo Quiones

BufferedReader(new

Pagina: 87

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.print("Ingrese el nombre del almacen: "); nomalmacen=br.readLine(); oA= new Almacen(nomalmacen); Producto p; if(oA!=null) System.out.println("Almacen creado ..."); System.out.println(""); System.out.println("INGRESO DE PRODUCTOS"); do { System.out.print("NOMBRE: "); nompro=br.readLine(); System.out.print("STOCK: "); cant=Integer.parseInt(br.readLine()); System.out.print("PRECIO: "); pre=Float.parseFloat(br.readLine()); System.out.print("Desea ingresar los datos de otro producto? (Si=1, No=0): "); rpta=Integer.parseInt(br.readLine()); System.out.println(""); //Creacion del Objeto p=new Producto(nompro, cant, pre); //Adiciona el Obj al Arreglo de Productos //Nota: Para acceder a los metodos del Arreglo de Objs que esta en Almacen //se realiza mediante la Variable de Clase que se encuentra en IUAlmacen oA.adicionarProducto(p); }while(rpta==1); System.out.println("LISTA DE PRODUCTOS"); int total,i; total=oA.getNproductos(); if (total>0) for(i=0;i<total;i++) { p=oA.obtenerProducto(i); System.out.println(p.getNombre()+"\t"+p.getStock()+"\t"+p.getPrecio()); } } } Docente: Ing. Martn Salcedo Quiones Pagina: 88

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote EJECUTANDO LA PRIMERA APLICACION

1.

Crea un proyecto denominado: Sesion06_Aplicaciones

Observa que debes crear la clase principal RelacionClases01 dentro del paquete sesion06_aplicaciones. Luego dar clic en el botn de comando Terminar.

2.

Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

3.

As debe quedar luego de colocar las instrucciones de la primera aplicacin. Pagina: 89

Docente: Ing. Martn Salcedo Quiones

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4.

Luego a proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo.

Docente: Ing. Martn Salcedo Quiones

Pagina: 90

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Ingresar los datos solicitados y se lograr observar lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 91

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

MODIFICADORES DE ACCESO A LOS MIEMBROS DE UNA CLASE

Los modificadores de acceso, como su nombre indica, determinan desde qu clases se puede acceder a un determinado elemento. En Java tenemos 4 tipos: public, private, protected y el tipo por defecto, que no tiene ninguna palabra clave asociada, pero se suele conocer como default o package-private. Si no especificamos ningn modificador de acceso se utiliza el nivel de acceso por defecto, que consiste en que el elemento puede ser accedido slo desde las clases que pertenezcan al mismo paquete. El nivel de acceso public permite a acceder al elemento desde cualquier clase, independientemente de que esta pertenezca o no al paquete en que se encuentra el elemento. private, por otro lado, es el modificador ms restrictivo y especifica que los elementos que lo utilizan slo pueden ser accedidos desde la clase en la que se encuentran. Este modificador slo puede utilizarse sobre los miembros de una clase y sobre interfaces y clases internas, no sobre clases o interfaces de primer nivel, dado que esto no tendra sentido. Docente: Ing. Martn Salcedo Quiones Pagina: 92

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Es importante destacar tambin que private convierte los elementos en privados para otras clases, no para otras instancias de la clase. Es decir, un objeto de una determinada clase puede acceder a los miembros privados de otro objeto de la misma clase. El modificador protected, por ltimo, indica que los elementos slo pueden ser accedidos desde su mismo paquete (como el acceso por defecto) y desde cualquier clase que extienda la clase en que se encuentra, independientemente de si esta se encuentra en el mismo paquete o no. Este modificador, como private, no tiene sentido a nivel de clases o interfaces no internas. Los distintos modificadores de acceso quedan resumidos en la siguiente tabla:

Static A pesar de lo que podra parecer por su nombre, heredado de la terminologa de C++, el modificador static no sirve para crear constantes, sino para crear miembros que pertenecen a la clase, y no a una instancia de la clase. Esto implica, entre otras cosas, que no es necesario crear un objeto de la clase para poder acceder a estos atributos y mtodos. Este es el motivo por el cual es obligatorio que main se declare como static; de esta forma no tenemos que ofrecer un constructor vaco para la clase que contiene el mtodo, o indicar de alguna forma a la mquina virtual cmo instanciar la clase. Un uso del modificador static sera, por ejemplo, crear un contador de los objetos de la clase que se han creado, incrementando la variable esttica en el constructor:

Docente: Ing. Martn Salcedo Quiones

Pagina: 93

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Como es de esperar, dado que tenemos acceso a los atributos sin necesidad de crear un objeto, los atributos estticos como usuarios no se inicializan al crear el objeto, sino al cargar la clase. Podemos acceder a estos mtodos y atributos bien desde la propia clase

o bien desde una instancia cualquiera de la clase:

Otro uso sera el de crear una recopilacin de mtodos y atributos relacionados a los que poder acceder sin necesidad de crear un objeto asociado, que podra no tener sentido o no ser conveniente, como es el caso de la clase Math.

Docente: Ing. Martn Salcedo Quiones

Pagina: 94

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Una caracterstica no muy conocida que se introdujo en Java 1.5 son los static imports, una sentencia similar al import habitual, con la salvedad de que esta importa miembros estticos de las clases, en lugar de clases de los paquetes, permitiendo utilizar estos miembros sin indicar el espacio de nombres en el que se encuentran. El ejemplo anterior podra haberse escrito tambin de la siguiente forma utilizando esta caracterstica:

Si por algn motivo requerimos cualquier tipo de computacin para inicializar nuestras variables estticas, utilizaremos lo que se conoce como bloque esttico o inicializador esttico, el cul se ejecuta una sola vez, cuando se carga la clase.

Por ltimo, una curiosidad relacionada que podis utilizar para romper el hielo con una programadora Java es que podemos utilizar un bloque static para escribir un programa sencillo sin necesidad de un main, aadiendo una llamada a System.exit para que el programa termine tras cargar la clase sin intentar llamar al mtodo main

Docente: Ing. Martn Salcedo Quiones

Pagina: 95

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Final Indica que una variable, mtodo o clase no se va a modificar, lo cul puede ser til para aadir ms semntica, por cuestiones de rendimiento, y para detectar errores. Si una variable se marca como final, no se podr asignar un nuevo valor a la variable. Si una clase se marca como final, no se podr extender la clase. Si es un mtodo el que se declara como final, no se podr sobreescribir. Algo muy a tener en cuenta a la hora de utilizar este modificador es que si es un objeto lo que hemos marcado como final, esto no nos impedir modificar el objeto en s, sino tan slo usar el operador de asignacin para cambiar la referencia. Por lo tanto el siguiente cdigo no funcionara:

Pero, sin embargo, este si:

Miembros de clase Estaticos Cada objeto de una clase tiene su propia copia de todas las variables de ejemplar de clase. En ciertos casos, una sola copia de la variable en particular debe ser compartida por todos los objetos de la clase. Por esta y otras razones utilizamos las variables de clase static (estticas). Una variable de clase static representa informacin que abarca toda la clase. La declaracin de un mtodo esttico comienza con la palabra clave static.

Docente: Ing. Martn Salcedo Quiones

Pagina: 96

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote PROGRAMAS RESUELTOS 5) Crear una clase Empleado que haga uso del modificador static y luego crea dos objetos de Empleados. import java.io.*; class Empleado{ private String nombres; private String apellidos; private static int contador; public Empleado(String nom, String ape) { nombres=nom; apellidos=ape; contador++; } public void finalize() { --contador; } public void setNombres(String nom) { nombres=nom; } public void setApellidos(String ape) { apellidos=ape; } public static void setContador(int cont) { contador=cont; } Docente: Ing. Martn Salcedo Quiones Pagina: 97

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public String getNombres() { return nombres; } public String getApellidos() { return apellidos; } public static int getContador() { return contador; } public String toString() { return apellidos+" "+nombres; } } public class PruebaEmpleadoVariableEstatica{ public static void main(String args[]) throws IOException { System.out.println(Numero de objetos creados : +Empleado.getContador()); Empleado e1= new Empleado("Torres","Fidel"); System.out.println(e1); System.out.println("Nmero de objetos creados : "+e1.getContador()); Empleado e2= new Empleado("Villanueva","Nelsa"); System.out.println(e2); System.out.println("Nmero de objetos creados : "+Empleado.getContador()); } } Interpretacin de la programacin:

Docente: Ing. Martn Salcedo Quiones

Pagina: 98

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote En el programa anterior usamos un atributo private static y un mtodo public static. El atributo contador se inicializa en cero por omisin. Esta variable va contando el numero de Objetos de la Clase Empleado que se van creando, esta variable se va incrementando en el constructor cada vez que se crea un objeto. Para saber cuntos objetos hemos creados llamamos al mtodo estatico getContador() que devuelve el valor de la variable contador. Un mtodo declarado static no puede acceder a miembros de clase no estticos. Un mtodo static no tiene referencia this porque las variables de clase static y los mtodos static existen independientemente de que existan o no objetos de clase. En la primera linea del Programa colocamos llamamos Empleado.getContador() pues como es un mtodo exttico no es necesario usar un objeto de la clase par llamar al mtodo, solo se usa el nombre de la Clase y luego el mtodo getContador(). 6) Crea una clase denominada FigurasGeometricas y calcula el rea y el permetro del cuadrado, rectngulo y del triangulo. Hacerlo con mtodos estticos y mtodos no estticos. Respuesta con mtodos estticos: import java.io.*; class FigurasGeometricas { public static double areaCuadrado(int lado1) { return lado1*lado1; } public static double areaRectangulo(int lado1, int lado2) { return lado1*lado2; } public static double areaTriangulo(int lado1, int lado2, int lado3) { double p, r; Docente: Ing. Martn Salcedo Quiones Pagina: 99

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote p=(lado1+lado2+lado3)/2.0; r=p*(p-lado1)*(p-lado2)*(p-lado3); if (r>0) return Math.sqrt(r); else return 0.0; } public static int perimetroCuadrado(int lado1) { return 4*lado1; } public static int perimetroRectangulo(int lado1, int lado2) { return 2*lado1+2*lado2; } public static int perimetroTriangulo(int lado1, int lado2, int lado3) { return lado1+lado2+lado3; } } public class CalculoAreaPerimetro { public static void main(String args[])throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int opcion, l1,l2,l3; System.out.println("CALCULO DEL AREA Y PERIMETRO"); System.out.print("Ingrese 1: cuadrado, 2:rectangulo, 3:triangulo -> "); opcion=Integer.parseInt(br.readLine()); if (opcion==1) { System.out.print("Ingrese el valor del lado del cuadrado: "); l1=Integer.parseInt(br.readLine()); System.out.println("El area del cuadrado es: "+FigurasGeometricas.areaCuadrado(l1)); System.out.println("El perimetro del cuadrado es: "+FigurasGeometricas.perimetroCuadrado(l1)); } Docente: Ing. Martn Salcedo Quiones Pagina: 100

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote if (opcion==2) { System.out.print("Ingrese el valor del lado 1 del rectangulo: "); l1=Integer.parseInt(br.readLine()); System.out.print("Ingrese el valor del lado 2 del rectangulo: "); l2=Integer.parseInt(br.readLine()); System.out.println("El area del rectangulo "+FigurasGeometricas.areaRectangulo(l1,l2)); System.out.println("El perimetro del rectangulo "+FigurasGeometricas.perimetroRectangulo(l1,l2)); } if (opcion==3) { System.out.print("Ingrese el valor del lado 1 del triangulo: "); l1=Integer.parseInt(br.readLine()); System.out.print("Ingrese el valor del lado 2 del triangulo: "); l2=Integer.parseInt(br.readLine()); System.out.print("Ingrese el valor del lado 3 del triangulo: "); l3=Integer.parseInt(br.readLine()); System.out.println("El area del triangulo "+FigurasGeometricas.areaTriangulo(l1,l2,l3)); System.out.println("El perimetro del rectangulo "+FigurasGeometricas.perimetroTriangulo(l1,l2,l3)); } } } Respuesta con mtodos no estticos: import java.io.*; class FigurasGeometricas { public double areaCuadrado(int lado1) { return lado1*lado1; } public double areaRectangulo(int lado1, int lado2) Docente: Ing. Martn Salcedo Quiones Pagina: 101

es: es:

es: es:

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { return lado1*lado2; } public double areaTriangulo(int lado1, int lado2, int lado3) { double p, r; p=(lado1+lado2+lado3)/2.0; r=p*(p-lado1)*(p-lado2)*(p-lado3); if (r>0) return Math.sqrt(r); else return 0.0; } public int perimetroCuadrado(int lado1) { return 4*lado1; } public int perimetroRectangulo(int lado1, int lado2) { return 2*lado1+2*lado2; } public int perimetroTriangulo(int lado1, int lado2, int lado3) { return lado1+lado2+lado3; } } public class CalculoAreaPerimetro { public static void main(String args[])throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int opcion, l1,l2,l3; FigurasGeometricas F=new FigurasGeometricas(); System.out.println("CALCULO DEL AREA Y PERIMETRO"); Docente: Ing. Martn Salcedo Quiones Pagina: 102

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.print("Ingrese 1: cuadrado, 2:rectangulo, 3:triangulo -> "); opcion=Integer.parseInt(br.readLine()); if (opcion==1) { System.out.print("Ingrese el valor del lado del cuadrado: "); l1=Integer.parseInt(br.readLine()); System.out.println("El area del cuadrado es: "+F.areaCuadrado(l1)); System.out.println("El perimetro del cuadrado es: "+F.perimetroCuadrado(l1)); } if (opcion==2) { System.out.print("Ingrese el valor del lado 1 del rectangulo: "); l1=Integer.parseInt(br.readLine()); System.out.print("Ingrese el valor del lado 2 del rectangulo: "); l2=Integer.parseInt(br.readLine()); System.out.println("El area del rectangulo es: "+F.areaRectangulo(l1,l2)); System.out.println("El perimetro del rectangulo es: "+F.perimetroRectangulo(l1,l2)); } if (opcion==3) { System.out.print("Ingrese el valor del lado 1 del triangulo: "); l1=Integer.parseInt(br.readLine()); System.out.print("Ingrese el valor del lado 2 del triangulo: "); l2=Integer.parseInt(br.readLine()); System.out.print("Ingrese el valor del lado 3 del triangulo: "); l3=Integer.parseInt(br.readLine()); System.out.println("El area del triangulo es: "+F.areaTriangulo(l1,l2,l3)); System.out.println("El perimetro del rectangulo es: "+F.perimetroTriangulo(l1,l2,l3)); } } }

EJECUTANDO LA PRIMERA APLICACION 5. Crea un proyecto denominado: Sesion07_Aplicaciones. Docente: Ing. Martn Salcedo Quiones Pagina: 103

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Observa

que

debes

crear dentro

la

clase del

principal paquete

PruebaEmpleadoVariableEstatica

sesion07_aplicaciones. Luego dar clic en el botn de comando Terminar. 6. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

7. Asi debe quedar luego de colocar las instrucciones de la primera aplicacin.

Docente: Ing. Martn Salcedo Quiones

Pagina: 104

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

8. Luego a proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo.

Docente: Ing. Martn Salcedo Quiones

Pagina: 105

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Docente: Ing. Martn Salcedo Quiones

Pagina: 106

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

METODOS CONSTRUCTORES Y LA REFERENCIA THIS

Un Constructor es una funcin, mtodo, etc, de las clases, la cual es llamada automticamente cuando se crea un objeto de esa clase. Por ser mtodos, los constructores tambin aceptan parmetros. Cuando en una clase no especificamos ningn tipo de constructor, el compilador aade uno pblico por omisin sin parmetros, el cual NO hace nada. Caractersticas de los Constructores 1. 2. 3. 4. Un constructor, tiene el mismo nombre de la clase a la cual pertenece. No puede ser Heredado. No retorna ningn valor (Ni void), por lo cual no debe especificarse ningn tipo de dato. Debe declararse como public, slo en casos realmente extraordinarios ser de otro tipo. Supongamos una clase llamada Datos
public class Datos {

Docente: Ing. Martn Salcedo Quiones

Pagina: 107

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote
//declaracion de atributos public Datos();//constructor sin parametros public Datos(int Edad) {//Constructor con parmetros EdadM=Edad; } }

Por ejemplo: Sobrecarga Cuando en una clase, se definen un mismo mtodo, con diferente nmero de parmetros, o bien con el mismo nmero de parmetros pero diferencindose en la definicin, en la cual, al menos un parmetro sea de diferente tipo, cuando esto sucede, se dice que el mtodo est sobrecargado. Por ejemplo:
public class Arboles { public Arboles() { System.out.println("Un rbol genrico"); } public Arboles(String tipo) { System.out.println("Un rbol tipo " + tipo); } public Arboles(int altura) { System.out.println("Un rbol de " + altura + " metros"); } public Arboles(int altura,String tipo) { System.out.println("Un " + tipo + " de " + altura + " metros"); } public static void Arboles arbol1 Arboles arbol2 Arboles arbol3 Arboles arbol4 } } main(String args[]) { = new Arboles(4); = new Arboles("Roble"); = new Arboles(); = new Arboles(5,"Pino");

Explicacin:

Como en todo programa Java, primeramente se define la Clase a travs del vocablo class.

Docente: Ing. Martn Salcedo Quiones

Pagina: 108

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Posteriormente son definidos 4 Constructores; ntese que cada uno recibe el mismo nombre de la Clase y posee distintos argumentos de entrada. Dentro del mtodo principal (main) son generadas cuatro instancias de la Clase, como se puede observar, al ser generada la instancia a travs del vocablo new se pasa un parmetro, y es dependiendo de este parmetro que es llamado el Constructor correspondiente, el cual a su vez invoca la Clase System.out.println que imprime a pantalla.

Mtodos y Parmetros por Referencia Cuando son utilizados Constructores puede surgir la necesidad de inicializar algn campo perteneciente a la Clase, esto trae consigo otro detalle en lo que concierne la asignacin de valores dentro de un mtodo, la razn se debe a que dentro de un mtodo puede surgir el requerimiento de accesar campos definidos en la Clase, observe:
public Class Cableado { int longitud; String tipo; public Cableado(String tipo, int longitud) { this.tipo = tipo this.longitud = longitud; } .... .... }

En el caso anterior, dentro del constructor se desea asignar valores a los campos de una Clase, sin embargo, dentro del constructor son utilizados como parmetros de entrada los mismos valores, para tener acceso a los campos de la Clase se utiliza el vocablo: this, al emplear esta sintaxis se esta haciendo alusin a los campos de la Clase. Aunque sera posible emplear distintos nombres para los valores de entrada, evitando el uso del vocablo this, la sintaxis con el vocablo this es ampliamente utilizada en el caso de Constructores mencionado anteriormente. Docente: Ing. Martn Salcedo Quiones Pagina: 109

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote PROGRAMAS RESUELTOS 1) Se Desea crear un objeto del tipo Coordenadas, que indique, la posicin de un punto en el plano cartesiano, y permita calcular la distancia existente con otro punto, adems del punto medio entre ellos.
1 /*Archivo Coordenadas.java*/ 2 3 public class Coordenadas { 4 private int x,y;//Atributos 5 public Coordenadas (int x1 , int y1)//constructor 6 { 7 //asignamos esos valores 8 x=x1; 9 y=y1; 10 } 11 public double Distancia (int x1, int y1) 12 { 13 //este mtodo recibe como parametros 14 //las coordenadas del segundo punto 15 double D; 16 D=Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)); 17 return D;//Retornamops el valor de la distancia 18 } 19 public void Pmedio(int x1, int y1) 20 { 21 double p1, p2; 22 p1=(x+x1)/2; 23 p2=(y+y1)/2; 24 System.out.println("El puntomedio es: "+p1+","+p2); 25 } 26 } 1 /*Archivo UsaCoordenadas.java*/ 2 public class UsaCoordenadas { 3 public static void main (String args []){ 4 Coordenadas P=new Coordenadas (10,20); 5 //calculamos la Distancia: 6 System.out.println("La Distancia es: "+P.Distancia(5,6)); 7 //Punto Medio 8 P.Pmedio(5,6); 9 } 10 }

Interpretacin de la programacin Un mtodo, si va a devolver algn valor, ste debe especificarse cuando se hace la definicin del mismo, para el caso, el mtodo Distancia, devuelve el valor de la distancia, es por ello que lo especificamos como public double. Adems que, cuando realizamos la llamada de ese mtodo, es en ese Docente: Ing. Martn Salcedo Quiones Pagina: 110

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote preciso lugar que aparecer el valor que devuelve. Por otra parte, a ellos, en la clase Coordenadas. 2) Cree una aplicacin en Java, que imprima un nmero imaginario. Nota, los nmeros imaginarios, poseen una parte real y otra imaginaria, acompaada por la constante i.
1 class Imaginario { 2 private int real, imag; 3 public Imaginario() 4 { 5 real=0; 6 imag=0; 7 } 8 public Imaginario(int x, int y) 9 { 10 real=x; 11 imag=y; 12 } 13 public void Mostrar() 14 { 15 System.out.println("El Numero Imaginario es: "+real+" + "+imag+"i"); 16 } 17 } 1 class UsaImaginario{ 2 public static void main (String args []) { 3 Imaginario oI=new Imaginario(5,6); 4 oI.Mostrar(); 5} 6}

los

atributos, son de acceso privado, lo cual implica que, slo podemos acceder

Interpretacin de la programacin En el ejemplo anterior puede notar que, los atributos, son esas variables simples, es las cuales almacenaremos informacin relevante a los objetos que, crearemos a partir de esa clase. Adems que, los estamos declarando como pblicos, lo cual indica que tenemos acceso directo desde cualquier otro archivo a los atributos. Los mtodos son del tipo public y no devuelven ningn valor, por tal razn son declarados como void. Adems que. El mtodo EstablecerEdad y EstablecerNota, reciben un argumento cada uno de ellos, el cual es asignado al respectivo atributo. Docente: Ing. Martn Salcedo Quiones Pagina: 111

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

3) Tomando

el enunciado del segundo programa resuelto en la sesin

Relaciones entre clases, indicar los mtodos constructores utilizados y usar la referencia this. Crear un archivo Almacen.java y colocar el siguiente cdigo: public class Almacen { private String nombre; private int nproductos; private Producto[] productos; //Mtodo constructor Almacen con un solo parametro public Almacen(String nombre) { this.nombre=nombre; nproductos = 0; productos = new Producto[100]; } public String adicionarProducto(Producto prod) { String rpta; if (this.nproductos < 100) { this.productos[this.nproductos] = prod; this.nproductos++; rpta = "Se registro el producto"; } else { rpta = "No se registro el producto"; } return rpta; } public Producto obtenerProducto(int indice) { if (indice < 0 || indice >= this.nproductos) { return null; Docente: Ing. Martn Salcedo Quiones Pagina: 112

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } else { return productos[indice]; } } public int getNproductos() { return nproductos; } public String getNombre() { return nombre; } } Crear un archivo Producto.java y colocar el siguiente cdigo: public class Producto { private String nombre; private float precio; private int stock; //Mtodo constructor con parametros public Producto(String nombre, int stock,float precio ) { this.nombre = nombre; this.precio = precio; this.stock = stock; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getStock() { return stock; } Docente: Ing. Martn Salcedo Quiones Pagina: 113

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public void setStock(int stock) { this.stock = stock; } public float getPrecio() { return precio; } public void setPrecio(float precio) { this.precio = precio; } public String toString() { return "Producto{" + "Nombre=" + nombre + ", Precio=" + precio + ", Stock=" + stock + '}'; } } //El archivo OperacionesProductos.java queda como est. EJECUTANDO LA PRIMERA APLICACION

5.

Crea un proyecto denominado: Sesion08_Aplicaciones.

Docente: Ing. Martn Salcedo Quiones

Pagina: 114

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Observa que debes crear la clase principal UsaCoordenadas dentro del paquete sesion08_aplicaciones. Luego dar clic en el botn de comando Terminar.

6.

Ahora se observa el entorno de NetBeans listo para colocar la programacin de la primera aplicacin.

7.

Selecciona el paquete sesion08_aplicaiones y al dar clic con el botn derecho del mouse y selecciona Clase Java.

Docente: Ing. Martn Salcedo Quiones

Pagina: 115

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

8.

Posteriormente crear la clase Coordenadas.

9.

Colocar el cdigo correspondiente a la clase Coordenadas.

Docente: Ing. Martn Salcedo Quiones

Pagina: 116

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

10.

Colocamos el cdigo correspondiente a la clase UsaCoordenadas.

11.

Como la clase UsaCoordenadas contiene al metodo main procedemos a

ejecutar este programa.

La ejecucin arroja lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 117

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

AUTOEVALUACION
a)

Responde a las siguientes preguntas: 1. Una clase tiene como miembros atributos y mtodos (verdadero o falso): _________________ 2. Para crear o instanciar un objeto de la clase Rectangulo se debe escribir: _____________________________________ 3. Los elementos o miemvros que slo pueden ser accedidos dentro una clase, pertenecen al nivel de acceso __________________ 4. Modificador que permite que un miembro pertenezca a la clase y no a un objeto es: ____________________ 5. Las relaciones entre clases permite conocer la asociacin existentes entre ellos (verdaero o falso): _________________ b) Desarrolla las siguientes aplicaciones: 1. Construye una aplicacin que permita crear la clase Trapecio con los atributos con base mayor, base menor y la altura. Luego calcula el permetro y el rea del trapecio. 2. Construye una aplicacin que permita crear la clase Marca con los atributos codigomar y nombremar. Tambin crear la clase Bus con los atributos codigobus, nroasientos, nroejes y nropisos. Luego proceder a ingresar datos en Marca y en Bus y posteriormente visualizar los datos de los buses ingresados. Hacer uso de arreglos. 3. Crea una clase denominada FigurasGeometricas y calcula el rea y el permetro del cuadrado, rectngulo y del triangulo. Hacerlo con mtodos constructores sobrecargados y el operador this.

Docente: Ing. Martn Salcedo Quiones

Pagina: 118

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CAPITULO III
HERENCIA, CLASES ABSTRACTAS, INTERFACES Y POLIMORFISMO

Docente: Ing. Martn Salcedo Quiones

Pagina: 119

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

HERENCIA DE CLASES

A travs de la herencia, una clase nueva hereda los atributos y mtodos de una superclase previamente definida. En este caso decimos que la nueva clase es una subclase. En la herencia simple, una clase se hereda de una superclase. Java no reconoce la herencia mltiple, pero si maneja el concepto de interfaces. Las interfaces ayudan a java a lograr muchas de las ventajas de la herencia mltiple. Una subclase normalmente agrega sus propios atributos y mtodos. De modo que una subclase generalmente es mayor que su superclase. Una subclase es ms especfica que su superclase y representa un grupo ms pequeo de objetos. El verdadero valor de la herencia radica en la capacidad de definir en la subclase adiciones a las caractersticas heredadas de la superclase o sustituciones de estas. Todo objeto de una subclase es tambin un objeto de la superclase de esa subclase. Sin embargo no se cumple lo opuesto: los objetos de una superclase no son objetos de las subclases de esa superclase. Las relaciones de herencia forman estructuras jerrquicas similares a un rbol. Una superclase existe en una relacin Jerrquica con sus subclases. Sin duda, Docente: Ing. Martn Salcedo Quiones Pagina: 120

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote una clase puede existir sola, pero es cuando una clase se emplea con el mecanismo de herencia que se convierte ya sea en una superclase que proporciona atributos y comportamientos a otras clases, o en una subclase que hereda dichos atributos y comportamientos. Ejemplos: Persona

Empleado Profesor Contador

Estudiante Universitario

Religiosos

Instituto Colegio

Por ejemplo en una ciudad existen Personas las cuales pueden ser Empleados, Estudiantes, Religiosos. Los Empleados pueden ser Profesor, Contador. Los estudiantes pueden ser Universitarios, de Institutos y Colegios. Las subclases heredan el estado y el comportamiento en forma de las variables y los mtodos de su superclase. La subclase puede utilizar los tems heredados de su superclase tal y como son, o puede modificarlos o sobreescribirlos. Por eso, segn se va bajando por el rbol de la herencia, las clases se convierten en ms y ms especializadas. Miembros Protected Los miembros protected de una superclase slo estn accesibles para los mtodos de la superclase, los mtodos de las subclases y los mtodos de otras clases del mismo paquete. Relacion entre Objetos de superclase y objetos de subclase Un objeto de una subclase se puede tratar como objeto de su superclase correspondiente. Esto hace posible ciertas manipulaciones interesantes. Por ejemplo, a pesar del hecho de que los objetos de diversas clases derivadas de una superclase en particular pueden ser muy diferentes entre s, podemos crear un arreglo de ellos, en tanto los tratemos como objetos de la superclase. Lo contrario no se cumple un objeto de una superclase no es automticamente tambin un objeto de la subclase. Docente: Ing. Martn Salcedo Quiones Pagina: 121

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

import java.io.*; class Punto{ protected double x; protected double y; public Punto() { x=0; y=0; } public Punto(double a, double b) { x=a; y=b; } public void setX(double a) { x=a; } public void setY(double b) { y=b; } public double getX() { return x; } public double getY() { return y; } Docente: Ing. Martn Salcedo Quiones Pagina: 122

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public String toString() { return "("+x+","+y+")"; } }

class Circulo extends Punto{ protected double radio; public Circulo() { super(); radio=0; } public Circulo(double a, double b, double r) { super(a,b); radio=r; } public void setRadio(double a) { radio=a; } public double getRadio() { return radio; } public double area() { return Math.PI*Math.pow(radio,2); } public String toString() Docente: Ing. Martn Salcedo Quiones Pagina: 123

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { return "Centro = "+super.toString()+" Radio = "+radio; } } public class HerenciaPuntoCirculo{ public static void main(String args[]) throws IOException { Punto P= new Punto(3,4); Circulo C=new Circulo(6,9,12); System.out.println(P); System.out.println(C); System.out.println("Area del Circulo : "+C.area()); } } La clase Circulo hereda de la clase Punto esto se especifica en: class Circulo extends Punto{ La palabra clave extends (extiende) de la definicin de clase indica herencia. Todos los miembros (no private) de la clase Punto se heredan en la clase Circulo. Los constructores de Circulo deben invocar al constructor de Punto para inicializar la porcin de superclase de un objeto de la clase Circulo. La primer lnea del cuerpo de cada constructor invoca al constructor de Punto mediante la referencia a super. Una subclase pude redefinir un mtodo de superclase empleando el mismo nombre, esto se denomina supeditar un mtodo de superclase. Se puede usar la referencia super seguida por el operador punto para acceder a la versin de superclase de ese mtodo desde la subclase. Veamos un ejemplo grfico:

Docente: Ing. Martn Salcedo Quiones

Pagina: 124

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Trabajador es una clase genrica que sirve para almacenar datos como el nombre, la direccin, el nmero de telfono o el nmero de la seguridad social de un trabajador. Empleado es una clase especializada para representar los empleados que tienen una nmikna mensual (encapsula datos como su salario anual) Consultor es una clase especializada para representar a aquellos trabajadores que cobran por horas (por ejemplo, registra el nmero de horas que ha trabajado un consultor y su tarifa horaria).

Docente: Ing. Martn Salcedo Quiones

Pagina: 125

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Las clases Empleado y Consultor, adems de los atributos y de las operaciones que definen, heredan de Trabajador todos sus atributos y operaciones.

Docente: Ing. Martn Salcedo Quiones

Pagina: 126

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Un empleado concreto tendr, adems de sus atributos y operaciones como Empleado, todos los atributos correpondientes a la superclase Trabajador. El diagrama indicado se debe escribir en programacion en Java de la siguiente manera: import java.util.Date; class Trabajador { private String nombre; private String puesto; private String direccion; private String telefono; private Date fecha_nacimiento; private Date fecha_contrato; private String NSS; //constructor public Trabajador (String nombre,String NSS) { this.nombre=nombre; this.NSS=NSS; } //comparacin de objetos Public boolean equals (Trabajador t) { return this.NSS.equals(t.NSS); } //conversin en una cadena de caracteres public String toString() { return nombre + (NSS + NSS + ) ; } } class Empleado extends Trabajador { Docente: Ing. Martn Salcedo Quiones Pagina: 127

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote double sueldo; private double impuestos; private final int PAGAS=14; //constructor public Empleado(String nombre, String NSS, double sueldo) { super(nombre, NSS); this.sueldo=sueldo; this.impuestos=0.2 * sueldo; } public double calcularPaga() { return (sueldo - impuestos) / PAGAS; }

public String toString() { return Empleado +super.toString(); } } Con la palabra reservada extends indicamos que Empleado es una subclase de Trabajador. Con la palabra super accedemos a miembros de la superclase desde la subclase. Generalmente, en un mtodo constructor, lo primero que nos encontramos es una llamada al constructor de la clase padre con super(). Si no ponemos nada, se llama al constructor por defecto de la superclase antes de ejecutar el constructor de la subclase. class Consultor extends Trabajador { private int horas; private double tarifa; Docente: Ing. Martn Salcedo Quiones Pagina: 128

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote //constructor public Consultor(String nombre, String NSS, int horas, double tarifa) { super(nombre, NSS); this.horas=horas; this.tarifa=tarifa; } public double calcularPaga() { return horas * tarifa; } public String toString() { return Consultor +super.toString(); } } La clase Consultor tambin define un mtodo llamado calcularPaga(), si bien en este caso el clculo se hace de una forma diferente por tratarse de un trabajador de un tipo distinto. Tanto la clase Empleado como la clase Consultor redefinen el mtodo toString() que convierte un objeto en una cadena de caracteres. De hecho, Trabajador tambin redifine ste mtodo, que se hereda de la clase Object, la clase base de la que heredan todas las clases de Java. Redifinicin de mtodos Como hemos visto en el ejemplo con el mtodo toString(), cada subclase hereda las operaciones de su superclase pero tiene la posibilidad de modificar localmente el comportamiento de dichas operaciones (redifiniendo mtodos). Continuamos con el caso Trabajador, Empleado y Consultor. public class UsandoHerencia { Docente: Ing. Martn Salcedo Quiones Pagina: 129

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public static void main(String args[ ]) { //Declaracion de variables Trabajador trabajador; Empleado empleado; Consultor consultor; //Creacin de objetos trabajador = new Trabajador(Juan,456); empleado = new Empleado(Jose,123,24000.0); consultor = new Consultor(Juan,456, 10, 50.0); System.out.println(trabajador); System.out. println(empleado); System.out.println(consultor); System.out.println(trabajador.equals(empleado)); System.out.println(trabajador.equals(consultor)); } } EJECUTANDO LA APLICACIN EN NETBEANS 1. Crea un proyecto denominado: Sesion09_Aplicaciones

Docente: Ing. Martn Salcedo Quiones

Pagina: 130

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Observa que debes crear la clase principal UsandoHerencia dentro del paquete sesion09_aplicaciones. Luego dar clic en el botn de comando Terminar 2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la reciente aplicacin.

3. Selecciona el paquete sesion09_aplicaciones y dar clic el botn derecho del mouse y selecciona Clase Java.

Docente: Ing. Martn Salcedo Quiones

Pagina: 131

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4. Procede a crear la clase Trabajador.

5. Colocar el cdigo corresponidente a la clase Trabajador.

Docente: Ing. Martn Salcedo Quiones

Pagina: 132

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

6. Luego,

procede

crear

la

clase

Empleado

desde

el

paquete

sesion09_aplicaciones tal como se hizo con la clase Trabajador.

7. Colocar el cdigo correspondiente a la clase Empleado.

Docente: Ing. Martn Salcedo Quiones

Pagina: 133

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

8. Luego,

procede

crear

la

clase

Consultor

desde

el

paquete

sesion09_aplicaciones tal como se hizo con la clase Trabajador.

9. Colocar el cdigo correspondiente a la clase Consultor.

Docente: Ing. Martn Salcedo Quiones

Pagina: 134

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

10. Posteriormente colocar la programacin en la clase UsandoHerencia.

11. Como la clase UsandoHerencia contiene al metodo main procedemos a ejecutar este programa.

Docente: Ing. Martn Salcedo Quiones

Pagina: 135

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

La ejecucin arroja lo siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 136

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CLASES ABSTRACTAS

Java proporciona un tipo especial de clase, llamada clase abstracta, que pueden ayudar a la organizacin de clases basadas en mtodos comunes. Una clase abstracta permite colocar los nombres de los mtodos comunes en una sola clase (sin tener que escribir el cdigo que los implemente). Despus, al crear nuevas clases, stas pueden derivar de una clase abstracta que contiene una serie de mtodos requeridos. Los mtodos abstractos contienen slo el nombre del mtodo seguido de una lista de parmetros. No contiene el cdigo que implementa el mtodo (esto se deja para las clases derivadas. Las clases que contienen mtodos abstractos se conocen como clases abstractas Un programa no puede crear instancias de una clase abstracta de forma directa, es necesario crear instancias de sus subclases. Docente: Ing. Martn Salcedo Quiones Pagina: 137

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Las clases abstractas pueden contener una mezcla de mtodos abstractos y no abstractos (concretos). Los mtodos concretos contienen la instrumentacin del mtodo Cualquier subclase que extienda a la clase abstracta debe proporcionar la instrumentacin de todos los mtodos abstractos. En caso contrario, la subclase misma se convierte en clase abstracta. Vamos a proceder a dar un ejemplo tomando en cuenta el diagrama de clases que se encuentra dibujado al incio de esta sesin. Imaginemos que en nuestra casa tenemos dos mascotas. Una es un perro y la otra un gato. Cuando acariciamos a nuestro perro, ste baja las orejas como respuesta a nuestra accin a nuestro gato, ste reacciona levantando su cola. Cuando los alimentamos les damos de comer una cantidad de algn alimento apropiado para ellos, y la respuesta de las dos mascotas es que se acercan al recipiente donde tienen la comida y se la comen como podemos observar, parece predecible que la respuesta habitual de todas las mascotas cuando se les da de comer es que se acerquen al plato y se coman el contenido de ste, pero no podemos decir lo mismo de la respuesta que nos pueden dar todas las mascotas cuando las acariciamos. Si alguien nos preguntara cmo reacciona una mascota cuando la acarician nosotros responderamos que depende. Y de qu depende?. Pues depende de la mascota en concreto que nos estemos refiriendo, es decir, si hablamos ms concretamente de un perro diremos que ste baja las orejas y si hablamos ms concretamente de un gato, diremos que levanta la cola, pero si no nos preguntan de que mascota en concreto estamos hablando nuestra respuesta ser abstracta, es decir, no tenemos una respuesta general que sea vlida para la mayora de las mascotas. Si extrapolamos este planteamiento al mundo de los Objetos, podemos decir que tenemos

una Superclase llamada Mascota con dos mtodos


o

un mtodo acariciar() que es abstracto (abstract) Pagina: 138

Docente: Ing. Martn Salcedo Quiones

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote
o

y otro mtodo alimentar(...) que no es abstracto

y dos Subclases llamadas Perro y Gato

Mascota o es una Superclase abstracta (abstract) es abstracta por que contiene un mtodo llamado acariciar() que es abstracto una Clase abstracta no puede ser instanciada en UML se sabe que una Clase es abstracta por que el nombre de la Clase est en cursiva -nombre: String o Nota: Convencin sobre los mtodos de acceso getters y setters as pues siguiendo la convencin, los mtodos +setNombre(nombre: String): void y +getNombre(): String no estn en la Clase de diseo Mascota -fechaNacimiento: Date o Date es una Clase Java que como su nombre indica, representa una fecha

+acariciar():void
o

como este mtodo est escrito en cursiva, esto significa que abstract

Vamos a crear las Clases Mascota, Perro, Gato y Aplicacin en cdigo de Java. import java.util.Date; public abstract class Mascota { private String nombre; private Date fechaNacimiento; public abstract void acariciar();

Docente: Ing. Martn Salcedo Quiones

Pagina: 139

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public void alimentar(String nombreAlimento){ System.out.println("Mascota - alimentar(...): me acerco al " + nombreAlimento + ", y me lo como"); } public void setNombre(String nombre) { this.nombre = nombre; } public String getNombre(){ return nombre; } public void setFechaNacimiento(Date fechaNacimiento) { this.fechaNacimiento = fechaNacimiento; } public Date getFechaNacimiento(){ return fechaNacimiento; } }

import java.util.Date;

Hay una Clase que se llama Date que est incluida en el paquete java.util para que el entorno de ejecucin Java sepa donde encontrar esta Clase, nosotros se lo tenemos que indicar con la palabra clave import

public abstract class Mascota {

En Java se sabe que una Clase es abstracta porque se utiliza la palabra reservada abstract en la declaracin de la Clase

Date fechaNacimiento;

Docente: Ing. Martn Salcedo Quiones

Pagina: 140

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote A menudo los entornos de desarrollo cuando nos generan cdigo automticamente a travs de sus Asistentes nos escriben la signatura completa de la Clase, es decir el nombre de la Clase y al paquete al cual pertenece. De esta forma la declaracin de esta Clase se vera as: java.util.Date fechaNacimiento y no incluira la palabra clave import

public abstract void acariciar();

Como este mtodo es abstracto y por lo tanto no est implementado, no tiene la llaves {} de abrir y cerrar tpica de todos los mtodos

public void setNombre(String nombre) {

En Java adems de las variables de instancia que estn visibles desde cualquier punto de la Clase, tambin existen las variables locales que slo tienen visibilidad dentro de su mbito, es decir, slo se puede llegar a ellas si se est dentro del mismo bloque un bloque se delimita por los corchetes {}, cmo pueden ser los corchetes de la definicin de un mtodo a la variable nombre que se encuentra en la declaracin del mtodo setNombre(String nombre) tambin se le considera una variable local a pesar de que no est entre dos corchetes {}

this.nombre = nombre;

La palabra clave this se est utilizando en esta ocasin para distinguir una variable de instancia de una variable local. Este es el cdigo correspondiente a la Clase Perro public class Perro extends Mascota { public void acariciar() { System.out.println("Perro - acariciar(): agacho las orejas"); } } System.out.println("Perro - acariciar(): agacho las orejas"); Docente: Ing. Martn Salcedo Quiones

Pagina: 141

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Como ahora nos estamos refiriendo a una mascota concreta, sta enviar el mensaje de que est agachando las orejas. Este es el cdigo correspondiente a la Clase Gato public class Gato extends Mascota { public void acariciar() { System.out.println("Gato - acariciar(): levanto la cola"); } } Ahora le aadimos el siguiente cdigo a la Clase Aplicacin public class Aplicacion { public static void main(String[] args) { // Mascota m1 = new Mascota(); Perro p1 = new Perro(); p1.alimentar("Dog Chow"); p1.acariciar(); Gato g1 = new Gato(); g1.alimentar("Cat Chow"); g1.acariciar(); } }

Perro p1 = new Perro(); Creamos una instancia de la Clase Perro que engloba a la Clase Mascota y a la Clase Perro en una sola instancia que es referenciada a travs de la variable de referencia p1

p1.alimentar("Dog Chow"); Fijmonos que en la salida provocada como respuesta a la invocacin de este mtodo quien est respondiendo es la Mascota acercndose al Dog Chow

Docente: Ing. Martn Salcedo Quiones

Pagina: 142

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

p1.acariciar(); Fijmonos que en la salida provocada como respuesta a la invocacin de este mtodo quien est respondiendo es el Perro agachando las orejas

Gato g1 = new Gato(); Creamos una instancia de la Clase Gato que engloba a la Clase Mascota y a la Clase Gato en una sola instancia que es referenciada a travs de la variable de referencia g1

g1.alimentar("Cat Chow"); Fijmonos que en la salida provocada como respuesta a la invocacin de este mtodo quien est respondiendo es la Mascota acercndose al Cat Chow

g1.acariciar(); Fijmonos que en la salida provocada como respuesta a la invocacin de este mtodo quien est respondiendo es el Gato levantando la cola

Y esta es la salida

Veamos a continuacin otro ejemplo, para lo cual se visualiza el siguiente diagrama:

Docente: Ing. Martn Salcedo Quiones

Pagina: 143

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Figura es una clase abstracta porque no tienen sentido calcular su rea, pero si del cuadrado o un crculo. Si una subclase de Figura no redefine rea(), deber declararse tambin como clase abstracta. De acuerdo al diagrama de clases, la programacin en Java sera: abstract class Figura { protected doubl x; protected doubl y; public Figura(double x, double y) { this.x=x; this.y=y; } public abstract double area(); } class Circulo extends Figura { private double radio; public Circulo(double x, double y, double radio) { Docente: Ing. Martn Salcedo Quiones Pagina: 144

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote super(x,y); this.radio=radio; } public double area() { return Math.PI * radio * radio; } } class Cuadrado extends Figura { private double lado; public Cuadrado(double x, double y, double lado) { super(x,y); this.lado=lado; } public double area( ) { return lado * lado; } } public class FigurasGeometricas { public static void main(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int tipo; double radio, lado; System.out.println("AREA DE UNA FIGURA GEOMETRICA"); System.out.println("-----------------------------"); System.out.print("Ingrese 1 si es circulo 2 si es cuafdrado: "); tipo=Integer.parseInt(br.readLine()); if(tipo==1) { System.out.print("Ingrese el valor del radio: "); radio=Double.parseDouble(br.readLine()); Docente: Ing. Martn Salcedo Quiones Pagina: 145

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Circulo Cir=new Circulo(0,0,radio); System.out.println("El area del circulo es: "+Cir.area()); } if(tipo==2) { System.out.print("Ingrese el valor del lado: "); lado=Double.parseDouble(br.readLine()); Cuadrado Cua=new Cuadrado(0,0,lado); System.out.println("El area del cuadrado es: "+Cua.area()); } }

EJECUTANDO LA APLICACIN EN NETBEANS 12. Crea un proyecto denominado: Sesion10_Aplicaciones

13. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la reciente aplicacin.

Docente: Ing. Martn Salcedo Quiones

Pagina: 146

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

14. Asi debe quedar luego de escribir las instrucciones de la ltima aplicacin

Docente: Ing. Martn Salcedo Quiones

Pagina: 147

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote 15. Luego a proceder a ejecutar la aplicacin

Posteriormente dar clic en Ejecutar archivo

Indicar por ejemplo 1 que es crculo.luego te solcitar el valor del radio. Finalmente se observar el valor del rea del circulo.

Docente: Ing. Martn Salcedo Quiones

Pagina: 148

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

INTERFACES Y HERENCIA MULTIPLE

El concepto de interface lleva un paso ms adelante la idea de las clases abstractas. En Java una interface es una clase abstracta pura, es decir una clase donde todos los mtodos son abstractos (no se implementa ninguno). Permite al diseador de clases establecer la forma de una clase (nombres de mtodos, listas de argumentos y tipos de retorno, pero no bloques de cdigo). Una interface puede tambin contener datos miembro, pero estos son siempre static y final. Una interface sirve para establecer un 'protocolo' entre clases. Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface puede definirse public o sin modificador de acceso, y tiene el mismo significado que para las clases. Todos los mtodos que declara una interface son siempre public. Docente: Ing. Martn Salcedo Quiones Pagina: 149

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Para indicar que una clase implementa los mtodos de una interface se utiliza la palabra clave implements. El compilador se encargar de verificar que la clase efectivamente declare e implemente todos los mtodos de la interface. Una clase puede implementar ms de una interface. Una interface se declara: interface nombre_interface { tipo_retorno nombre_metodo ( lista_argumentos ) ; ... } Por ejemplo: interface InstrumentoMusical { void tocar(); void afinar(); String tipoInstrumento(); } Y una clase que implementa la interface: class InstrumentoViento extends Object implements InstrumentoMusical { void tocar() { . . . }; void afinar() { . . .}; String tipoInstrumento() {} } class Guitarra extends InstrumentoViento { String tipoInstrumento() { return "Guitarra"; } }

Docente: Ing. Martn Salcedo Quiones

Pagina: 150

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote La clase InstrumentoViento implementa la interface, declarando los mtodos y escribiendo el cdigo correspondiente. Una clase derivada puede tambin redefinir si es necesario alguno de los mtodos de la interface. Referencias a Interfaces Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una referencia a una interface puede ser asignada a cualquier objeto que implemente la interface. Por ejemplo: InstrumentoMusical instrumento = new Guitarra(); instrumento.play(); System.out.prinln(instrumento.tipoInstrumento()); InstrumentoMusical i2 = new InstrumentoMusical(); //error.No se puede instanciar Extensin de interfaces Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface puede extender ms de una interface. La sintaxis es: interface nombre_interface extends nombre_interface , . . . { tipo_retorno nombre_metodo ( lista_argumentos ) ; ... }

Agrupaciones de constantes Dado que, por definicin, todos los datos miembros que se definen en una interface son static y final, y dado que las interfaces no pueden instanciarse resultan una buena herramienta para implantar grupos de constantes. Por ejemplo: public interface Meses { int ENERO = 1 , FEBRERO = 2 . . . ; String [] NOMBRES_MESES = { " " , "Enero" , "Febrero" , . . . }; } Docente: Ing. Martn Salcedo Quiones Pagina: 151

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Esto puede usarse simplemente: System.out.println(Meses.NOMBRES_MESES[ENERO]);

Un ejemplo casi real El ejemplo mostrado a continuacin es una simplificacin de cmo funciona realmente la gestin de eventos en el sistema grfico de usuario soportado por el API de Java (AWT o swing). Se han cambiado los nombres y se ha simplificado para mostrar un caso real en que el uso de interfaces resuelve un problema concreto. Supongamos que tenemos una clase que representa un botn de accin en un entorno grfico de usuario (el tpico botn de confirmacin de una accin o de cancelacin). Esta clase pertenecer a una amplia jerarqua de clases y tendr mecanismos complejos de definicin y uso que no son objeto del ejemplo. Sin embargo podramos pensar que siguientes. class Boton extends . . . { protected int x , y, ancho, alto; // posicion del boton protected String texto; // texto del boton Boton(. . .) { ... } void dibujar() { . . .} public void asignarTexto(String t) { . . .} public String obtenerTexto() { . . .) ... } Lo que aqu nos interesa es ver lo que sucede cuando el usuario, utilizando el ratn pulsa sobre el botn. Supongamos que la clase Boton tiene un mtodo, de nombre por ejemplo click(), que es invocado por el gestor de ventanas Docente: Ing. Martn Salcedo Quiones Pagina: 152 la clase Boton tiene miembros como los

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote cuando ha detectado que el usuario ha pulsado el botn del ratn sobre l. El botn deber realizar alguna accin como dibujarse en posicin 'pulsado' (si tiene efectos de tres dimensiones) y adems, probablemente, querr informar a alguien de que se ha producido la accin del usuario. Es en este mecanismo de 'notificacin' donde entra el concepto de interface. Para ello definimos una interface Oyente de la siguiente forma: interface Oyente { void botonPulsado(Boton b); } La interface define un nico mtodo botonPulsado. La idea es que este mtodo sea invocado por la clase Boton cuando el usuario pulse el botn. Para que esto sea posible en algn momento hay que notificar al Boton quien es el Oyente que debe ser notificado. La clase Boton quedara: class Boton extends . . . { ... private Oyente oyente; void registrarOyente(Oyente o) { oyente = o; } void click() { ... oyente.botonPulsado(this); } } El mtodo registrarOyente sirve para que alguien pueda 'apuntarse' como receptor de las acciones del usuario. Obsrvese que existe una referencia de tipo Oyente. A Boton no le importa que clase va a recibir su notificacin. Simplemente le importa que implante la interface Oyente para poder invocar el mtodo botonPulsado. En el mtodo click se invoca este mtodo. En el ejemplo se le pasa como parmetro una referencia al propio objeto Boton. En la realidad lo que se pasa es un objeto 'Evento' con informacin detallada de lo que ha ocurrido. Docente: Ing. Martn Salcedo Quiones Pagina: 153

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Con todo esto la clase que utiliza este mecanismo podra tener el siguiente aspecto: class miAplicacion extends . . . implements Oyente { public static main(String [] args) { new miAplicacion(. . .); ... } ... miAplicacion(. . .) { ... Boton b = new Boton(. . .); b.registrarOyente(this); } ... void botonPulsado(Boton x) { // procesar click ... } } Obsrvese en el mtodo registrarOyente que se pasa la referencia this que en el lado de la clase Boton es recogido como una referencia a la interface Oyente. Esto es posible porque la clase miAplicacion implementa la interface Oyente. En trminos clsicos de herencia miAplicacion ES un Oyente. Veamos el ejemplo que se hizo al final de la sesin anterior. Si no estuvisemos interesados en conocer la posicin de una Figura , podramos eliminar por completo su implementacin y convertir Figura en una interfaz.

Docente: Ing. Martn Salcedo Quiones

Pagina: 154

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

En la declaracin de una interfaz, lo nico que puede aparecer son declaraciones de mtodos (su nombre y signatura, sin su implementacion) y definiciones de constantes simblicas. Una interfaz no encapsula datos, slo define cules son los mtodos que han de implementar los objetos de aquellas clases que implementan interfaz. public class Circulo implements Figura { private double radio; public Circulo (double radio) { this.radio=radio; } public double area() { return Math.PI * radio * radio; } } public class Cuadrado implements Figura Docente: Ing. Martn Salcedo Quiones Pagina: 155

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { private double lado; public Cuadrado (double lado) { this.lado=lado; } public double area() { return lado * lado; } } La clase debe implementar todos los mtodos definidos por la interfaz o declararse. HERENCIA MULTIPLE DE INTERFACES Una clase puede implementar varios interfaces simultneamente, pese a que, en Java, una clase puede heredar de otra clase (herencia simple de implementacin, mltiple de interfaces).

public abstract class Figura { Docente: Ing. Martn Salcedo Quiones Pagina: 156

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public abstract double area(); } interface Dibujable { public void dibujar() } interface Rotable { public void rotar(double grados); } public class Circulo extends Figura implements Dibujable, Rotable { private double radio; public Circulo(double x, double y, double radio) { super(x,y); this.radio=radio; } public double area() { return Math.PI * radio * radio; } public void dibujar() { System.out.println("Dibujaria un circulo"); } public void rotar(double grados) { System.err.print("Se rotara el circulo en "+grados); } Docente: Ing. Martn Salcedo Quiones Pagina: 157

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } public class Cuadrado extends Figura implements Dibujable, Rotable { private double lado; public Cuadrado(double x, double y, double lado) { super(x,y); this.lado=lado; } public double area( ) { return lado * lado; } public void dibujar() { System.out.println("Dibujaria un cuadrado"); } public void rotar(double grados) { System.out.println("Se rotara el cuadrado en "+grados+ grados); } } public class UsandoInterfaces { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int tipo; Docente: Ing. Martn Salcedo Quiones Pagina: 158

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote double radio, lado; System.out.println(" AREA, DIBUJO Y ROTACION DE UNA FIGURA GEOMETRICA"); System.out.println("------------------------------------------------"); System.out.print("Ingrese 1 si es circulo 2 si es cuafdrado: "); tipo=Integer.parseInt(br.readLine()); if(tipo==1) { System.out.print("Ingrese el valor del radio: "); radio=Double.parseDouble(br.readLine()); Circulo Cir=new Circulo(0,0,radio); System.out.println("El area del circulo es: "+Cir.area()); Cir.dibujar(); Cir.rotar(45); } if(tipo==2) { System.out.print("Ingrese el valor del lado: "); lado=Double.parseDouble(br.readLine()); Cuadrado Cua=new Cuadrado(0,0,lado); System.out.println("El area del cuadrado es: "+Cua.area()); Cua.dibujar(); Cua.rotar(30); } }

Docente: Ing. Martn Salcedo Quiones

Pagina: 159

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote EJECUTANDO LA APLICACIN EN NETBEANS 1. Crea un proyecto denominado: Sesion11_Aplicaciones.

Se crea por defecto la clase UsandoInterfaces. 2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la reciente aplicacin.

3. Se procede a escribir el cdigo de la programacin, quedando as: Docente: Ing. Martn Salcedo Quiones Pagina: 160

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4. Luego proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo.

Docente: Ing. Martn Salcedo Quiones

Pagina: 161

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Indicar por ejemplo 2 que es cuadrado.luego te solcitar el valor del lado. Finalmente se observar el valor del rea del circulo, un mensaje sobre dibujo y otro mensaje de rotacin.

Docente: Ing. Martn Salcedo Quiones

Pagina: 162

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

POLIMORFISMO

Mediante el polimorfismo, se pueden escribir programas que procesen genricamente como objetos de superclase- objetos de todas las clases existentes en una jerarqua. Las clases que no existen durante el desarrollo de los programas se pueden agregar con poca o ninguna modificacin de la parte genrica del programa, en tanto esas clases formen parte de la jerarqua que se est procesando genricamente. Ejemplos: import java.io.*; abstract class Empleado{ protected String apellidos; protected String nombres; public Empleado(String ape, String nom) { apellidos=ape; Docente: Ing. Martn Salcedo Quiones

Pagina: 163

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote nombres=nom; } public void setApellidos(String ape) { apellidos=ape; } public void setNombres(String nom) { nombres = nom; } public String getApellidos() { return apellidos; } public String getNombres() { return nombres; } abstract double ganancias(); }

final class Jefe extends Empleado{ public double salario; public Jefe(String ape, String nom,double s) { super(ape,nom); salario=s; } public void setSalario(double s) { salario=s; Docente: Ing. Martn Salcedo Quiones Pagina: 164

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } public double getSalario() { return salario; } public double ganancias() { return salario; } public String toString() { return "Jefe : "+apellidos+" "+nombres; } } final class EmpleadoPorComision extends Empleado { private double salarioBase; // salario Base private double comisionPorArticulo; // comision por articulo vendido private int cantidadDeArticulos; // cantidad de articulos vendidos public EmpleadoPorComision(String ape, String nom,double sb, double com, int cant) { super(ape,nom); salarioBase=sb; comisionPorArticulo=com; cantidadDeArticulos=cant; } public void setSalarioBase(double sb) { salarioBase=sb; } public void setComisionPorArticulo(double com) Docente: Ing. Martn Salcedo Quiones Pagina: 165

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { comisionPorArticulo=com; } public void setCantidadDeArticulos(int cant) { cantidadDeArticulos=cant; } public double getSalarioBase() { return salarioBase; } public double getComisionPorArticulo() { return comisionPorArticulo; } public int getCantidad() { return cantidadDeArticulos; } public String toString() { return "Empleado por Comision : "+apellidos+" "+nombres; } public double ganancias() { return salarioBase+comisionPorArticulo*cantidadDeArticulos; } } final class EmpleadoADestajo extends Empleado{ private double salarioPorPieza; private int cantidad; Docente: Ing. Martn Salcedo Quiones Pagina: 166

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public EmpleadoADestajo(String ape, String nom,double sp, int cant) { super(ape,nom); salarioPorPieza=sp; cantidad=cant; } public void setSalarioPorPieza(double sp) { salarioPorPieza = sp; } public void setCantidad(int cant) { cantidad=cant; } public double getSalarioPorPieza() { return salarioPorPieza; } public double getCantidad() { return cantidad; } public double ganancias() { return salarioPorPieza*cantidad; } public String toString() { return "Empleado a Destajo : "+apellidos+" "+nombres; } } final class EmpleadoPorHora extends Empleado Docente: Ing. Martn Salcedo Quiones Pagina: 167

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { protected double salarioPorHora; protected double horasTrabajadas; public EmpleadoPorHora(String ape, String nom, double sh, double ht) { super(ape,nom); salarioPorHora= sh; horasTrabajadas=ht; } public void setSalarioPorHora(double sh) { salarioPorHora=sh; } public void setHorasTrabajadas(double ht) { horasTrabajadas=ht; } public double getSalarioPorHora() { return salarioPorHora; } public double getHorasTrabajadas() { return horasTrabajadas; } public String toString() { return "Empleado por Hora : "+apellidos+" "+nombres; } public double ganancias() { return salarioPorHora*horasTrabajadas; Docente: Ing. Martn Salcedo Quiones Pagina: 168

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } } public class PruebaEmpleado{ public static void main(String args[]) { Empleado E; Jefe J=new Jefe("Torres","Marcelino",2500);
EmpleadoPorComision C=new EmpleadoPorComision("Zavaleta","Juan",300,4,200);

EmpleadoPorHora H = new
EmpleadoPorHora("Narvaez","Robinson",10,40);

EmpleadoADestajo D = new EmpleadoADestajo("Marin","Alejandro",20,5); E = J; System.out.println(E.toString()+" gano "+E.ganancias()); E = C; System.out.println(E.toString()+" gano "+E.ganancias()); E = H; System.out.println(E.toString()+" gano "+E.ganancias()); E = D; System.out.println(E.toString()+" gano "+E.ganancias()); } } /* La Linea E = J; Coloca en la referencia de la Superclase E una referencia al objeto J de la subclase Jefe. Esto es precisamente lo que debemos hacer para lograr un comportamiento Polimrfico. Docente: Ing. Martn Salcedo Quiones Pagina: 169

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

La expresin: E.toString() Innvoca al mtodo toString() del objeto al que E hace referencia. El sistema invoca al mtodo toString() del objeto de la subclase, precisamente lo que se llama comportamiento polimrfico. Esta llamada de mtodo es un ejemplo de ligado dinmico de mtodos; la decisin respecto a cul mtodo invocar se aplaza hasta el momento de ejecucin. La llamada al Metodo E.ganancias() Invoca al mtodo ganancias del objeto al que E hace referencia. El sistema invoca el mtodo ganancias del objeto de la subclase en lugar del mtodo ganancias de la superclase. Esto es otro ejemplo de ligado dinmico de mtodos. import java.io.*; abstract class Figura{ public double area() { return 0; } public double volumen() { return 0; } public abstract String getNombre(); } class Punto extends Figura{ protected double x; Docente: Ing. Martn Salcedo Quiones Pagina: 170

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote protected double y; public Punto(double a, double b) { x=a; y=b; } public void setX(double x) { this.x=x; } public void setY(double y) { this.y=y; } public double getX() { return x; } public double getY() { return y; } public String toString() { return "("+x+","+y+")"; } public String getNombre() { return "Punto"; } } Docente: Ing. Martn Salcedo Quiones Pagina: 171

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

class Circulo extends Punto{ protected double radio; public Circulo(double a, double b, double r) { super(a,b); radio=r; } public void setRadio(double r) { radio=r; } public double getRadio() { return radio; } public double area() { return Math.PI*Math.pow(radio,2); } public String toString() { return "Centro "+ super.toString()+", Radio = "+radio; } public String getNombre() { return "Circulo"; } } class Cilindro extends Circulo{ protected double altura; Docente: Ing. Martn Salcedo Quiones Pagina: 172

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public Cilindro(double a,double b, double r, double h) { super(a,b,r); altura=h; } public void setAltura(double h) { altura=h; } public double getAltura() { return altura; } public double area() { return 2*super.area()+2*Math.PI*radio*altura; }

public double volumen() { return super.area()*altura; } public String toString() { return super.toString()+ "; Altura = "+altura; } public String getNombre() { return "Cilindro"; } } public class PruebaFigura{ Docente: Ing. Martn Salcedo Quiones Pagina: 173

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public static void main(String args[]) throws IOException { Punto p = new Punto(3,4); Circulo c = new Circulo(12,20,10); Cilindro k = new Cilindro (100,100,50,25); Figura F[] = new Figura[3]; F[0]=p; F[1]=c; F[2]=k; System.out.println(p.getNombre()+" : "+p); System.out.println(c.getNombre()+" : "+c); System.out.println(k.getNombre()+" : "+k);

// Procesamos ahora el arreglo de Figuras e imprimimos el nombre, area y volumen

// de cada objeto for(int i=0;i<3;i++) { System.out.println(); System.out.println(F[i].getNombre()+" : "+F[i]); System.out.println("Area ="+F[i].area()); System.out.println("Volumen"+F[i].volumen()); System.out.println("============="); } } }

EJECUTANDO LA APLICACIN EN NETBEANS 1. Crea un proyecto denominado: Sesion12_Aplicaciones.

Docente: Ing. Martn Salcedo Quiones

Pagina: 174

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

2. Ahora se observa el entorno de NetBeans listo para colocar la programacin de la reciente aplicacin.

3. Se procede a escribir la programacin de la ltima aplicacin, quedando as:

Docente: Ing. Martn Salcedo Quiones

Pagina: 175

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

4. Luego proceder a ejecutar la aplicacin.

Posteriormente dar clic en Ejecutar archivo

Docente: Ing. Martn Salcedo Quiones

Pagina: 176

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

AUTOEVALUACION
a)

Responde a las siguientes preguntas: 1. Usando herencia de clases se logra heredar los atributos y mtodos de una superclase. (verdaero o falso): ___________________ 2. Los miembros protected de una superclase slo estn accesibles para los mtodos de la superclase, los mtodos de la subclases y los mtodos de otras clases del mismo paquete (verdadero falso): __________________ 3. Se le denomina clase abstracta pura cuando todos sus mtodos son abstractos, ste concepto se refiere a: __________________ 4. Se puede escribir programas que procesen genricamente objetos de todas las clases existentes en una jerarqua, se refiere a _______________ b) Desarrolla las siguientes aplicaciones: 1. Crea una clase denominada Curso con los atributos codigocur y nombrecur. Luego aplica herencia y crea la clase Curso_Extension a partir de la clase Curso con los atributos horas_clase y costocur. Tambin crea la clase Curso_Carrera con los atributos nombrecarrera y ciclo. Luego crea objetos a partir de las subclases 2. Una empresa vende equipos celulares, que puede ser utilizados nicamente para CLARO o para MOVISTAR. Se desea tener informacin de la marca, el modelo y el costo del equipo. Adems se puede adquirir adicionalmente el chip teniendo un descuento del 10% del costo del chip si Docente: Ing. Martn Salcedo Quiones Pagina: 177

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote es comprado conjuntamente con el celular. Por la compra de cualquier equipo, el cliente puede adquirir un seguro de prdida o robo pagando el 15% del costo del equipo. El pago por el equipo celular puede ser en efectivo o mcon tarjeta. Si el pago es con tarjeta se incrementa el costo del equipo en un 2%. Utiliza una programacin usando clases abstracta y herencia para calcular el precio del equipo y el monto del pago del seguro en caso decidiera acogerse. Usar clase abstracta. 3. Aplicando polimorfismo, implementar los atributos, mtodos (con las validaciones correspondientes) y constructores de las siguientes clases con sus atributos indicados entre parntesis: Figura (smbolo), Rectngulo (filas: entero >1, columnas: entero>1), Tringulo (filas: entero>1) y Rombo (filas: entero>2 e impar). Crear el mtodo dibujar para cada caso. Crear la clase TestFiguras, que pruebe los mtodos y constructores implementados. Como ejemplo de la ejecucin del mtodo dibujar para cada objeto creado, en caso que se haya asignado como smbolo de la figura al asterisco (*) y los valores para las filas y columnas indicados a continuacin, se tendra: Objeto Rectngulo: Filas=2 Columnas=6 ****** ****** Objeto Tringulo: Filas=3 * *** ***** Objeto Rombo: Filas=7 * *** ***** ******* ***** *** *

Docente: Ing. Martn Salcedo Quiones

Pagina: 178

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

CAPITULO IV
PAQUETES, EXCEPCIONES Y DESARROLLO DE UN PROYECTO

Docente: Ing. Martn Salcedo Quiones

Pagina: 179

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

PAQUETES

Clasula package Un package es una agrupacin de clases afines. Equivale al concepto de librera existente en otros lenguajes o sistemas. Una clase puede definirse como perteneciente a un package y puede usar otras clases definidas en ese o en otros packages. Los packages delimitan el espacio de nombres (space name). El nombre de una clase debe ser nico dentro del package donde se define. Dos clases con el mismo nombre en dos packages distintos pueden coexistir e incluso pueden ser usadas en el mismo programa. Una clase se declara perteneciente a un package con la clusula package, cuya sintaxis es: package nombre_package; La clausula package debe ser la primera sentencia del archivo fuente. Cualquier clase declarada en ese archivo pertenece al package indicado. Por ejemplo, un archivo que contenga las sentencias: package miPackage; Docente: Ing. Martn Salcedo Quiones Pagina: 180

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote ... class miClase { ... declara que la clase miClase pertenece al package miPackage. La clasula package es opcional. Si no se utiliza, las clases declaradas en el archivo fuente no pertenecen a ningn package concreto, sino que pertenecen a un package por defecto sin nombre. La agrupacin de clases en packages es conveniente desde el punto de vista organizativo, para mantener bajo una ubicacin comn clases relacionadas que cooperan desde algn punto de vista. Tambin resulta importante por explican en un captulo posterior. Clasula import Cuando se referencia cualquier clase dentro de otra se asume, si no se indica otra cosa, que sta otra est declarada en el mismo package. Por ejemplo: package Geometria; ... class Circulo { Punto centro; ... } En esta declaracin definimos la clase Circulo perteneciente al package Geometria. Esta clase usa la clase Punto. El compilador y la JVM asumen que Punto pertenece tambin al package Geometria, y tal como est hecha la definicin, para que la clase Punto sea accesible (conocida) por el compilador, es necesario que est definida en el mismo package. la implicacin que los packages tienen en los modificadores de acceso, que se

Docente: Ing. Martn Salcedo Quiones

Pagina: 181

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Si esto no es as, es necesario hacer accesible el espacio de nombres donde est definida la clase Punto a nuestra nueva clase. Esto se hace con la clausula import. Supongamos que la clase Punto estuviera definida de esta forma: package GeometriaBase; class Punto { int x , y; } Entonces, para usar la clase Punto en nuestra clase Circulo deberiamos poner: package GeometriaAmpliada; import GeometriaBase.*; class Circulo { Punto centro; ... } Con la clasula import GeometriaBase.*; se hacen accesibles todos los nombres (todas las clases) declaradas en el package GeometriaBase. Si slo se quisiera tener accesible la clase Punto se podra declarar: import GeometriaBase.Punto; Tambin es posible hacer accesibles los nombres de un package sin usar la clausula import calificando completamente los nombres de aquellas clases pertenecientes a otros packages. Por ejemplo: package GeometriaAmpliada; class Circulo { GeometriaBase.Punto centro; ... } Docente: Ing. Martn Salcedo Quiones Pagina: 182

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Sin embargo si no se usa import es necesario especificar el nombre del package cada vez que se usa el nombre Punto. La clasula import simplemente indica al compilador donde debe buscar clases adicionales, cuando no pueda encontrarlas en el package actual y delimita los espacios de nombres y modificadores de acceso. Sin embargo, no tiene la implicacin de 'importar' o copiar cdigo fuente u objeto alguno. En una clase puede haber tantas sentencias import como sean necesarias. Las clusulas import se colocan despus de la clusula package (si es que existe) y antes de las definiciones de las clases. Nombres de los packages Los packages se pueden nombrar usando nombres compuestos separados por puntos, de forma similar a como se componen las direcciones URL de Internet. Por ejemplo se puede tener un package de nombre misPackages.Geometria.Base. Cuando se utiliza esta estructura se habla de packages y subpackages. En el ejemplo misPackages es el Package base, Geometria es un subpackage de misPackages y Base es un subpackage de Geometria. De esta forma se pueden tener los packages ordenados segn una jerarqua equivalente a un sistema de archivos jerrquico. El API de java est estructurado de esta forma, con un primer calificador (java o javax) que indica la base, un segundo calificador (awt, util, swing, etc.) que indica el grupo funcional de clases y opcionalmente subpackages en un tercer nivel, dependiendo de la amplitud del grupo. Cuando se crean packages de usuario no es recomendable usar nombres de packages que empiecen por java o javax. Ubicacin de packages en el sistema de archivos Docente: Ing. Martn Salcedo Quiones Pagina: 183

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Adems del significado lgico descrito hasta ahora, los packages tambin tienen un significado fsico que sirve para almacenar los mdulos ejecutables (ficheros con extensin .class) en el sistema de archivos del ordenador. Supongamos que definimos una clase de nombre miClase que pertenece a un package de nombre misPackages.Geometria.Base. Cuando la JVM vaya a cargar en memoria miClase miClase.class) en un buscar el mdulo ejecutable (de nombre directorio en la ruta de acceso

misPackages/Geometria/Base. Est ruta deber existir y estar accesible a la JVM para que encuentre las clases. En el captulo siguiente se dan detalles sobre compilacin y ejecucin de programas usando el compilador y la mquina virtural distribuida por SUN Microsystems (JDK). Si una clase no pertenece a ningn package (no existe clausula package ) se asume que pertenece a un package por defecto sin nombre, y la JVM buscar el archivo .class en el directorio actual. Para que una clase pueda ser usada fuera del package donde se defini debe ser declarada con el modificador de acceso public, de la siguiente forma:

package GeometriaBase; public class Punto { int x , y; } Si una clase no se declara public slo puede ser usada por clases que pertenezcan al mismo package

Docente: Ing. Martn Salcedo Quiones

Pagina: 184

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

MANEJO DE EXCEPCIONES E HILOS

El trmino excepcin es un forma corta da la frase "suceso excepcional" y puede definirse de la siguiente forma. Definicin: Una excepcin es un evento que ocurre durante la ejecucin del programa que interrumpe el flujo normal de las sentencias. Muchas clases de errores pueden utilizar excepciones -- desde serios problemas de hardware, como la avera de un disco duro, a los simples errores de programacin, como tratar de acceder a un elemento de un array fuera de sus lmites. Cuando dicho error ocurre dentro de un mtodo Java, el mtodo Docente: Ing. Martn Salcedo Quiones Pagina: 185

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote crea un objeto 'exception' y lo maneja fuera, en el sistema de ejecucin. Este objeto contiene informacin sobre la excepcin, incluyendo su tipo y el estado del programa cuando ocurri el error. El sistema de ejecucin es el responsable de buscar algn cdigo para manejar el error. En terminologa java, crear una objeto exception y manejarlo por el sistema de ejecucin se llama lanzar una excepcin. Despus de que un mtodo lance una excepcin, el sistema de ejecucin entra en accin para buscar el manejador de la excepcin. El conjunto de "algunos" mtodos posibles para manejar la excepcin es el conjunto de mtodos de la pila de llamadas del mtodo donde ocurri el error. El sistema de ejecucin busca hacia atrs en la pila de llamadas, empezando por el mtodo en el que ocurri el error, hasta que encuentra un mtodo que contiene el "manejador de excepcin" adecuado. Un manejador de excepcin es considerado adecuado si el tipo de la excepcin lanzada es el mismo que el de la excepcin manejada por el manejador. As la excepcin sube sobre la pila de llamadas hasta que encuentra el manejador apropiado y una de las llamadas a mtodos maneja la excepcin, se dice que el manejador de excepcin elegido captura la excepcin. Si el sistema de ejecucin busca exhaustivamente por todos los mtodos de la pila de llamadas sin encontrar el manejador de excepcin adecuado, el sistema de ejecucin finaliza (y consecuentemente y el programa Java tambin). import java.awt.*; import java.applet.Applet; public class HolaIte extends Applet { private int i = 0; private String Saludos[] = { "Hola Mundo!", "HOLA Mundo!", "HOLA MUNDO!!" }; Docente: Ing. Martn Salcedo Quiones Pagina: 186

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

public void paint( Graphics g ) { g.drawString( Saludos[i],25,25 ); i++; } } Normalmente, un programa termina con un mensaje de error cuando se lanza una excepcin. Sin embargo, Java tiene mecanismos para excepciones que permiten ver qu excepcin se ha producido e intentar recuperarse de ella. Vamos a reescribir el mtodo paint() de nuestra versin iterativa del saludo: public void paint( Graphics g ) { try { g.drawString( Saludos[i],25,25 ); } catch( ArrayIndexOutOfBoundsException e ) { g.drawString( "Saludos desbordado",25,25 ); } catch( Exception e ) { // Cualquier otra excepcin System.out.println( e.toString() ); } finally { System.out.println( "Esto se imprime siempre!" ); } i++; } La palabra clave finally define un bloque de cdigo que se quiere que sea ejecutado siempre, de acuerdo a si se captur la excepcin o no. En el ejemplo anterior, la salida en la consola, con i=4 sera: Saludos desbordado Esto se imprime siempre! Cuando se produce un error se debera generar, o lanzar, una excepcin. Para que un mtodo en Java, pueda lanzar excepciones, hay que indicarlo expresamente. Docente: Ing. Martn Salcedo Quiones Pagina: 187

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote
void MetodoAsesino() throws NullPointerException,CaidaException

Se pueden definir excepciones propias, no hay por qu limitarse a las predefinidas; bastar con extender la clase Exception y proporcionar la funcionalidad extra que requiera el tratamiento de esa excepcin. Tambin pueden producirse excepciones no de forma explcita como en el caso anterior, sino de forma implcita cuando se realiza alguna accin ilegal o no vlida. Las excepciones, pues, pueden originarse de dos modos: el programa hace algo ilegal (caso normal), o el programa explcitamente genera una excepcin ejecutando la sentencia throw (caso menos normal). La sentencia throw tiene la siguiente forma:
throw ObtejoExcepction;

El objeto ObjetoException es un objeto de una clase que extiende la clase Exception. El siguiente cdigo de ejemplo origina una excepcin de divisin por cero: class melon { public static void main( String[] a ) { int i=0, j=0, k; k = i/j; } // Origina un error de division-by-zero

} Si compilamos y ejecutamos esta aplicacin Java, obtendremos la siguiente salida por pantalla: > javac melon.java > java melon java.lang.ArithmeticException: / by zero at melon.main(melon.java:5) Las excepciones predefinidas, como ArithmeticException, se conocen como excepciones runtime. Actualmente, como todas las excepciones son eventos Docente: Ing. Martn Salcedo Quiones Pagina: 188

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote runtime, sera mejor llamarlas excepciones irrecuperables. Esto contrasta con las excepciones que generamos explcitamente, que suelen ser mucho menos severas y en la mayora de los casos podemos recuperarnos de ellas. Por ejemplo, si un fichero no puede abrirse, preguntamos al usuario que nos indique otro fichero; o si una estructura de datos se encuentra completa, podremos sobreescribir algn elemento que ya no se necesite. Los nombres de las excepciones indican la condicin de error que representan. Las siguientes son las excepciones predefinidas ms frecuentes que se pueden encontrar: ArithmeticException Las excepciones aritmticas son tpicamente el resultado de una divisin por 0:
int i = 12 / 0;

NullPointerException Se produce cuando se intenta acceder a una variable o mtodo antes de ser definido: class Hola extends Applet { Image img; paint( Graphics g ) { g.drawImage( img,25,25,this ); } } IncompatibleClassChangeException El intento de cambiar una clase afectada por referencias en otros objetos, especficamente cuando esos objetos todava no han sido recompilados. ClassCastException El intento de convertir un objeto a otra clase que no es vlida. Docente: Ing. Martn Salcedo Quiones Pagina: 189

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote y = (Prueba)x; // donde x no es de tipo Prueba NegativeArraySizeException Puede ocurrir si hay un error aritmtico al intentar cambiar el tamao de un array. OutOfMemoryException No debera producirse nunca! El intento de crear un objeto con el operador new ha fallado por falta de memoria. Y siempre tendra que haber memoria suficiente porque el garbage collector se encarga de proporcionarla al ir liberando objetos que no se usan y devolviendo memoria al sistema. NoClassDefFoundException Se referenci una clase que el sistema es incapaz de encontrar. ArrayIndexOutOfBoundsException Es la excepcin que ms frecuentemente se produce. Se genera al intentar acceder a un elemento de un array ms all de los lmites definidos inicialmente para ese array.

THREADS Y MULTITHREADING Considerando el entorno multithread, cada thread (hilo, flujo de control del programa) representa un proceso individual ejecutndose en un sistema. A veces se les llama procesos ligeros o contextos de ejecucin. Tpicamente, cada thread controla un nico aspecto dentro de un programa, como puede ser supervisar la entrada en un determinado perifrico o controlar toda la entrada/salida del disco. Todos los threads comparten los mismos recursos, al contrario que los procesos en donde cada uno tiene su propia copia de cdigo y datos (separados unos de otros). Grficamente, los threads se parecen en su funcionamiento a lo que muestra la figura siguiente:

Docente: Ing. Martn Salcedo Quiones

Pagina: 190

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

Programas de flujo nico Un programa de flujo nico o mono-hilvanado (single-thread) utiliza un nico flujo de control (thread) para controlar su ejecucin. Muchos programas no necesitan la potencia o utilidad de mltiples flujos de control. Sin necesidad de especificar explcitamente que se quiere un nico flujo de control, muchos de los applets y aplicaciones son de flujo nico. Por ejemplo, en nuestra aplicacin estndar de saludo:

public class HolaMundo { static public void main( String args[] ) { System.out.println( "Hola Mundo!" ); } } Aqu, cuando se llama a main(), la aplicacin imprime el mensaje y termina. Esto ocurre dentro de un nico thread. Programas de flujo mltiple En nuestra aplicacin de saludo, no vemos el thread que ejecuta nuestro programa. Sin embargo, Java posibilita la creacin y control de threads explcitamente. La utilizacin de threads en Java, permite una enorme flexibilidad a los programadores a la hora de plantearse el desarrollo de aplicaciones. La simplicidad para crear, configurar y ejecutar threads, permite que se puedan implementar muy poderosas y portables aplicaciones/applets que no se puede con otros lenguajes de tercera generacin. En un lenguaje orientado a Internet como es Java, esta herramienta es vital.

Docente: Ing. Martn Salcedo Quiones

Pagina: 191

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Si se ha utilizado un navegador con soporte Java, ya se habr visto el uso de mltiples threads en Java. Habr observado que dos applet se pueden ejecutar al mismo tiempo, o que puede desplazar la pgina del navegador mientras el applet contina ejecutndose. Esto no significa que el applet utilice mltiples threads, sino que el navegador es multithreaded. Las aplicaciones (y applets) multithreaded utilizan muchos contextos de ejecucin para cumplir su trabajo. Hacen uso del hecho de que muchas tareas contienen subtareas distintas e independientes. Se puede utilizar un thread para cada subtarea. Mientras que los programas de flujo nico pueden realizar su tarea ejecutando las subtareas secuencialmente, un programa multithreaded permite que cada thread comience y termine tan pronto como sea posible. Este comportamiento presenta una mejor respuesta a la entrada en tiempo real. Vamos a modificar nuestro programa de saludo creando tres threads individuales, que imprimen cada uno de ellos su propio mensaje de saludo, MultiHola.java: // Definimos unos sencillos threads. Se detendrn un rato // antes de imprimir sus nombres y retardos class TestTh extends Thread { private String nombre; private int retardo; // Constructor para almacenar nuestro nombre // y el retardo public TestTh( String s,int d ) { nombre = s; retardo = d; } // El metodo run() es similar al main(), pero para // threads. Cuando run() termina el thread muere public void run() { // Retasamos la ejecucin el tiempo especificado Docente: Ing. Martn Salcedo Quiones Pagina: 192

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote try { sleep( retardo ); } catch( InterruptedException e ) { ; } // Ahora imprimimos el nombre System.out.println( "Hola Mundo! "+nombre+" "+retardo ); } } public class MultiHola { public static void main( String args[] ) { TestTh t1,t2,t3; // Creamos los threads t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) ); t2 = new TestTh( "Thread 2",(int)(Math.random()*2000) ); t3 = new TestTh( "Thread 3",(int)(Math.random()*2000) ); // Arrancamos los threads t1.start(); t2.start(); t3.start(); } } PROYECTO: TIENDA Este proyecto desarrollado con programacin en Java usando el entorno de desarrollo NetBeans consta de 5 archivos de extensin java: Almacen.java DetallePedido.java Pedido.java Producto.java Sistema_Tienda.java

Docente: Ing. Martn Salcedo Quiones

Pagina: 193

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote Sistema_Tienda.java contiene: package proyecto_tienda; import java.io.*; public class Sistema_Tienda { public static int mostrarMenuPrincipal()throws IOException { int op; BufferedReader InputStreamReader(System.in)); br = new BufferedReader(new

System.out.println("MENU PRINCIPAL"); System.out.println("=============="); System.out.println(""); System.out.println("1. Adicionar Almacen"); System.out.println("2. Mantenimiento de Productos"); System.out.println("3. Realizar Pedidos"); System.out.println("4. Listar Productos"); System.out.println("5. Listar Pedidos"); System.out.println("6. Salir"); System.out.println(""); System.out.print("Ingresa una opcion: "); op=Integer.parseInt(br.readLine()); return op; } public static int mostrarMenuProductos()throws IOException { int op; BufferedReader InputStreamReader(System.in)); br = new BufferedReader(new

System.out.println("MENU PARA PRODUCTOS"); System.out.println("==================="); System.out.println(""); Docente: Ing. Martn Salcedo Quiones Pagina: 194

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote System.out.println("1. Adicionar Producto"); System.out.println("2. Modificar Producto"); System.out.println("3. Salir"); System.out.println(""); System.out.print("Ingresa una opcion: "); op=Integer.parseInt(br.readLine()); return op; }

public static void main(String args[])throws IOException { BufferedReader InputStreamReader(System.in)); String nomalmacen, nompro; int rpta=1, cant, opcion, r=0, numpro; float pre; Almacen oA= null; Producto p; do { opcion=mostrarMenuPrincipal(); switch (opcion) { case 1: System.out.print("Ingrese el nombre del almacen: "); nomalmacen=br.readLine(); oA= new Almacen(nomalmacen); if(oA!=null) System.out.println("Almacen creado ..."); break; case 2: do { Docente: Ing. Martn Salcedo Quiones Pagina: 195 br = new BufferedReader(new

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote r=mostrarMenuProductos(); switch(r) { case 1: System.out.println(""); System.out.println("INGRESO DE PRODUCTOS"); System.out.println("===================="); do { System.out.print("CODIGO DEL PRODUCTO: "); numpro=Integer.parseInt(br.readLine()); System.out.print("NOMBRE: "); nompro=br.readLine(); System.out.print("STOCK: "); cant=Integer.parseInt(br.readLine()); System.out.print("PRECIO: "); pre=Float.parseFloat(br.readLine()); System.out.print("Desea ingresar los datos de otro producto? (Si=1, No=0): "); rpta=Integer.parseInt(br.readLine()); System.out.println(""); //Creacion del Objeto a partir de la Clase Producto p=new Producto(numpro, nompro, cant, pre); //Adiciona el objeto al Arreglo de Productos oA.adicionarProducto(p); }while(rpta==1); break; case 2: //Falta hacer la modificacion de datos del producto } }while(r!=3); break; case 3: // Falta hacer la realizacion del pedido Docente: Ing. Martn Salcedo Quiones Pagina: 196

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote break; case 4: System.out.println("LISTA DE PRODUCTOS"); int total,i; total=oA.getNproductos(); if (total>0) for(i=0;i<total;i++) { p=oA.obtenerProducto(i); System.out.println(p.getNombre()+"\t"+p.getStock() +"\t"+p.getPrecio()); } break; case 5: // Falta hacer el listado de pedidos } }while(opcion !=6); System.out.println(""); System.out.println("Gracias por usar el pequeo Sistema ...."); } } Almacen.java contiiene: package proyecto_tienda; public class Almacen { //Atributos propios de la clase private String nombre; //Atributos resultado de la relacion con la clase Producto private int nproductos; private Producto[] productos; public Almacen(String nom) Docente: Ing. Martn Salcedo Quiones Pagina: 197

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote { nombre=nom; //Creacion del arreglo de objetos producto nproductos = 0; productos = new Producto[100]; } //Mtodo para adicionar o grabar un nuevo producto para un almacen especifico public String adicionarProducto(Producto prod) { //Variable que nos servir si realmente se registr el producto String rpta; //Consulta si el arreglo tiene menos de 100 items if (nproductos < 100) { //Si tiene menos de 100 items lo agrega al arreglo productos[nproductos] = prod; //Incremente la cantidad de elementos que tiene el arreglo nproductos++; //Un mensaje diciendo que se registro el producto rpta = "Se registro el producto"; } else { //Un mensaje diciendo que no se pudo registrar rpta = "No se registro el producto"; } return rpta; } //Mtodo para obtener los datos del producto dado el indice public Producto obtenerProducto(int indice) { //El indice tiene que ser menor a la cantidad de elementos que tenemos en el arreglo if (indice < 0 || indice >= nproductos) { Docente: Ing. Martn Salcedo Quiones Pagina: 198

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote //Si el indice esta fuera del rango return null; } else { //Retorma el elemento en la posicion que deseamos return productos[indice]; } } //Mtodo que permite buscar Producto x nombre public Producto buscarProducto(String nom) { Producto pro=null; //Recorre el Arreglo de Productos for(int i=0; i<nproductos; i++) { //Verifica si existe el Producto x su nombre if(nom.equals(productos[i].getNombre())) { pro=obtenerProducto(i); break; //sale del For } } return pro; } public String modificarProducto(Producto prod) { //Variable que nos indicara si realmente se registro el producto String rpta; int indice=-1; for(int i=0; i<this.nproductos; i++) { //Verifica si existe el Producto x su nombre if(prod.getNombre().equals(this.productos[i].getNombre())) { //ObjTabla.setValue(valor,nroFila,nroColumna) indice=i; break;//sale del For } } Docente: Ing. Martn Salcedo Quiones Pagina: 199

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote //Consulta si el arreglo tiene menos de 100 items if (indice < 100) { //Si tiene menos de 100 items lo agrega al arreglo this.productos[indice] = prod; //Manda un mensaje diciendo que se registro el producto rpta = "Se modific el producto"; } else { //Manda un mensaje diciendo que no se pudo registrar rpta = "No se modific el producto"; } return rpta; }

public int getNproductos() { return nproductos; } public String getNombre() { return nombre; } } Producto.java contiene: package proyecto_tienda; public class Producto { //Atributos de la clase private int numpro; private String nombre; private float precio; private int stock; //Constructor Docente: Ing. Martn Salcedo Quiones Pagina: 200

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote public Producto(int numpro, String nombre, int stock,float precio ) { this.numpro = numpro; this.nombre = nombre; this.precio = precio; this.stock = stock; } //Los Metodos Set y Get para cada atributo public int getNumPro() { return numpro; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } public float getPrecio() { return precio; } public void setPrecio(float precio) { Docente: Ing. Martn Salcedo Quiones Pagina: 201

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote this.precio = precio; } public String toString() { return "Producto{" +"NumPro="+numpro+ " Nombre=" + nombre + ", Precio=" + precio + ", Stock=" + stock + '}'; } } Pedido.java contiene: package proyecto_tienda; public class Pedido { //Atributos propios de la clase private int numero; private String fecha; private String cliente; //Atributos resultado de la relacion con la //clase DetallePedido- Arreglo de Objetos //DetallePedido private int ndetalles; private DetallePedido[] detalles; //Constructor public Pedido(int numero, String fecha,String cliente) { this.numero = numero; this.fecha = fecha; this.cliente = cliente; //Porque el primer indice va a ser cero this.ndetalles = 0; //Creamos el arreglo con un maximo de 50 this.detalles = new DetallePedido[50]; } //Se obtiene el numero del pedido public int getNumero() { return numero; } //Se obtiene la fecha de emisin del pedido public String getFecha() { return fecha; } Docente: Ing. Martn Salcedo Quiones Pagina: 202

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote

//Se obtiene el cliente que realiz el pedido public String getCliente() { return cliente; } //Se obtiene la cantidad de detalles que tiene el Pedido public int getNdetalles() { return ndetalles; } //Sirve para adicionar un detalle de pedido al pedido public String adicionarDetalle(DetallePedido det) { //Variable que nos indicara si realmente se registro el detalle String rpta; //Consulta si el arreglo tiene menos de 50 items if (this.ndetalles < 50) { //Si tiene menos de 50 items lo agrega al arreglo this.detalles[this.ndetalles] = det; //Incremente la cantidad de elementos que tiene el arreglo this.ndetalles++; //Manda un mensaje diciendo que se registro el detalle rpta = "Se registro el detalle"; } else { //Manda un mensaje diciendo que no se pudo registrar rpta = "No se registro el detalle"; } return rpta; } // Sirve para obtener un detalle de pedido segun el indice public DetallePedido obtenerDetalle(int indice) { //El indice tiene que ser menor a la cantidad de //elementos que tenemos en el arreglo if (indice < 0 || indice >= this.ndetalles) { //Si el indice esta fuera del rango return null; } else { //Retorma el elemento en la posicion que deseamos return this.detalles[indice]; } } //Sirve para obtener el total del Pedido public float calcularTotalPedido() { float total = 0; //Tenemos que recorrer todos los detallesPedido Docente: Ing. Martn Salcedo Quiones Pagina: 203

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote //Hasta la cantidad que nos indique la variable //ndetalles for (int i = 0; i < this.ndetalles; i++) { //obtengo la cantidad int cantidad = this.detalles[i].getCantidad(); //obtengo el precio float precio = this.detalles[i].getPrecio(); //incremento el total total += (cantidad * precio); } return total; } } DetallePedido.java contiene: package proyecto_tienda; public class DetallePedido { //Atributos propios de la clase private int cantidad; private float precio; //Atributos que se obtiene de la relacion //Con la clase DetallePedido private Producto producto; //Contructor public DetallePedido(int cantidad, float precio, Producto producto) { this.cantidad = cantidad; this.precio = precio; this.producto = producto; } //Se obtiene la cantidad de Productos del Detalle public int getCantidad() { return cantidad; } //Se obtiene el precio del Producto public float getPrecio() { return precio; } //Se obtiene el producto que esta en el detalle public Producto getProducto() { return producto; Docente: Ing. Martn Salcedo Quiones Pagina: 204

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote } } AUTOEVALUACION
a)

Responde a las siguientes preguntas: 1. Agrupacin de clases afines se les denomina paquetes (verdadero o falso): _______________________ 2. Es un evento que ocurre durante la ejecucin de un programa que interrumpe el flujo normal de las sentencias: ____________________ 3. Dos clases con el mismo nombre en dos paquetes distintos no pueden coexistir e incluso no pueden usadas en el mismo programa (verdadero o falso): _______________________ 4. Controla un nico aspecto dentro de un programa, como puede ser supervisar la entrada en un determinado perifrico o controlar toda la entrada / salida del disco se denomina: ________________________ b) Muestra una lista de excepciones que te propone Java y la manera como se debe interpretarlos al momento que se muestre en la ejecucin de un programa. REFERENCIAS WEBGRAFICAS http://dis.um.es/~bmoros/Tutorial/parte8/cap8-1a.html (La Clase Math) http://www.webtaller.com/manual-java/clase-integer.php (La Clase Integer) http://www.webtaller.com/manual-java/clase-character.php (La clase Character) http://www.webtaller.com/manual-java/clase-float.php (La clase Float) http://www.webtaller.com/manual-java/clase-double.php (La clase Double) http://es.scribd.com/doc/87261446/Introduccion-Java (La clase String, Arreglos) http://pruebaodshadow.blogspot.com/2010/11/estructuras-recursivas.html (recursividad) http://ingsolorzano.wordpress.com/clases-con-java/ (Estructura de una clase) http://www.edukanda.es/mediatecaweb/data/zip/1305/page_38.htm (Instanciar objetos) http://www.buenastareas.com/ensayos/Constructor-Java/1411669.html (Mtodos constructores) http://wwwdi.ujaen.es/asignaturas/progav/progav-tema2.pdf (Relaciones entre clases) http://mundogeek.net/archivos/2009/03/30/modificadores-en-java/ (Modificadores de acceso) Docente: Ing. Martn Salcedo Quiones Pagina: 205

TECNICAS DE PROGRAMACION
Universidad Catlica los Angeles de Chimbote http://www.geocities.ws/marcelino_torres_villanueva/programacionorientada aobjetos.pdf (Herencia de clases, polimorfismo) http://dns.uls.cl/~ej/web_Poo_2010/Teo_Poo_2010/librojava.doc (Clases abstractas) http://www.webtaller.com/construccion/lenguajes/java/lecciones/clasescontra-interfaces-java.php (Interfaces) http://dis.um.es/~lopezquesada/documentos/IES_1011/DFSI/curso/UT6/java /cap11/index.html (Interfaces)

Docente: Ing. Martn Salcedo Quiones

Pagina: 206

You might also like