Anda di halaman 1dari 111

Gua de Preparacin para la certificacin Oracle Certified Java Programmer 6

Autor: Ing. Santiago Mosquera

Queda prohibida la reproduccin Total o Parcial de este documento sin previa autorizacin del Autor

INDICE

Contenido
INTRODUCCIN ........................................................................................................................ 1 OBJETIVOS................................................................................................................................ 1 ORIENTACIONES GENERALES ..................................................................................................... 1 HERENCIA Y POLIMORFISMO..................................................................................................... 2 1. HERENCIA...................................................................................................................... 3 1.1 1.2 2. 3. 4. 5. 6. 7. 8. 9. 1. 2. 3. 4. 5. 6. 7. 1. 2. 3. Sobrecarga de mtodos .......................................................................................... 3 Sobrescritura de mtodos ....................................................................................... 3

CREACIN DE OBJETOS EN LA JVM.................................................................................. 5 POLIMORFISMO............................................................................................................. 6 CLASES ABSTRACTAS ...................................................................................................... 9 INTERFACES................................................................................................................. 11 MODIFICADORES DE ACCESO........................................................................................ 13 SOBRESCRITURA Y MODIFICADORES DE ACCESO............................................................ 13 RELACIONES ENTRE CLASES E INTERFACES..................................................................... 15 EVALUACIN................................................................................................................ 17 TRATAMIENTO DE EXCEPCIONES................................................................................... 29 TIPOS DE EXCEPCIONES ................................................................................................ 29 CMO LANZAR EXCEPCIONES ....................................................................................... 30 SOBRESCRITURA Y EXCEPCIONES................................................................................... 32 CREACIN DE EXCEPCIONES ......................................................................................... 33 FLUJO DE EXCEPCIONES................................................................................................ 33 EVALUACIN................................................................................................................ 37 CARACTERSTICAS DEL CONSTRUCTOR .......................................................................... 43 CONSTRUCTORES Y HERENCIA ...................................................................................... 43 BLOQUES DE INICIALIZACIN........................................................................................ 46

EXCEPCIONES.......................................................................................................................... 28

CONSTRUCTORES.................................................................................................................... 42

4. 1. 2. 3. 4. 1. 2. 3. 1. 2. 3. 4. 1. 2. 3. 4. 1. 2. 3. 4. 4.1. 4.2. 5. 1. 2.

EVALUACIN................................................................................................................ 47 COMPILACIN.............................................................................................................. 54 EJECUCIN .................................................................................................................. 56 CLASSPATH.................................................................................................................. 56 EVALUACIN................................................................................................................ 60 CMO DECLARAR, INSTANCIAR Y MANIPULAR UN ARREGLO.......................................... 64 ARREGLOS MULTIDIMENSIONALES................................................................................ 65 EVALUACIN................................................................................................................ 67 CLASES INNER REGULARES............................................................................................ 71 CLASES INNER LOCALES AL MTODO............................................................................. 72 CLASES INNER ANNIMAS............................................................................................ 72 EVALUACIN................................................................................................................ 75 CMO CREAR UNA ENUMERACIN.............................................................................. 79 CONSTRUCTORES DE UNA ENUMERACIN .................................................................... 80 CMO AGREGAR ATRIBUTOS A UNA ENUMERACIN..................................................... 80 EVALUACIN................................................................................................................ 81 CMO CREAR UN ARCHIVO .......................................................................................... 86 CMO CREAR UN DIRECTORIO...................................................................................... 87 CMO RENOMBRAR UN ARCHIVO O UN DIRECTORIO .................................................... 87 LECTURA Y ESCRITURA DE ARCHIVOS ............................................................................ 88 FileReader/FileWriter ............................................................................................... 88 BufferedReader/BufferedWriter................................................................................ 89 EVALUACIN................................................................................................................ 91 CMO OBTENER EL HILO DE EJECUCIN ACTUAL........................................................... 95 CREACIN Y EJECUCIN DE HILOS................................................................................. 95

COMPILACIN Y EJECUCIN .................................................................................................... 53

ARREGLOS .............................................................................................................................. 63

CLASES INNER......................................................................................................................... 70

ENUMERACIONES.................................................................................................................... 78

ARCHIVOS............................................................................................................................... 85

4.3 Resumen de mtodos para el manejo de archivos............................................................ 90 THREADS ................................................................................................................................ 94

2.1 Cmo crear un hilo heredando de Thread.................................................................... 96 2.2 Ejecucin de hilos....................................................................................................... 96 2.3 Cmo crear un hilo implementando Runnable ............................................................. 97 3. 4. 5. EL MTODO SLEEP........................................................................................................ 99 EJERCICIO PROPUESTO ................................................................................................101 EVALUACIN...............................................................................................................103

INTRODUCCIN
El mundo de la tecnologa hoy en da exige un Desarrollador de Software Profesional con conocimientos de JAVA actualizado. Es por ello que se ha desarrollado este curso de preparacin para presentarse a rendir el examen y obtener una Certificacin Internacional que avale sus conocimientos, abrindole puertas en su carrera, generando mejores ingresos econmicos y reconocimiento en el mercado.

OBJETIVOS
El conocimiento profundo del lenguaje Java le permitir mejorar la estructura del cdigo de sus aplicaciones, explotando todas las caractersticas del mismo.

Al final del curso, el estudiante habr adquirido los conocimientos necesarios para aprobar el examen de Certificacin JAVA STANDARD EDITION 6 PROGRAMMER CERTIFIED PROFESSIONAL EXAM. CDIGO 1Z0-851.

ORIENTACIONES GENERALES
La presente gua constituye un material de apoyo para el curso que se lo dictar a travs de la modalidad de estudio semi-presencial. Los ejercicios planteados en la gua, debern entregarse un da antes de las sesiones presenciales.

1
MDULO I HERENCIA Y POLIMORFISMO

1. Herencia 1.1 Sobrecarga de mtodos 1.2 Sobrescritura de mtodos 2. Creacin de objetos en la JVM 3. Polimorfismo 4. Clases Abstractas 5. Interfaces 6. Modificadores de Acceso 7. Sobrescritura y modificadores de Acceso 8. Relacin entre clases e interfaces 9. Evaluacin

1. HERENCIA
A travs de la herencia, la clase hija hereda los mtodos y atributos de la clase padre. Todas las clases heredan de la clase padre Object Ejemplo:
public class Animal { public void dormir(){ System.out.println("Animal durmiendo"); } }

La clase Animal tiene los siguientes mtodos: dormir: definido en Animal Todos los mtodos que hereda de Object , por ejemplo: equals, toString, hashCode.
public class Gato extends Animal { public void maullar() { System.out.println("Gato maullando"); } }

La clase Gato tiene los siguientes mtodos: maullar: definido en Gato dormir:definido en Animal Todos los mtodos que Animal hereda de Object, por ejemplo: equals, toString, hashCode 1.1

Sobrecarga de mtodos
Un mtodo sobrecargado tiene el mismo nombre de otro ya existente en la clase pero con diferentes parmetros.

1.2 Sobrescritura de mtodos


Se tienen las clases:
public class Animal { public void dormir(){ System.out.println("Animal durmiendo"); } }

public class Gato extends Animal { public void maullar() { System.out.println("Gato maullando"); } }

Al momento Gato tiene a ms del mtodo maullar, el mtodo dormir que lo hered de Animal y todos los mtodos que Animal hered de Object. En la clase Gato es posible SOBRESCRIBIR el mtodo dormir, es decir ESCRIBIR un nuevo mtodo dormir que reemplace al mtodo actual. El mtodo sobrescrito deber tener exactamente los mismos parmetros que el mtodo de clase padre, caso contrario no existira sobreescritura sino sobrecarga. Ejemplo:
public class Animal { 1. public void dormir() {System.out.println("Animal durmiendo");} 2. public void comer() {System.out.println("Animal comiendo");} 3. public void comer(int cantidad) {System.out.println("Animal come: " + cantidad);} } public class Gato extends Animal { 4. public void maullar() {System.out.println("Gato maullando");} 5. public void comer() {System.out.println("Gato comiendo");} 6. public void dormir(int tiempo) {System.out.println("Gato durmiendo: " + tiempo);} }

En las clases Animal y Gato existen las siguientes sobrecargas y sobreescrituras: Lnea 3: Sobrecarga del mtodo comer Lnea 5: Sobrescritura del mtodo comer Lnea 6: Sobrecarga del mtodo dormir

2. CREACIN DE OBJETOS EN LA JVM


Se tiene la clase Auto:
public class Auto { String marca; int anio; }

A continuacin se explica paso a paso qu sucede en la mquina virtual cuando se ejecuta el siguiente cdigo:
Auto auto1; auto1=new Auto();

1. La sentencia Auto auto1, crea una variable de tipo Auto llamada auto1. Hasta este punto no se ha creado ningn objeto, auto1 NO ES UN OBJETO, es una REFERENCIA (un apuntador, un puntero) a un objeto. (Ver Figura 2.1)

Figura 2.1 2. La sentencia new Auto(), crea un objeto Auto en la memoria de la JVM. Cuando se crea el objeto, sus atributos se crean con el valor por defecto, este valor depende del tipo de dato del atributo. En este caso, anio es un int cuyo valor por defecto es 0 y marca es String cuyo valor por defecto es null. (Ver Figura 2.2)

Figura 2.2 5

3. En la sentencia auto1=new Auto() la asignacin (=), hace que la referencia auto1 apunte al objeto Auto que se crea en memoria con la sentencia new Auto(). (Ver Figura 2.3)

Figura 2.3

3. POLIMORFISMO
Considerando el cdigo:
class Animal{ public void dormir(){ } } class Perro extends Animal{ public void ladrar(){ } }

Las siguientes sentencias son vlidas:


Perro p=new Perro(); Animal a=new Perro(); Object obj=new Perro();

Note que a un objeto Perro, se lo puede referenciar con una referencia de tipo Perro, Animal u Object. Dependiendo del tipo de referencia con la cual se apunte al objeto Perro, se podrn acceder solamente a ciertos mtodos de Perro. A travs de la variable obj, se pueden acceder solamente a los mtodos de Perro que existen en la clase Object: toString, equals, hashCode. A travs de la variable a, se puede acceder solamente a los mtodos de Perro que existen en la clase Animal: toString, equals, hashCode, dormir 6

A travs de la variable p, se pueden acceder a los mtodos de Perro que existen en la clase Perro: toString,equals,hashCode, dormir, ladrar Tome en cuenta que a pesar de que todos los objetos Perro tienen el mtodo ladrar, con las referencias a y obj no se puede acceder a dicho mtodo.

Por lo tanto, el siguiente cdigo:


Animal a=new Perro(); a.ladrar();

Produce un ERROR DE COMPILACIN, ya que en Animal no existe el mtodo ladrar De la misma forma, si Perro implementase la interface Acariciable, a Perro se le podra apuntar con una referencia del tipo Acariciable: Acariciable ac=new Perro();

Ejercicio:
Dado el siguiente cdigo:
class Vehiculo { public void avanzar(){ System.out.println("Vehiculo avanzando"); } } class Auto extends Vehiculo { public void avanzar(){ System.out.println("Auto avanzando"); } } public class Test { public static void main(String[] args) { Vehiculo v=new Auto(); v.avanzar(); } }

Cul es la salida en consola al ejecutar la clase Test? Solucin: La salida es: Auto avanzado.

La referencia v nos lleva hacia un objeto Auto, por lo tanto se ejecuta el mtodo avanzar() definido en Auto.

Ejercicio:
1. Crear las siguientes clases:
class Vehiculo { public void avanzar(){ System.out.println("Avanza Vehiculo!!"); } } class Auto extends Vehiculo{ public void avanzar(){ System.out.println("Avanza Auto!!"); } } class Moto extends Vehiculo{ public void avanzar(){ System.out.println("Avanza Moto!!"); } } public class Juego { public void mover(Vehiculo vehiculo) { vehiculo.avanzar(); } public static void main(String[] args) { Juego juego= new Juego(); juego.mover(new Auto()); juego.mover(new Vehiculo()); juego.mover(new Moto()); }

2. Ejecutar la clase Juego

Figura 3.1 Como se puede ver en la figura 3.1, la sentencia vehiculo.avanzar(), ejecuta cdigo diferente, dependiendo de a qu objeto apunta la referencia vehiculo. 8

POLIMORFISMO: Una invocacin a un mtodo ejecuta cdigo diferente (se comporta de forma diferente) dependiendo del objeto al cul apunta la referencia.

4. CLASES ABSTRACTAS
Mtodos Abstractos: Un mtodo abstracto no tiene implementacin, solamente tiene la firma del mtodo. Para definir un mtodo abstracto, es necesario agregarle el modificador abstract. Si un mtodo es abstracto, la clase que lo contiene debe ser abstracta. Ejemplo:
public abstract class ClaseA { public abstract void metodo1(); }

Una clase abstracta, puede tener mtodos abstractos y/o mtodos implementados, puede existir una clase abstracta sin mtodos abstractos. Ejemplo:
public abstract class ClaseB { public void metodo3() { } } public abstract class ClaseC { public abstract void metodo3(); public void metodo4(){} }

Las llaves son parte de la implementacin, un mtodo abstracto no puede contener llaves, porque entonces ya no sera abstracto. Ejemplo:
public abstract void metodo1(){} ERROR DE COMPILACIN

No es posible instanciar un objeto de una clase Abstracta Ejemplo:


public abstract class ClaseA { public abstract void metodo1(); } public class Test { public static void main(String[] args) { ClaseA ca = new ClaseA(); ERROR DE COMPILACIN } }

Cuando una clase hereda de una clase Abstracta, tiene dos opciones: 1. Implementar todos los mtodos abstractos de la clase padre, o 2. Definirse como abstracta.

Ejercicio:
Dado el siguiente cdigo:
public abstract class ClaseA { public abstract void metodo1(); public void metodo2(){} } public class ClaseB extends ClaseA { public void metodo1() { } } public class ClaseC extends ClaseA {} public abstract class ClaseD extends ClaseA{} public abstract class ClaseE extends ClaseA{ public void metodo1(){} }

Analice si cada una de las clases compila sin errores. Solucin: La clase ClaseB compila sin errores, debido a que implementa el mtodo abstracto metodo1, adems puede o no sobrescribir el mtodo metodo2. La clase ClaseC produce un error de compilacin ya que no implementa el mtodo abstracto metodo1. La clase ClaseD compila sin errores, ya que a pesar de que no implementa el mtodo abstracto metodo1, se define a s misma como abstracta. La clase ClaseE compila sin errores, es posible que una clase sea abstracta a pesar de no tener mtodos abstractos.

10

5. INTERFACES
Una interface tiene todos sus mtodos abstractos, es decir no estn implementados. Como todos los mtodos de una interface son abstractos, es opcional agregarles el modificador abstract. De igual forma es opcional colocar el modificador abstract a la interface. Ejemplos:
public abstract interface InterfaceA { void metodo1(); abstract void metodo2(); } public interface InterfaceB { void metodo3(); abstract void metodo4(); }

Como todos los mtodos de una interface son abstractos, si un mtodo de una interface tiene implementacin, se producir un error de compilacin. Ejemplo:
public interface InterfaceC { public void metodo3(){} } ERROR DE COMPILACIN

Cuando una clase implementa una interface, tiene dos opciones: 3. Implementar todos los mtodos de la interface, o 4. Definirse como abstracta No es posible instanciar un objeto de una Interface. Ejemplo:
interface InterfaceA { public void metodo1(); } public class Test { public static void main(String[] args) { InterafaceA ia = new InterfaceA();ERROR DE COMPILACIN } }

11

Ejercicio:
Dado el siguiente cdigo:
public interface InterfaceA { void metodo1(); abstract void metodo2(); } public class ClaseB implements InterfaceA { public void metodo1() { } } public class ClaseC extends ClaseA{ public void metodo1(){ } public void metodo2(){ } } public abstract class ClaseD extends ClaseA{ public void metodo1(){ } } public abstract class ClaseE implements InterfaceA{ public void metodo3(); }

Analice si cada una de las clases compila sin errores. Solucin: La clase ClaseB produce un error de compilacin, ya que no implementa el mtodo abstracto metodo2. La clase ClaseC compila sin errores, ya que implementa todos los mtodos abstractos de la interface. La clase ClaseD compila sin errores ya que a pesar de que no implementa todos los mtodos de la interface, se define a s misma como abstracta. La clase ClaseE produce un error de compilacin, ya que el mtodo metodo3 al no tener implementacin debera tener el modificador abstract.

12

6. MODIFICADORES DE ACCESO
En java existen 3 modificadores de acceso: public, protected y private y cuatro niveles de acceso: public: si los miembros de una clase tienen el modificador de acceso public, pueden ser accedidos desde cualquier otra clase. private: si los miembros de una clase tienen el modificador de acceso private, solo pueden ser accedidos dentro de la misma clase. default: cuando no se coloca un modificador de acceso en los miembros de una clase, el nivel de acceso es default. Los miembros con nivel de acceso default pueden ser accedidos desde cualquier clase del mismo paquete. La palabra default nunca se coloca. protected: si los miembros de una clase tienen el modificador de acceso protected, pueden ser accedidos desde cualquier clase del mismo paquete o desde una clase hija sin importar el paquete, a travs de la herencia. De acuerdo a las definiciones anteriores, el orden de los niveles de acceso, de ms restrictivo a menos restrictivo es el siguiente:

private

default protected
public

7. SOBRESCRITURA Y MODIFICADORES DE ACCESO


Cuando se sobrescribe un mtodo, el mtodo sobrescrito puede tener el mismo modificador de acceso o uno menos restrictivo. No es posible colocar en el mtodo hijo un modificador de acceso ms restrictivo.

13

Los mtodos private no se heredan, por lo tanto no existe sobreescritura de mtodos private. Todos los mtodos de una interface son public, no es posible colocar un modificador diferente. Si no se coloca un modificador de acceso en los mtodos, el modificador sigue siendo public.

Ejercicio:
Dado el siguiente cdigo:
class ClaseA { void metodo1(){} } class ClaseB extends ClaseA { //INSERTAR CODIGO AQUI }

Cul de las siguientes sentencias insertadas de manera independiente en lugar de //INSERTAR CODIGO AQU, compilan sin error. A. B. C. D. public void metodo1(){ } void metodo1(){ } protected void metodo1() { } private void metodo1() {}

Solucin: A B y C son correctas. El nivel de acceso del mtodo en la clase padre es default, por lo tanto el mtodo sobrescrito puede tener el mismo modificador o uno menos restrictivo.

Ejercicio:
Dado el siguiente cdigo:
interface InterfaceA { void metodo1(); } class ClaseB implements InterfaceA { //INSERTAR CODIGO AQUI }

Cul de las siguientes sentencias insertadas de manera independiente en lugar de //INSERTAR CODIGO AQU, compilan sin error.

14

A. B. C. D.

public void metodo1(){ } void metodo1(){ } protected void metodo1() { } private void metodo1() {} Solucin: A es correcta. En una interface, el modificador de acceso de los mtodos es siempre public aunque no se especifique. En el mtodo sobrescrito solo se puede colocar el mismo modificador o uno menos restrictivo, por tal razn la nica opcin vlida es colocar un modificador public.

8. RELACIONES ENTRE CLASES E INTERFACES


Una clase puede heredar solamente de una clase a la vez class ClaseA extends ClaseB class ClaseA extends ClaseB, ClaseC ERROR DE COMPILACIN Una interface puede heredar de una o ms interfaces a la vez interface InterfaceA extends InterfaceB interface InterfaceA extends InterfaceB, InterfaceC Una clase puede implementar una o ms interfaces a la vez class ClaseA implements InterfaceA class ClaseA implements InterfaceA, InterfaceB Una clase puede heredar de otra clase e implementar una o varias interfaces a la vez, primero se coloca la herencia y luego la implementacin. class ClaseA extends ClaseB implements InterfaceA class ClaseA implements InterfaceA extends ClaseB ERROR DE COMPILACIN Una clase puede HEREDAR de otra clase, una interface puede HEREDAR de una o ms interfaces, una clase puede IMPLEMENTAR una interface. No es posible que una clase herede de una interface ni que una interface implemente otra interface. class ClaseA implements ClaseB ERROR DE COMPILACION class ClaseB extends InterfaceA ERROR DE COMPILACION 15

interface InterfaceA implements IntefaceB ERROR DE COMPILACION interface InterfaceA extends ClaseA ERROR DE COMPILACION

Ejercicio Propuesto:
1. Crear el proyecto OCJP_Herencia y el paquete ocjp.herencia.conceptos 2. En el paquete ocjp.herencia.conceptos crear las siguientes clases: Clase Vehiculo Mtodo avanzar(abstracto) Parmetros valor (entero): La cantidad de metros que avanza el Vehiculo Retorna No retorna ningn valor Interface Lavable Mtodo lavar Parmetros No recibe parmetros Retorna No retorna ningn valor Interface Reparable Mtodo reparar Parmetros No recibe parmetros Retorna No retorna ningn valor Clase Auto Auto Herencia No sobrescribir el mtodo avanzar Mtodo lavar sobreescrito Clase Moto Moto Herencia Mtodo avanzar sobreescrito Mtodo reparar sobreescrito Mtodo lavar sobreescrito

Auto hereda de Vehiculo e implementa la interface Lavable Imprime en consola el mensaje: lavando Auto

Hereda de Vehiculo e implementa las interfaces Lavable y Reparable Imprime en consola el mensaje: Moto avanza, seguido de la cantidad de metros que avanza la moto. Imprime el consola el mensaje: Reparando Moto .. Imprime en consola el mensaje: lavando Moto 16

Interface Cambiable Cambiable Herencia Hereda de Lavable y Reparable Clase Juguete Juguete Herencia

Implementa la interface Cambiable

Crear una clase TestHerencia, con un mtodo main, en el mtodo main colocar la siguiente lgica: 1) Crear instancias de las clases que sea posible y referenciarlas con todos los tipos de referencia posibles. Por ejemplo: Perro p=new Perro(); Animal a=new Perro(); Object obj=new Perro(); 2) Con cada referencia, invocar a todos los mtodos que puedan verse a travs de la referencia (para la referencia de tipo Object) solamente utilizar el mtodo toString. Por ejemplo: p.dormir(); p.ladrar(); p.toString(); a.dormir();a.toString(); obj.toString();

9. EVALUACIN
1. Completar con la caracterstica correcta (sobrescritura o sobrecarga) 1.1 Si en una misma clase existen dos mtodos con el mismo nombre, pero con diferentes parmetros, se dice que existe ______________________ 1.2 Cuando una clase hereda los mtodos de la clase padre y crea otro mtodo con el mismo nombre de uno de los mtodos del padre y los mismos parmetros, se dice que existe ______________________ 1.3 Cuando una clase hereda un mtodo de la clase padre y crea otro mtodo con el mismo nombre pero con distintos parmetros, se dice que existe ______________________ 17

2. Represente grficamente los objetos en la memoria de la mquina virtual de java, luego de ejecutar el siguiente fragmento de cdigo: class Empleado{ private String cedula; private String nombre; } class TestEmpleado{ public static void main(String args[]){ Empleado e1=new Empleado(); Empeado e2=new Empleado(); e1=e2; e1=null; } }

3. Dado el siguiente cdigo: En cada una de las siguientes preguntas, indicar si el cdigo compila con o sin errores, en caso de existir un error, justifique su respuesta. 3.1 abstract class ClaseA{ protected void metodo1(); } Respuesta:___________________________________________________

18

3.2 abstract interface InterfaceA{ void metodo2(){} } Respuesta:___________________________________________________ 3.3 class ClaseB{ private abstract void metodo3(); } Respuesta:___________________________________________________ 3.4 abstract class ClaseC{ private abstract void metodo4(); } Respuesta:___________________________________________________ 3.5 interface InterfaceB{ protected int metodo6(); } Respuesta:___________________________________________________

3.6 abstract class ClaseD{ protected abstract int metodo7(); private void metodo8(){} } Respuesta:___________________________________________________

4. Dado el siguiente cdigo: public abstract class ClaseA{ public abstract void metodo2(); 19

} public interface InterfaceA{ public void metodo3(); } public class ClaseB extends ClaseA implements InterfaceA{ public void metodo2(){} public void metodo3(){} } public class Test{ public static void main(String[] args) {

1. InterfaceA ia = new ClaseB(); 2. ClaseA ca = new ClaseA(); 3. ClaseA ca2 = new ClaseB(); 4. ClaseB cb = new ClaseB(); 5. InterfaceA ia2 = new InterfaceA(); 6. InterfaceA ia3 = new ClaseA(); } } Indicar si cada una de las lneas del mtodo main, compilan o no sin errores. En caso de que existan errores de compilacin. Justifique su respuesta Lnea 1:________________________________________________________________ Lnea 2:________________________________________________________________ Lnea 3:________________________________________________________________ Lnea 4:________________________________________________________________ Lnea 5:________________________________________________________________ Lnea 6:________________________________________________________________

20

5. Dado el siguiente cdigo: public class Animal(){ public void baniar(){ System.out.println(baando Animal); } } public class Perro() extends Animal{ public void ladrar(){ System.out.println(Perro ladrando); } public void baniar(){ System.out.println(baando perro); } } public class Gato extends Animal{ public void maullar(){ System.out.println(Gato maullando); } } public void Test{ public static void main(String[] args) { Animal a1 = new Perro(); Animal a2 = new Gato(); Animal a3=new Animal(); 1. a1.baniar(); 2. a2.baniar(); 3. a3.baniar(); a=a2; 4. a1.baniar(); 5. a2.baniar(); 6. a3.baniar(); a2=null; a3=a; 7. a1.baniar(); 8. a2.baniar(); 9. a3.baniar(); 21

} }

public void Test2{ public static void main(String[] args) { Perro p = new Perro(); Gato g = new Gato(); Animal a; 10. p.ladrar(); 11. p.baniar(); 12. System.out.println(p.toString()); 13. g.maullar(); 14. g.baniar(); 14. System.out.println(g.toString()); a=p; 15. a.ladrar(); 16. a.baniar(); 17. System.out.println(a.toString()); } }

Cul es la salida en consola luego de ejecutar cada una de las lneas numeradas del mtodo main. En algunos casos puede existir un error de compilacin, o un error de ejecucin, de ser el caso especifique el error en su respuesta. Para resolver este ejercicio se recomienda representar grficamente cmo van cambiando las referencias a los objetos en la memoria de la mquina virtual.

Lnea 1:________________________________________________________________ 22

Lnea 2:________________________________________________________________ Lnea 3:________________________________________________________________ Lnea 4:________________________________________________________________ Lnea 5:________________________________________________________________ Lnea 6:________________________________________________________________ Lnea 7:________________________________________________________________ Lnea 8:________________________________________________________________ Lnea 9:________________________________________________________________ Lnea 10:_______________________________________________________________ Lnea 11:_______________________________________________________________ Lnea 12:_______________________________________________________________ Lnea 13:_______________________________________________________________ Lnea 14:_______________________________________________________________ Lnea 15:_______________________________________________________________ Lnea 16:_______________________________________________________________ Lnea 17:_______________________________________________________________

6. Liste los 4 niveles de acceso, ordenndolos de ms restrictivo a menos restrictivo: Lnea 1:________________________________________________________________ Lnea 2:________________________________________________________________ 23

Lnea 3:________________________________________________________________ Lnea 4:________________________________________________________________

7. Dado el siguiente cdigo: public class ClaseB { public void metodo1(){} protected void metodo2(){} void metodo3(){} } public interface InterfaceA{ void metodo4(){} } public class ClaseC extends ClaseB implements InterfaceA{ 1. void metodo1(){} 2. private void metodo2(){} 3. protected void metodo3(){} 4. public void metodo4(){} } public class ClaseD extends ClaseB implements InterfaceA{ 5. 6. 7. 8. } public class ClaseE extends ClaseB implements InterfaceA{ 9. public void metodo1(){} 10. protected metodo2(){} 11. public void metodo3(){} 12. void metodo4(){} } Indique si cada una de las lneas numeradas compila con o sin errores, en caso de que compile con errores, justifique su respuesta: Lnea 1:________________________________________________________________ 24 protected void metodo1(){} void metodo2(){} void metodo3(){} void metodo4(){}

Lnea 2:________________________________________________________________ Lnea 3:________________________________________________________________ Lnea 4:________________________________________________________________ Lnea 5:________________________________________________________________ Lnea 6:________________________________________________________________ Lnea 7:________________________________________________________________ Lnea 8:________________________________________________________________ Lnea 9:________________________________________________________________ Lnea 10:_______________________________________________________________ Lnea 11:_______________________________________________________________ Lnea 12:_______________________________________________________________

8. Dado el siguiente cdigo: abstract class ClaseA{ abstract void metodo2(); } interface InterfaceA{ void metodo1(); } interface InterfaceB{ void metodo3(); }

Indique si cada una de las siguientes clases o interfaces compila con o sin errores, en caso de que compile con errores, justifique su respuesta: 25

class ClaseB extends ClaseA{ public void metodo2(int x){} } Respuesta:___________________________________________________ abstract class ClaseC extends ClaseA{ public void metodo2(int x){} } Respuesta:___________________________________________________ abstract class ClaseD extends ClaseA{ public void metodo2(int x){} public void metodo2(){} } Respuesta:___________________________________________________

abstract class ClaseE extends ClaseA{ public void metodo3(); } Respuesta:___________________________________________________

class ClaseF implements InterfaceA{ public void metodo1(){} public void metodo1(int x){} } Respuesta:___________________________________________________

abstract class ClaseE implements InterfaceA{ public void metodo1(int x){} } Respuesta:___________________________________________________ 26

abstract class ClaseF implements InterfaceA{ abstract void metodo5(); } Respuesta:___________________________________________________

class ClaseG implements InterfaceA extends ClaseA{ public void metodo1(){} public void metodo2(){} } Respuesta:___________________________________________________

interface InterfaceC extends InterfaceA{ } Respuesta:___________________________________________________

interface interfaceD extends InterfaceA,InterfaceB,ClaseA{ } Respuesta:___________________________________________________

interface interfaceE extends InterfaceA,InterfaceB{ void metodo6(); protected void metodo7(); } Respuesta:___________________________________________________

27

2
MDULO I EXCEPCIONES

1. 2. 3. 4. 5. 6. 7.

Tratamiento de Excepciones Tipos de Excepciones Cmo lanzar Excepciones Sobrescritura y Excepciones Creacin de Excepciones Flujo de Excepciones Evaluacin

28

1. TRATAMIENTO DE EXCEPCIONES
Existen dos formas de tratar las excepciones: 1. Envolver la excepcin dentro de un bloque try/catch, o 2. Propagar la excepcin agregando la sentencia throws a la firma del mtodo. Ejemplo: El mtodo createNewFile arroja una excepcin que debe ser tratada.
import java.io.File; public class ClaseA { public void metodo1() { File f = new File("archivo1.txt"); try { f.createNewFile(); } catch (Exception ex) { } } public void metodo2() throws Exception { File f = new File("archivo2.txt"); f.createNewFile(); }

En el mtodo metodo1, se trata la excepcin envolvindola en un bloque try/catch, mientras el mtodo metodo2 se propaga la excepcin agregando la sentencia throws a la firma del mtodo.

2. TIPOS DE EXCEPCIONES
Existen dos tipos de Excepciones: Checked: Necesitan ser tratadas, de lo contrario el cdigo no compila. No heredan de RuntimeException. UnChecked(de Runtime): No necesitan ser tratadas, heredan de RuntimeException. Para el manejo de excepciones, es necesario identificar siempre el tipo de excepcin, se debe determinar siempre si la excepcin hereda o no de RuntimeException.

29

Para determinar si una excepcin es Checked o Unchecked, es necesario conocer el rbol de herencia de las excepciones. La figura 1 muestra una porcin de dicho rbol, en la misma se puede observar que NullPointerException y ArrayIndexOutOfBoundsException son excepciones de Runtime.

Figura 1

3. CMO LANZAR EXCEPCIONES


Se puede lanzar una excepcin desde cualquier mtodo. Para lanzar una excepcin se debe utilizar la palabra reservada throw seguida de la instancia de la excepcin que se desea lanzar. Si se lanza una excepcin que NO es de Runtime, es necesario agregar en la firma del mtodo la palabra reservada throw seguida del tipo de excepcin que se quiere lanzar o un tipo de una clase padre de la misma. Una sentencia throws puede declarar que el mtodo arroja una o ms excepciones. Si la firma de un mtodo tiene la palabra reservada throws seguida de un tipo de excepcin, NO es obligatorio que el mtodo arroje excepcin dentro de su cdigo. 30

Ejercicio:
Dado el siguiente cdigo:
import java.io.IOException; public class ClaseA { void metodo1() throws Exception { throw new IOException(); } void metodo2() throws IOException { throw new IOException("Error de lectura"); } void metodo3() { throw new NullPointerException(); } void metodo4() throws NullPointerException, IOException { } void metodo5() throws IOException { throw new Exception("Error de lectura"); }

Analice cada uno de los mtodos e indicar si compilan con o sin errores Solucin: El mtodo metodo1 arroja internamente una excepcin del tipo IOException. Como IOException no es de Runtime, debe declarar que arroja excepcin en la firma del mtodo y en efecto en la firma declara que arroja Exception, como Exception es padre de IOException, el mtodo compila sin errores El mtodo metodo2 arroja internamente una excepcin del tipo IOException y en la firma del mtodo declara que lanza una excepcin del tipo Exception, por lo tanto el cdigo compila sin errores. El mtodo metodo3 arroja una excepcin es de Runtime, por lo tanto es opcional declarar en la firma del mtodo que lanza Excepcin. Este mtodo compila sin errores. El mtodo metodo4 declara en su firma que arroja las excepciones NullPointerException y tambin IOException. Un mtodo puede declarar que lanza excepciones y no lanzarlas en su cdigo, por lo tanto el mtodo metodo4 compila sin errores. El mtodo metodo5 produce un error de compilacin, ya que arroja una excepcin que no es de Runtime y en la firma del mtodo no lo declara. 31

4. SOBRESCRITURA Y EXCEPCIONES
Cuando se sobrescribe un mtodo, en la clase hija se deben considerar las siguientes reglas de sobrescritura: Si el mtodo de la clase padre arroja una excepcin que es de Runtime, en el mtodo sobrescrito no existe ninguna regla a considerar con respecto a esta excepcin. Si el mtodo de la clase padre declara una excepcin que NO es de Runtime, en el mtodo sobrescrito existen tres opciones: 1. Declarar que lanza una excepcin del mismo tipo 2. Declarar que lanza una excepcin del tipo de una clase hija, o 3. No declarar la excepcin. En el mtodo sobrescrito, se pueden agregar excepciones no definidas en el padre, siempre y cuando estas excepciones sean Unchecked. No es posible agregar excepciones Checked en el mtodo sobreescrito que no existan en el padre.

Ejercicio:
Dado el siguiente cdigo:
import java.io.IOException; public class ClaseA { public void metodo1() throws IOException, NullPointerException{ } } class ClaseB extends ClaseA{ public void metodo1() throws Exception{ } } class ClaseC extends ClaseA{ public void metodo1() throws IOException{ } } class ClaseD extends ClaseA{ public void metodo1() throws NullPointerException{ } } class ClaseE extends ClaseA{ public void metodo1() {} }

Analizar cada una de las clases e indique si compilan con o sin errores 32

Solucin: En cualquiera de los mtodos sobrescritos no existen reglas para la excepcin NullPointerException por ser Unchecked. La clase ClaseB compila con errores, el mtodo sobrescrito metodo1 no puede arrojar excepciones checked que no hayan sido declaradas en el mtodo de la clase padre. La clase ClaseC compila sin errores, el mtodo metodo1 de la clase padre arroja IOException y el mtodo sobrescrito arroja una excepcin del mismo tipo que el mtodo de la clase padre. La clase ClaseD compila sin errores, el mtodo sobrescrito puede no declarar la excepcin checked del padre y es vlido agregar excepciones de Runtime. La clase ClaseE compila sin errores, el mtodo sobrescrito puede no declarar la excepcin checked del padre.

5. CREACIN DE EXCEPCIONES
Es posible crear sus propias excepciones, heredando de Exception o de RuntimeException. Ejemplos:
class MontoInvalidoException extends Exception { public MontoInvalidoException(String mensaje) { super(mensaje); } } class ValorIncorrectoException extends RuntimeException { public ValorIncorrectoException(String mensaje) { super(mensaje); } }

6. FLUJO DE EXCEPCIONES
El bloque try sirve para envolver un conjunto de sentencias y ejecutar acciones en caso de que alguna de ellas arroje una excepcin. En caso de que alguna sentencia dentro del try arroje una excepcin, el control del programa saltar inmediatamente al bloque catch correspondiente. Para un bloque try pueden existir varios bloques catch, si dentro del try se arroja una excepcin, se analizarn uno por uno los catch declarados para dicho try y se ejecutar el catch del tipo que coincida con la excepcin arrojada. El bloque finally se ejecuta siempre que el cdigo haya ingresado al try, sin importar si dentro del try se arroj o no una excepcin. 33

Generalmente se tienen bloques try/catch/finally y en el bloque finally se liberan recursos, por ejemplo se cierran archivos, streams o conexiones a bases de datos. Sin embargo, es vlido tener un bloque try/finally, sin bloques catch. Si se tienen varios catch, se producir un error de compilacin si existe algn catch de una excepcin padre declarado antes de un catch de una excepcin hija. Ejemplo:
public class ClaseA { public void metodo1(String a) { try { String sub = a.substring(2); } catch (Exception ex) { } catch (NullPointerException ex) { } } }

ERROR DE COMPILACIN

Ejercicio:
Dado el siguiente cdigo:
public class EjercicioExcepciones { public static void main(String[] args) { new EjercicioExcepciones().metodo1("cadena", null); } public void metodo1(String a, String b){ System.out.print("A "); String x=a.substring(0); try{ System.out.print("B "); String sub=b.substring(0); System.out.print("C "); }catch(NullPointerException ex){ System.out.print("D "); }catch(Exception ex){ System.out.print("E "); }finally{ System.out.print("F "); } } }

Cul es la salida en consola? 34

Solucin: A B DF

Ejercicio:
Dado el siguiente cdigo:
public class EjercicioExcepciones2 { public static void main(String[] args) { new EjercicioExcepciones2().metodo1(null, "cadena"); } public void metodo1(String a, String b){ System.out.print("A "); String x=a.substring(0); try{ System.out.print("B "); String sub=b.substring(0); System.out.print("C "); }finally{ System.out.print("F "); } } }

Cul es la salida en consola? Solucin:

A, seguido de una excepcin NullPointerException

Ejercicio:
Dado el siguiente cdigo:
public class EjercicioExcepciones3 { public static void main(String[] args) { new EjercicioExcepciones3().metodo1(null, null); } public void metodo1(String a, String b) { System.out.print("A "); try { System.out.print("B "); String sub = b.substring(0); System.out.print("C "); } finally { System.out.print("F "); } } }

Cul es la salida en consola? 35

Solucin: A B F y una excepcin NullPointerException

Ejercicio Propuesto:
1. Crear una excepcin de tipo Checked llamada SaldoInsuficienteException 2. Crear una excepcin de tipo Unchecked llamada MontoInvalidoException 3. Crear las siguientes Clases: Clase Cuenta Atributos Saldo Tipo double. Indica el saldo de la cuenta en cada momento Mtodo retirar Descripcin Parmetros Retorna Excepciones

Disminuye el valor del saldo con el monto que recibe como parmetro monto (double): Valor que se resta del saldo actual No retorna ningn valor Arroja una excepcin SaldoInsuficienteException si el monto a retirar es mayor al saldo actual

Mtodo depositar Descripcin Incrementa el valor del saldo con el monto que recibe como parmetro Parmetros monto (double): Valor que se agrega al saldo actual Retorna No retorna ningn valor Excepciones Arroja una excepcin MontoInvalidoException si el monto a depositar es negativo Clase Banco Mtodo retirar Descripcin Ejecuta un retiro sobre la cuenta con el monto que recibe como parmetro. Este mtodo no captura la excepcin que arroja el mtodo retirar de cuenta, sino que la propaga Parmetros cta (Cuenta): La cuenta sobre al cual se desea efectuar el retiro. monto(double): El valor a retirar de la cuenta Retorna No retorna ningn valor Mtodo depositar Descripcin Ejecuta un depsito sobre la cuenta con el monto que recibe como parmetro. Parmetros cta (Cuenta): La cuenta sobre la cual se desea efectuar el retiro. monto(double): El valor a retirar de la cuenta 36

Retorna Excepciones

No retorna ningn valor Arroja una excepcin MontoInvalidoException si el monto a depositar es negativo

4. Crear una Clase TestBanco con un mtodo main, en el main realizar las siguientes acciones: 1. Instanciar un objeto cuenta 2. Instanciar un objeto Banco 3. Sobre la cuenta creada, depositar 100 a travs de Banco 4. Sobre la cuenta creada, retirar 50 a travs de Banco 5. Sobre la cuenta creada, retirar 200 a travs de Banco En el mtodo main capturar las excepciones y en caso de que ocurra alguna mostrar el mensaje que trae la misma

7. EVALUACIN
1. Frente a cada caracterstica coloque si corresponde a una excepcin Checked o Unchecked No es obligatorio tratarlas______________________________________________ Es obligatorio tratarlas ________________________________________________ Heredan de RuntimeException __________________________________________ No heredan de RuntimeException _______________________________________ Si en la firma de un mtodo de la clase padre se arroja esta excepcin, en el mtodo sobreescrito no existe ninguna regla con respecto a la excepcin___________________________________________________________ Si en la firma de un mtodo de la clase padre se arroja esta excepcin, en el mtodo sobreescrito se puede lanzar la misma excepcin, lanzar una excepcin hija o simplemente no lanzarla__________________________________________ Si dentro de un mtodo se arroja esta excepcin, en la firma del mtodo es necesario colocar la palabra reservada throws seguida del tipo de excepcin que lanza o de una excepcin padre_________________________________________ 37

2. Considerando que las siguientes excepciones heredan de RuntimeException ClassCastException NullPointerException IllegalArgumentException Y que FileNotFoundException hereda de IOException que a su vez hereda de Exception. Indique si cada uno de los siguientes mtodos compila con o sin errores, en caso de que existe error, justifique su respuesta. public void metodo1(){ throw new IOException(); } Respuesta:__________________________________________________ public void metodo2() throws Exception{ throw new IOException(); } Respuesta:__________________________________________________

public void metodo3() throws IOException{ throw new IOException(); } Respuesta:__________________________________________________ public void metodo3(){ throw new NullPointerException(); } Respuesta:__________________________________________________ public void metodo4() throws IOException, Exception{ throw new NullPointerException(); } Respuesta:__________________________________________________ public void metodo4() throws ClassCastException{ throw new NullPointerException(); } Respuesta:__________________________________________________ 38

public void metodo5() throws IOException{ throw new FileNotFoundException(); } Respuesta:__________________________________________________

public void metodo5() throws IOException, Exception{ throw new FileNotFoundException(); } Respuesta:__________________________________________________

3. CONSIDERE que el mtodo metodo1 arroja una excepcin de tipo RuntimeException, mientras que el mtodo mtodo2 arroja la excepcin FileNotFoundException. En cada una de las siguientes preguntas, indique si el cdigo compila con o sin errores, en caso de existir errores justifique su respuesta.

public void metodo10(){ ca.metodo1(); ca.metodo2(); } Respuesta:__________________________________________________

public void metodo10() throws Exception{ ca.metodo1(); ca.metodo2(); } Respuesta:__________________________________________________ public void metodo10(){ try{ ca.metodo1(); ca.metodo2(); }catch(FileNotFoundException ex){ }catch(IOException ex){ } } Respuesta:__________________________________________________ 39

public void metodo11(){ try{ ca.metodo1(); ca.metodo2(); }catch(Exception ex){ }catch(IOException ex){ } } Respuesta:__________________________________________________ public void metodo11() throws Exception{ try{ ca.metodo1(); ca.metodo2(); }finally{ } } Respuesta:__________________________________________________ public void metodo12(){ try{ ca.metodo1(); ca.metodo2(); }finally{ } } Respuesta: _________________________________________________ Dado el siguiente cdigo: class ClaseA { public void metodo1(int a) throws IOException, NullPointerException{ } } Indique si cada una de las siguientes clases compila con o sin errores, en caso de que existan errores, justifique su respuesta. class ClaseB extends ClaseA{ public void metodo1(String a) throws Exception{ } } Respuesta:__________________________________________________ 40

class ClaseB extends ClaseA{ public void metodo1(int b) throws IOException{ } public void metodo1(String a){ } } Respuesta:__________________________________________________ class ClaseB extends ClaseA{ public void metodo1(int b) throws FileNotFoundException{ } public void metodo1(String a){ } } Respuesta:__________________________________________________ class ClaseB extends ClaseA{ public void metodo1(int b){ } } Respuesta:__________________________________________________ class ClaseB extends ClaseA{ public void metodo1(int b) throws ClassCastException{ } } Respuesta:__________________________________________________

41

MODULO I CONSTRUCTORES

1. 2. 3. 4.

Caractersticas del constructor Constructores y Herencia Bloques de inicializacin Evaluacin

42

1. CARACTERSTICAS DEL CONSTRUCTOR


Tiene el mismo nombre de la clase. No tiene tipo de retorno, ni siquiera void, void ya es un tipo de retorno. Si un mtodo tiene el mismo nombre de la clase y un tipo de retorno, no es un constructor, es un mtodo cualquiera El cdigo del constructor se ejecuta cuando se crea el objeto, mediante la palabra reservada new. Si no se especifica un constructor, el lenguaje agrega un constructor por defecto, este constructor no recibe parmetros, por tal motivo se lo llama constructor vaco.

2. CONSTRUCTORES Y HERENCIA Ejercicio:


1. Crear el proyecto OCJP_Excepciones, con el paquete ocjp.excepciones 2. Crear la clase Animal con el siguiente cdigo:
public class Animal { public Animal() { System.out.println("Constructor animal"); } }

3. Crear la clase Perro que hereda de Animal, con el siguiente cdigo:


public class Perro extends Animal{ public Perro(){ System.out.println("Constructor Perro"); } }

4. Crear la clase TestHerencia con el siguiente cdigo:


public class TestHerencia { public static void main(String[] args) { Perro perro=new Perro(); } }

5. Ejecutar la clase TestHerencia

43

Figura 1.1 Como puede notar en la figura 1.1, al crear un objeto Perro, se invoca al constructor de Perro y el constructor de Perro invoca al constructor de Animal. La primera lnea que se ejecuta en un constructor es super(), esta lnea invoca al constructor vaco de la clase padre. Es posible invocar a otro constructor del padre a travs de super, pasndole los parmetros que espera el constructor que se quiere invocar. Si se invoca a un constructor del padre a travs de super, esta debe ser la primera lnea ejecutable dentro del constructor. Con this en cambio se puede invocar a un constructor en la misma clase, el constructor que se invoca depender de los parmetros que se pasen en la invocacin. Si se invoca a un constructor a travs de this, esta debe ser la primera lnea ejecutable dentro del constructor. Por tal motivo en un constructor no es posible usar super y this simultneamente para invocar a otro constructor

Ejercicio:
1. Agregar en Animal un constructor que reciba un nombre, con el siguiente cdigo:
public class Animal { public Animal() { System.out.println("Constructor Animal"); } public Animal(String nombre) { } System.out.println("Constructor Animal recibe un nombre");

44

2. Agregar en Perro un constructor que reciba un nombre, con el siguiente cdigo:


public class Perro extends Animal { public Perro() { } public Perro(String nombrePerro) { System.out.println("Constructor Perro recibe un nombre"); } } System.out.println("Constructor Perro");

3. Desde el constructor de Perro que recibe nombre, invocar al constructor por defecto de Perro
public class Perro extends Animal { public Perro() { } System.out.println("Constructor Perro");

public Perro(String nombrePerro) { this(); System.out.println("Constructor Perro recibe un nombre");

4. Desde el constructor por defecto de Perro invocar al constructor de Animal que recibe nombre. Desde el constructor de Animal que recibe nombre, invocar al constructor por defecto de Animal
public class Perro extends Animal { public Perro() { super("Arnulfo"); System.out.println("Constructor Perro"); } public Perro(String nombrePerro) { System.out.println("Constructor Perro recibe un nombre"); }

public class Animal { public Animal() { System.out.println("Constructor Animal"); }

45

public Animal(String nombre) { this(); System.out.println("Constructor Animal recibe un nombre"); }

3. BLOQUES DE INICIALIZACIN
Los bloques de inicializacin se declaran dentro de la clase, pero fuera de cualquier mtodo. El cdigo de los bloques de inicializacin se coloca entre llaves.

Ejercicio:
1. Crear la clase ClaseA con el siguiente cdigo:
public class ClaseA { {System.out.println("Bloque de inicializacin1");} public ClaseA(){ } } System.out.println("Constructor de ClaseA");

{System.out.println("Bloque de inicializacin2");}

2. Crear la clase ClaseB que hereda de ClaseA con el siguiente cdigo:


public class ClaseB extends ClaseA{ {System.out.println("Bloque de inicializacin ClaseB");} public ClaseB(){ } System.out.println("Constructor ClaseB");

3. Crear una clase TestConstructores


public class TestConstructores { public static void main(String[] args) { } } ClaseB b = new ClaseB();

46

4. Ejecutar la clase TestConstructores

Figura 3.1 Como puede ver en la figura 3.1, los bloques de inicializacin de cada clase se ejecutan antes del constructor. Si existen varios bloques de inicializacin dentro de una misma clase, estos se ejecutan en el orden en el que aparecen en el cdigo.

4. EVALUACIN
1. Indique cuntos constructores existen en cada una de las siguientes clases:
public class Persona {}

Nmero constructores clase Persona: _______________________________________


public class Estudiante { public void Estudiante(){} public int Estudiante(){} }

Nmero constructores clase Estudiante: _____________________________________


public class Autor { public Autor (){} public int Autor (String nombre){} }

Nmero constructores clase Autor: _________________________________________


2. Dadas las siguientes clases: public class ClaseA { public ClaseA(){} }

47

public class ClaseB { public ClaseB (int a){} }

Indique si cada una de las invocaciones compila con o sin error. En caso de que compile con error justifique su respuesta.

2.1 ClaseA ca= new ClaseA();

Respuesta: ____________________________________________________
2.2 ClaseA ca1= new ClaseA(3);

Respuesta: ____________________________________________________
2.3 ClaseB cb= new ClaseB();

Respuesta: ____________________________________________________
2.4 ClaseB cb= new ClaseB(15);

Respuesta: ____________________________________________________
2.5 ClaseB cb= new ClaseB("ClaseB");

Respuesta: ____________________________________________________

3. Dado el siguiente cdigo:


public class Persona { public Persona(String mensaje) { System.out.println("Constructor Persona con mensaje"); } }

Indique si se compila con o sin error. En caso de que se compile con error justifique su respuesta.
3.1 public class Profesor extends Persona{ public Profesor (){} }

Respuesta: _________________________________________________________ 48

3.2 public class Estudiante extends Persona { public Estudiante (){ super (); System.out.println("Constructor vacio Estudiante"); } public Estudiante (String nombre){ super ("Mensaje"); System.out.println("Constructor con parametros Estudiante"); } }

Respuesta: _________________________________________________________
3.3 public class Profesor extends Persona { public Profesor (){ super (); System.out.println("Constructor vacio Profesor"); }

Respuesta: _________________________________________________________

4. Dado el siguiente cdigo:


public class Persona { public Persona(String mensaje) { System.out.println("Constructor Persona con mensaje"); } } public Persona(){}

Indique si se compila con o sin error. En caso de que se compile con error justifique su respuesta.
public class Estudiante extends Persona { public Estudiante (String nombre){ System.out.println("Constructor con parametros Estudiante"); } }

Respuesta: _________________________________________________________

49

5. Dadas las siguientes clases: public abstract class Vehiculo { public Vehiculo() { this ("MARCA VEHICULO"); System.out.println("Constructor vehiculo"); } public Vehiculo(String marca) { System.out.println("Constructor con parametro vehiculo"); } } public class Auto extends Vehiculo{ public Auto() { System.out.println("Constructor auto"); } public Auto(String marca) { super ("KIA"); System.out.println("Constructor con parametro auto"); } } public class Avion extends Vehiculo { public Avion() { this ("Boeing"); System.out.println("Constructor avion"); } public Avion(String marca) { System.out.println("Constructor con parametro avion"); } } public class VehiculoDosRuedas extends Vehiculo { public VehiculoDosRuedas() { super("DERBI"); VehiculoDosRuedas vdr= new VehiculoDosRuedas("kymco"); System.out.println("Constructor vehiculodosruedas"); } public VehiculoDosRuedas(String marca) { System.out.println("Constructor con parametro vehiculodosruedas"); } }

Indique cual es la salida en consola. Puede existir algn error de compilacin, de ser el caso detalle el error en su respuesta.
5.1 Vehiculo vehiculo= new Vehiculo();

Respuesta: ____________________________________________________ 50

5.2 Auto auto= new Auto();

Respuesta: ____________________________________________________
5.3 Avion avion= new Avion();

Respuesta: ____________________________________________________
5.4 Auto auto2= new Auto("SKODA");

Respuesta: ____________________________________________________ 6. Dadas las siguientes clases:


public class Vehiculo { {System.out.println("Bloque1 vehiculo");} public Vehiculo() { this ("MARCA VEHICULO"); System.out.println("Constructor vehiculo"); } public Vehiculo(String marca) { System.out.println("Constructor con parametro vehiculo"); } } public class Auto extends Vehiculo{ public Auto() { System.out.println("Constructor auto"); } public Auto(String marca) { super ("KIA"); System.out.println("Constructor con parametro auto"); } } public class Avion extends Vehiculo { {System.out.println("Bloque1 avion");} public Avion() { this ("Boeing"); System.out.println("Constructor avion"); } {System.out.println("Bloque2 avion");} public Avion(String marca) { System.out.println("Constructor con parametro avion"); } }

51

Indique cual es la salida en consola.


6.1 Avion avion= new Avion();

Respuesta:_______________________________________________________
6.2 Auto auto2= new Auto("SKODA");

Respuesta: _______________________________________________________
6.3 Vehiculo vehiculo= new Vehiculo();

Respuesta: _______________________________________________________
6.4 Auto auto= new Auto();

Respuesta: _______________________________________________________ 7. El siguiente cdigo contiene un error de compilacin


public class ClaseA { public ClaseA(String mensaje){ System.out.println("Constructor con parametro ClaseA"); } } public class ClaseB extends ClaseA {}

Explique las razones por las cuales se produce este error. __________________________________________________________________________ __________________________________________________________________________ __________________________________________________________________________

52

4
MODULO II COMPILACIN Y EJECUCIN

1. 2. 3. 4.

Compilacin Ejecucin Classpath Evaluacin

53

1. COMPILACIN
Cuando se compila un archivo fuente de java (archivo con la extensin .java), el resultado de la compilacin es un archivo con el bytecode (archivo con la extensin .class). El bytecode es independiente de la plataforma.

Ejercicio:
1. Crear el directorio OCJP_CompilacionEjecucion, dentro de este crear el directorio src. 2. Dentro de src, crear un archivo ClaseA.txt usando bloc de notas. Abrir el archivo y guardarlo como ClaseA.java y eliminar el archivo ClaseA.txt 3. En el archivo ClaseA.java colocar el siguiente cdigo:
public class ClaseA { public static void main(String[] args) { System.out.println("ejecutando ClaseA "); }

4. Abrir una consola de comandos, ubicarse en el directorio OCJP_CompilacionEjecucion

y compilar la clase ClaseA, con el siguiente comando: javac src/ClaseA.java (Ver Figura. 1.1)

Figura 1.1 5. Verificar que en el directorio src se ha creado el archivo ClaseA.class. como se observa en la Figura. 1.2

Figura 1.2 54

6. Si se quiere ubicar el .class en un directorio diferente al que contiene el .java, se debe usar la opcin d. Ejecute el comando javac d clases src/ClaseA.java. Obtendr el error observado en la figura 1.3 directory not found: clases

Figura 1.3 Para que el comando se ejecute con xito, debe existir el directorio en el cual se quiere colocar el .class. 7. Crear el directorio clases dentro de OCJP_CompilacionEjecucion y ejecutar nuevamente el comando. (Ver Figuras 1.4 y 1.5).

Figura 1.4

Figura 1.5 8. Verificar que el archivo ClaseA.class se gener dentro del directorio clases (Ver Figura. 1.6)

Figura 1.6 55

2. EJECUCIN
Para ejecutar un archivo .class se utiliza el comando java

Ejercicio:
1. Ir al directorio clases y ejecutar el comando java ClaseA (Ver Figura 2.2)

Figura 2.2 2. Ir al directorio OCJP_CompilacionEjecucion e intentar ejecutar ClaseA con el comando java clases/ClaseA y obtendr el siguiente error: java.lang.NoClassDefFoundError ya que la mquina virtual de java no encuentra el archivo ClaseA.class como se observa en la Figura 2.3

Figura 2.3

3. CLASSPATH
Para poder ejecutar ClaseA desde otro directorio se debe establecer el classpath. El classpath es el conjunto de rutas en la cual se busca las clases que se necesita para compilar o ejecutar un programa. Con la opcin cp o classpath se establece el valor del classpath.

56

Ejercicio:
1. Ejecutar java ClaseA. Al ejecutar se obtiene el siguiente error (Ver Figura. 3.1)

Figura 3.1 El error se produce porque la jvm no encuentra el archivo ClaseA.class. Con el classpath se le indica a la jvm que busque dentro de un directorio especfico las clases que necesita. En este caso particular se indica que busque dentro del directorio clases. 2. Ahora ejecutar java cp clases ClaseA

Figura 3.2

Ejercicio:
1. Dentro del directorio src genere la siguiente estructura de directorios: ocjp.compilacion.paquete1 ocjp.compilacion.paquete2

Figura 3.3 57

2. Dentro del directorio paquete1, crear la clase ClaseUno.java con el siguiente cdigo:
package ocjp.compilacion.paquete1; public class ClaseUno{ public void metodo1(){ System.out.println("ejecutando metodo1"); } } 3. Dentro del directorio paquete2, crear la clase ClaseDos.java con el siguiente cdigo: package ocjp.compilacion.paquete2; import ocjp.compilacion.paquete1.ClaseUno; public class ClaseDos { public static void main(String[] args) { ClaseUno c1 = new ClaseUno(); c1.metodo1(); } }

4. Compilar la clase ClaseUno.java y colocarla en el directorio clases mediante el cdigo javac d clases src/ocjp/compilacion/paquete1/ClaseUno.java (Ver Figura. 3.4 y Figura. 3.5)

Figura 3.4

Figura 3.5

58

5. Compilar la clase ClaseDos.java y colocarla en el directorio clases mediante el cdigo javac d clases src/ocjp/compilacin/paquete2/ClaseDos.java (Ver Figura 3.6)

Figura 3.6 Obtiene un error de ejecucin porque no encuentra la clase ClaseUno.class. 6. Con el classpath se puede establecer el directorio en el cual puede encontrar las clases que necesita el compilador, en este caso ClaseUno. Para este propsito ejecute el comando javac con la opcin d. javac cp clases d clases src/ocjp/compilacin/paquete2/ClaseDos.java (Ver Figura 3.7)

Figura 3.7

59

4. EVALUACIN Ejecucin
1. Dada la siguiente estructura de directorios

root src ClaseC.java com ocjp ClaseA.java

bin

1.1 Complete el comando para compilar la clase ClaseA.java C:\root>___________________________________________________________________ 1.2 Complete el comando para compilar la clase ClaseC.java y colocarla en el directorio bin C:\root\src\com>___________________________________________________________ 1.3 Complete el comando para compilar la clase ClaseA.java C:\root\src>________________________________________________________________ 1.4 Complete el comando para compilar la ClaseC.java y colocarla en el directorio bin C:\root>___________________________________________________________________

60

Compilacin
2. Dada la siguiente estructura de directorios

root src ClaseC.java com ocjp ClaseA.java

bin ClaseC.class com ocjp ClaseA.class

2.1 Complete el comando para ejecutar la clase ClaseA.class C:\root>___________________________________________________________________ 2.2 Complete el comando para ejecutar la clase ClaseA.class C:\root\bin>_______________________________________________________________ 2.3 Complete el comando para ejecutar la clase ClaseC.class C:\root____________________________________________________________________

61

2.4 Complete el comando para ejecutar la clase ClaseC.class C:\root\bin>_______________________________________________________________ 2.5 Complete el comando para ejecutar la clase ClaseA.class C:\root\bin\com>___________________________________________________________

62

5
MODULO II ARREGLOS

1. Cmo declarar, manipular e instanciar un arreglo 2. Arreglos Multidimensionales 3. Evaluacin

63

1. CMO DECLARAR, INSTANCIAR Y MANIPULAR UN ARREGLO


Un arreglo es una estructura de datos que permite almacenar varios objetos del mismo tipo. Se accede a los objetos del arreglo a travs del ndice. Un arreglo est indizado desde 0. Para declarar un arreglo se utiliza [] antes o despus del nombre de la variable. Cuando se declara el arreglo, no se debe especificar su tamao. Ejemplos:
String [] arreglo1; String arreglo2 [];

En ambos casos se define un arreglo de objetos de tipo String Un arreglo en java es un objeto, por lo tanto para instanciar un arreglo se utiliza la palabra reservada new. Cuando se instancia un arreglo, se debe especificar el tamao del arreglo Ejemplo:
arreglo1 = new String[3];

Se crea un arreglo de 3 celdas Para asignar elementos al arreglo, se lo hace a travs del ndice: Ejemplos:
arreglo1[0]="a"; arreglo1[1]="b"; arreglo1[2]="c";

Se asignan valores a las 3 celdas del arreglo Para iterar sobre los elementos del arreglo, se puede utilizar for o enhanced for: Ejemplos:
for(int i=0;i<arreglo1.length;i++){ System.out.println(arreglo1[i]); } //enhanced for for(String s: arreglo1){ System.out.println(s); }

64

Cuando se trata de acceder a una posicin que no existe en el arreglo, se produce una excepcin en tiempo de ejecucin: ArrayIndexOutOfBoundsException(Ver figura 1.1)
arreglo1[3]="x";

Figura 1.1 Es posible declarar, instanciar y llenar el arreglo en una sola lnea, utilizando la siguiente sintaxis:
String arreglo2[]={"a","b","c"};

Se crea un arreglo con 3 Strings


String arreglo3[]=new String[]{"x","y"};

Se crea un arreglo con 2 Strings, tome en cuenta que NO se debe poner el tamao del arreglo entre los corchetes.

2. ARREGLOS MULTIDIMENSIONALES
Para definir un arreglo multidimensional, se colocan varios corchetes(segn la dimensin que se le quiera dar) antes o despus del nombre del arreglo. Ejemplos:
int [][] arreglo1; int arreglo2[][]; int []arreglo2[];

Las tres sentencias declaran un arreglo de dos dimensiones Considere los siguientes arreglos y sus definiciones: Es un arreglo de enteros, por tanto en cada celda guarda un entero.
int [] [] valores; int [] valores;

Es un arreglo de (arreglo de enteros), por tanto en cada celda guarda un arreglo de enteros.

65

Para instanciar un arreglo multidimensional, se utiliza la palabra reservada new y se especifica entre corchetes el tamao del arreglo. Ejemplo:
int [][] valores=new int[2][];

Crea un arreglo de dos celdas, en cada una de ellas guarda un apuntador a un arreglo de enteros.

Ejercicio:
Crear el proyecto OCJP_Arreglos, con el paquete ocjp.arreglos. Crear la clase EjercicioArreglos con un mtodo main, en el main agregar el siguiente cdigo: 1. Declarar e instanciar un arreglo bidimensional de enteros, de tamao 4, apuntado por la variable arregloMulti.
int arregloMulti[][]=new int[4][];

2. Crear un arreglo de enteros llamado arreglo1 con los valores 4,5 y 6.


int []arreglo1=new int[]{4,5,6};

3. Crear un arreglo de enteros llamado arreglo2 con los valores 10 y 20


int []arreglo2={10,20};

4. Crear un arreglo de enteros llamado arreglo3 de tamao 4.


int []arreglo3=new int[4];

5. En la posicin 0 de arregloMulti asignar el arreglo1


arregloMulti[0] = arreglo1;

6. En la posicin 1 de arregloMulti asignar el arreglo2


arregloMulti[1] = arreglo2;

7. En la posicin 2 de arregloMulti asignar el arreglo3


arregloMulti[2] = arreglo3;

66

8. Imprimir el valor de arregloMulti en la posicin [0][0]


System.out.println("valor1:"+arregloMulti[0][0]);

La sentencia arregloMulti[0][0], accede a la posicin 0 de arregloMulti, que es un apuntador a otro arreglo, de este arreglo accede a la posicin 0. 9. Imprimir el valor de arregloMulti en la posicin [0][1]
System.out.println("valor2:"+arregloMulti[0][1]);

La sentencia arregloMulti[0][1], accede a la posicin 0 de arregloMulti, que es un apuntador a otro arreglo y de este arreglo accede a la posicin 1.

3.

EVALUACIN

1. En cada una de las siguientes sentencias, indique si el cdigo compila con o sin errores, en caso de que existan errores, justifique su respuesta. int arreglo1[] =new int[]; Respuesta: __________________________________________________________

int arreglo2[] =new int[4]; Respuesta: __________________________________________________________

int []arreglo3 =new int[4]{1,2,3}; Respuesta: __________________________________________________________

int []arreglo4 =new int[]{1,2,3}; Respuesta: __________________________________________________________

int []arreglo5[] ={{1,2},{0},{1,2,3}}; Respuesta: __________________________________________________________ 67

int []arreglo6[] ={1,2,3}; Respuesta: __________________________________________________________

int []arreglo7[] ={{1,2},{0},new int[]{1,2,3}}; Respuesta: __________________________________________________________

int []arreglo8[] ={{1,2},{0},new int[2]{1,2,3}}; Respuesta: __________________________________________________________

2. Dado el siguiente cdigo: class EjercicioArreglos{ public static void main(String args[]){ int[] arreglo1=new int[]{10,20,30}; int[] arreglo2=new int[2]; int[] arreglo3 []=new int[3][ ]; 1. arreglo3[1]=arreglo1; 2. arreglo3[2]=arreglo2; 3. arreglo3[0][0]=1 4. arreglo3[1][1]=4; 5. arreglo3[1][2]=5; 6. arreglo3[2][1]=4; 7. arreglo3[2][2]=5; 8. arreglo3[0]=null; 9. arreglo3[1][0]=null; 10. arreglo3[1][1]=arreglo1[0]; 11. arreglo3[1][2]=arreglo2[2]; 12. arreglo3[1]=arreglo1[0]; } } En cada una de las lneas numeradas del main, indique si el cdigo compila con o sin errores, en caso de que compile sin errores, indique si ejecuta con o sin errores. Lnea 1:________________________________________________________________

68

Lnea 2:________________________________________________________________ Lnea 3:________________________________________________________________ Lnea 4:________________________________________________________________ Lnea 5:________________________________________________________________ Lnea 6:________________________________________________________________ Lnea 7:________________________________________________________________ Lnea 8:________________________________________________________________ Lnea 9:________________________________________________________________ Lnea 10:_______________________________________________________________ Lnea 11:_______________________________________________________________ Lnea 12:_______________________________________________________________

69

6
MODULO II CLASES INNER

1. 2. 3. 4.

Clases Inner Regulares Clases Inner Locales al mtodo Clases Inner Annimas Evaluacin

70

1. CLASES INNER REGULARES


Una clase Inner regular es una clase que se declara dentro de las llaves de otra clase, pero fuera de cualquier mtodo u otro bloque de cdigo. A la clase que contiene a la clase Inner, la llamaremos en adelante clase contenedora. Una instancia de la clase Inner es miembro de la clase contenedora, por lo tanto puede acceder a todos los miembros de la misma, incluso a los private. Ejemplo:
public class ClaseExterna { private int valor; public class ClaseInterna { public void incrementar() { valor++; System.out.println("metodo1"); }

Para crear una variable del tipo de una clase Inner, se debe especificar ambos nombres, el de la clase Inner y el de la clase contenedora, por ejemplo: ClaseExterna.ClaseInterna interna; Para instanciar una clase Inner, se necesita una referencia a la clase que la contiene. ClaseExterna externa=new ClaseExterna(); interna = externa.new ClaseInterna(); Una vez instanciada, se puede acceder a cualquiera de sus mtodos o atributos. interna.incrementar(); Se puede tener el mismo efecto, con la siguiente lnea de cdigo: new ClaseExterna().new ClaseInterna().incrementar();

71

2. CLASES INNER LOCALES AL MTODO


Una clase Inner local al mtodo est definida dentro de un mtodo de una clase. Para poder usar la clase Inner, se la debe instanciar y la instanciacin debe realizarse dentro del mismo mtodo, pero luego del cdigo que define la clase. Una clase Inner local al mtodo es como una variable declarada dentro del mtodo, por lo tanto no puede tener ningn modificador de acceso. Ejemplo:
public class ClaseExterna { public void metodo1() { class InnerLocal { public void metodo2() {} } InnerLocal interna = new InnerLocal(); interna.metodo2(); }

3. CLASES INNER ANNIMAS


Una clase inner annima, es una clase que se define sin nombre y hereda de otra clase o implementa una interface. Ejemplos:
public class ClaseA { public void metodo1() { System.out.println("m1 en ClaseA"); } } public class EjemploAnonima { public static void main(String[] args) { ClaseA ca = new ClaseA() { public void metodo1() { System.out.println("m1 en Clase Anonima"); } }; ca.metodo1(); } }

El cdigo dentro del main, crea una instancia de una clase Inner annima que HEREDA de ClaseA. Como hereda de ClaseA, puede sobrescribir el mtodo metodo1 de ClaseA Al invocar a metodo1 () a travs de la referencia ca, note que ejecuta el metodo1 sobrescrito en la clase annima. 72

public interface InterfaceA { public void metodo2(); } class EjemploAnonima { public static void main(String[] args) { InterfaceA ia = new InterfaceA() { public void metodo2() { System.out.println("m2 en Clase Anonima"); } }; ia.metodo2(); } }

El cdigo dentro del main puede ser confuso por la sentencia new InterfaceA(), recuerde que no es posible instanciar un objeto de una Interface ni de una clase abstracta. Sin embargo luego del cdigo new InterfaceA() se abren llaves, con lo cual el cdigo hace lo siguiente: crea una instancia de una clase Inner annima que implementa la interface InterfaceA. Como implementa la interaface, debe implementar los mtodos de la interface.

Ejercicio:
1. Crear el proyecto OCJP_Inner, con el paquete ocjp.inner. 2. Crear la clase InnerEjemplo, con un atributo entero llamado valor, con modificador de acceso private. 3. Dentro de la clase InnerEjemplo, declarar una clase inner llamada ClaseA con el siguiente cdigo:
public void metodo1() { valor++; System.out.println("valor: " + valor); }

4. En la clase InnerEjemplo declarar el mtodo metodo2, con el siguiente cdigo:


public void metodo2() { valor += 5; System.out.println("valor: " + valor); }

73

5. En la clase InnerEjemplo declarar el mtodo metodo3, dentro de metodo3 declarar una clase inner ClaseB y dentro de esta, declarar el mtodo metodo4
public void metodo4() { valor += 10; System.out.println("valor: " + valor); }

6. Crear la interface InterfaceA, con el siguiente cdigo:


public interface InterfaceA { public void metodo5(); }

7. En la clase InnerEjemplo declarar el mtodo metodo7 y dentro de este mtodo instanciar un objeto de una clase annima que implemente la interface interfaceA. Del objeto instanciado invocar al mtodo metodo5. 8. Crear la clase claseC, con el siguiente cdigo:
public class ClaseC { public void metodo6() { System.out.println("metodo 6"); } } 9. En la clase InnerEjemplo declarar el mtodo metodo8 y dentro de este mtodo

instanciar un objeto de una clase annima que herede de ClaseC y sobrescriba el mtodo metodo6. Del objeto instanciado invocar al mtodo metodo6.
public void metodo6(){ System.out.println("Metodo sobrescrito"); }

10. Crear una clase TestInner con un mtodo main, dentro del main ejecutar las siguientes acciones: 9.1 Invocar al mtodo metodo1 de la clase ClaseA. 9.2 Invocar a los mtodos: metodo1, metodo2, metodo4, metodo7 y metodo8 de la clase InnerEjemplo. 9.3 En consola, verificar que se ejecutan los mtodos sobreescritos de las clases annimas.

74

4. EVALUACIN
1. Dado el siguiente cdigo: class ClaseA{ class ClaseB{ public void metodo1(){ System.out.println(interno); } } public void metodo1(){ System.out.println(externo); } } class Test{ public static void main(String args[]){ ClaseA ca=new ClaseA(); //INSERTAR CODIGO AQUI } }

Cul de las siguientes sentencias insertada de manera independiente en lugar de //INSERTAR CODIGO AQUI compila sin error e imprime en consola: interno. Elija todas las que aplican. A. new ClaseB().metodo1(); B. new ClaseA().metodo1(); C. new ClaseA.ClaseB().metodo1(); D. new ClaseA().ClaseB().metodo1(); E. new ClaseA().new ClaseB().metodo1(); F. Clase B cb=new ClaseA().new ClaseB(); cb.metodo1(); G. ClaseB cb=ca.new ClaseB(); cb.metodo1(); H. ClaseA.ClaseB cb=new ClaseA().new ClaseB(); cb.metodo1();

75

2. Dado el siguiente cdigo: interface InterfaceA{ void metodo1(); } class ClaseA{ void metodo3(){ InterfaceA ia=new InterfaceA(){ void metodo1(){ } } ia.metodo1(); } } Indique si el cdigo compila con o sin errores, en caso de existir errores, justifique su respuesta. RESPUESTA:_______________________________________________________________ __________________________________________________________________________

3. Dado el siguiente cdigo: interface InterfaceB{ void metodo1(); } class ClaseA{ void metodo3(){ new InterfaceB(){ public void metodo1(){ } }.metodo1(); } } Indique si el cdigo compila con o sin errores, en caso de existir errores, justifique su respuesta. RESPUESTA:_______________________________________________________________ __________________________________________________________________________

4. Dado el siguiente cdigo: class ClaseA{ void metodo3(){ class ClaseB{ public void metodo1(){ } } 76

} }

ClaseB cb=new ClaseB(); cb.metodo1();

Indique si el cdigo compila con o sin errores, en caso de existir errores, justifique su respuesta. RESPUESTA:_______________________________________________________________ __________________________________________________________________________ 5. Dado el siguiente cdigo: class ClaseA{ void metodo3(){ class ClaseB{ public void metodo1(){ } } } void metodo4(){ ClaseB cb=new ClaseB(); cb.metodo1(); } } Indique si el cdigo compila con o sin errores, en caso de existir errores, justifique su respuesta. RESPUESTA:_______________________________________________________________ __________________________________________________________________________

77

7
MDULO II ENUMERACIONES

1. 2. 3. 4.

Cmo crear una Enumeracin Constructores de una Enumeracin Cmo agregar atributos a una Enumeracin Evaluacin

78

1. CMO CREAR UNA ENUMERACIN


Una enumeracin permite definir un rango de constantes. Ejemplo:
public enum DiasSemana{ LUNES,MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,DOMINGO; }

El punto y coma al final de los miembros del enum en este caso es opcional. Sera obligatorio si existiera ms cdigo luego de la definicin de los miembros del enum. Cada miembro de la enumeracin tiene una propiedad ordinal y un nombre. Una enumeracin pasa a convertirse en un nuevo tipo de dato del lenguaje, tal como una clase o una interface y por lo tanto se puede utilizar para declarar variables o atributos, y adems como parmetro de un mtodo o como tipo de retorno.
public class Test { public static void main(String[] args) { Test test= new Test(); } test.metodo1(DiasSemana.LUNES);

public void metodo1 (DiasSemana dia){ int valor = dia.ordinal(); String nombre= dia.name(); System.out.println("metodo1 >> Nombre: " + nombre + " ordinal: " + valor); } }

Para iterar sobre los miembros de una enumeracin, se utiliza el mtodo values, el cual retorna un arreglo con los miembros del enum.
DiasSemana [] dias= DiasSemana.values(); for (int i=0; i<dias.length; i++){ System.out.println("metodo1 >> Nombre: " + dias[i].name()+ " ordinal: " + das[i].ordinal()); }

79

2. CONSTRUCTORES DE UNA ENUMERACIN


Todo enum tiene un constructor vaco, cada declaracin de un miembro del enum, es una invocacin al constructor vaco.
public enum tipoPago { } EFECTIVO, TARJETA, CHEQUE;

Se puede colocar explcitamente el constructor vaco


public enum TipoPago { EFECTIVO, TARJETA, CHEQUE; } private TipoPago(){ }

No se puede cambiar el modificador de acceso del constructor del enum, en caso de que no se coloque el constructor, el nivel de acceso es private, no default como sera en una clase.
public enum TipoPago { EFECTIVO(), TARJETA, CHEQUE(); } private TipoPago(){ }

3. CMO AGREGAR ATRIBUTOS A UNA ENUMERACIN


Cada miembro del enum tiene una propiedad ordinal y un nombre, sin embargo se pueden agregar ms atributos al enum. En el siguiente ejemplo, se agrega un atributo cdigo, de esta forma ahora cada miembro del enum adems de la propiedad ordinal y el nombre, va a tener cdigo. El valor del atributo, se lo puede asignar en el constructor del enum.
public enum TipoPago { EFECTIVO(10), TARJETA(20), CHEQUE(30); private int codigo; private TipoPago(int codigo) {

80

this.codigo = codigo; } public int getCodigo() { } return codigo; }

Ejercicio Propuesto:
1. Crear una enumeracin llamada TamanioVaso. El enum tendr los siguientes miembros: GRANDE de capacidad 32, MEDIANO de capacidad 16 y PEQUENIO de capacidad 8, con un atributo de tipo entero llamado capacidad. El enum debe tener un mtodo para poder recuperar el valor de la capacidad. 2. Crear una clase Vaso, con los miembros: Un atributo tamanio del tipo TamanioVaso. Un constructor que reciba un parmetro TamanioVaso y lo asigne al atributo tamanio. Un atributo cantidadLiquido de tipo entero que indica la cantidad de liquido que tiene el vaso en cada momento. 3. Crear una clase Dispensador, con el mtodo llenarVaso que recibe un parmetro de tipo Vaso y se encarga de colocar lquido en el vaso (modifica el valor del atributo cantidadLiquido) bajo la siguiente lgica: Si el tamanio del vaso es grande, llenar el vaso a su capacidad mxima. Si el tamanio del vaso es MEDIANO, llena el vaso hasta la mitad de su capacidad. Si el tamanio del vaso es PEQUENIO, llena los 3/4 de la capacidad del vaso. NOTA: La capacidad del vaso se recupera del atributo capacidad que est dentro del atributo tamanio de la clase Vaso.

4. EVALUACIN
Dado el siguiente cdigo: enum DiasSemana { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES; } 81

class ClaseA { public void metodo1(int dia) { } public void metodo2(DiasSemana dia) { } public static void main(String[] args) { 1. new ClaseA().metodo1(3); 2. new ClaseA().metodo1(DiasSemana.LUNES); 3. new ClaseA().metodo2(DiasSemana.LUNES); 4. new ClaseA().metodo1(LUNES); } } Indique si cada una de las lneas numeradas en el main, compilan con o sin errores, en caso de error, justifique su respuesta: Lnea 1:________________________________________________________________ Lnea 2:________________________________________________________________ Lnea 3:________________________________________________________________ Lnea 4:________________________________________________________________ 2. Dado el siguiente cdigo: enum DiasSemana { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES; } class ClaseB { private DiasSemana dia; public void metodo1() { dia = DiasSemana.MARTES; } public void metodo1(DiasSemana dia2) { System.out.println(dia2.ordinal()); System.out.println(dia.ordinal()); }

82

public static void main(String args[]) { ClaseB cb = new ClaseB(); cb.metodo1(); cb.metodo1(DiasSemana.JUEVES); } } Cul es la salida en consola al ejecutar la ClaseA? ________________________________________________________________________________

3. Dado el siguiente cdigo: enum DiasSemana { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES; } class ClaseA { public static void main(String args[]) { for (int i = 0; i < DiasSemana.values().length; i++) { System.out.print(DiasSemana.values()[i].ordinal()); } } } Cul es la salida en consola al ejecutar la clase ClaseA? ________________________________________________________________________________

3. En el siguiente cdigo existe un error de compilacin. public enum DiasSemana { LUNES(1), MARTES(2), MIERCOLES(3), JUEVES(4), VIERNES; private int valor; DiasSemana(valor){ this.valor=valor; } } Describa la causa del error: __________________________________________________________ 83

4. En el siguiente cdigo existe un error de compilacin. public enum DiasSemana { LUNES(1), MARTES(2), MIERCOLES(3), JUEVES(4), VIERNES; private int valor; DiasSemana(int valor){ this.valor=valor; } } Describa la causa del error: __________________________________________________________ 5. En el siguiente cdigo existe un error de compilacin. public enum DiasSemana { LUNES(3), MARTES(4), MIERCOLES(5), JUEVES(6), VIERNES; private int valor; public DiasSemana(int valor){ this.valor=valor; } DiasSemana(){ } } Describa la causa del error: __________________________________________________________ 6. En el siguiente cdigo existe un error de compilacin. public enum DiasSemana { LUNES(3), MARTES(4), MIERCOLES(5), JUEVES(6), VIERNES; private int valor; private DiasSemana(int valor){ this.valor=valor; } private DiasSemana(){ this.valor=10; } } Describa la causa del error: __________________________________________________________

84

8
MODULO II ARCHIVOS

1. 2. 3. 4.

Cmo crear un archivo Cmo crear un directorio Cmo renombrar un archivo o un directorio Lectura y escritura de archivos 4.1 FileReader/FileWriter 4.2 BufferedReader/BufferedWriter 4.3 Resumen de mtodos para el manejo de archivos 5. Evaluacin

85

1. CMO CREAR UN ARCHIVO Ejercicio:


1. Crear el proyecto OCJP_Archivos. 2. En el paquete ocjp.archivos crear la clase EjercicioCreacion con un mtodo main. 3. En el mtodo main, colocar el siguiente cdigo:
File f=new File("archivo1.txt");

Esta lnea no crea ningn archivo en disco, simplemente crea un objeto File en memoria. Para crear un archivo en disco, se debe agregar la siguiente lnea:
f.createNewFile();

Tomar en cuenta que el mtodo createNewFile arroja una excepcin Checked, por lo tanto debe ser tratada, ya sea envolvindola en un bloque try/catch o relanzndola.
try {

f.createNewFile(); } catch (IOException e) { e.printStackTrace(); }

4. Ejecutar el cdigo, refrescar el proyecto y verificar que se ha creado el archivo. En la Figura. 1 se muestra el explorador de paquetes antes de ejecutar el cdigo. En la Figura. 2 se muestra el explorador de paquetes despus de ejecutar el cdigo.

Figura. 1

Figura. 2

86

2. CMO CREAR UN DIRECTORIO Ejercicio:


1. En la clase EjercicioCreacion colocar la siguiente lnea:
File c=new File("carpeta1");

2. Para crear un directorio utilice el siguiente cdigo:


c.mkdir();

Tomar en cuenta que el mtodo mkdir no arroja excepciones. 3. Ejecutar el cdigo, refrescar el proyecto y verificar que se ha creado el archivo. En la Figura 2.1 se muestra el explorador de paquetes antes de ejecutar el cdigo. En la Figura 2.2 se muestra el explorador de paquetes despus de ejecutar el cdigo.

Figura 2.1

Figura 2.2

3. CMO RENOMBRAR UN ARCHIVO O UN DIRECTORIO Ejercicio:


1. En el paquete ocjp.archivos crear la clase RenombrarArchivo con un mtodo main. 2. Para renombrar un archivo o un directorio, en el mtodo main colocar el siguiente cdigo:
File origen = new File("archivo1.txt"); File destino = new File("archivo2.txt"); origen.renameTo(destino);

El archivo archivo1.txt ahora se llama archivo2.txt 87

Tomar en cuenta que el mtodo renameTo recibe un parmetro de tipo File, NO existe una sobrecarga de renameTo que reciba un String, por lo tanto el siguiente cdigo:
origen.renameTo("archivo2.txt"); produce un ERROR DE COMPILACION.

4. LECTURA Y ESCRITURA DE ARCHIVOS 4.1. FileReader/FileWriter


Para leer un archivo, puede usar la clase FileReader, la cual tiene dos constructores sobrecargados, uno que recibe un parmetro de tipo File y otro que recibe un String con el nombre del archivo que se quiere leer.
FileReader fr=new FileReader("archivo1.txt"); File f=new File("archivo2.txt"); FileReader fr2=new FileReader(f);

El constructor de FileReader arroja una excepcin FileNotFoundException que es del tipo Checked, por lo tanto necesita ser tratada. Para leer el contenido del archivo, existe el mtodo read(), el cual retorna un entero con el cdigo Unicode del caracter ledo, cuando ya no encuentra ms caracteres, retorna -1.
fr2.read();

El mtodo read arroja una excepcin del tipo IOException, que debe ser tratada. Para leer e imprimir todo el contenido del archivo, se puede utilizar el siguiente cdigo:
int x; while((x=fr.read())!=-1){ System.out.print((char)x); }

Para escribir en un archivo, puede usar la clase FileWriter, la cual tiene dos diferentes constructores, uno que recibe un parmetro de tipo File y otro que recibe un String con el nombre del archivo que se quiere leer.
FileWriter fw=new FileWriter("archivo1.txt"); FileWriter fw1=new FileWriter(new File("archivo2.txt"));

El constructor de FileWriter arroja una excepcin FileNotFoundException que es del tipo Checked, por lo tanto necesita ser tratada. Para escribir en el archivo, puede utilizar el mtodo write, al ejecutar el mtodo write, la informacin an no se escribe en el archivo.
fw.write("linea1\n"); fw.write("linea2");

88

Para que la informacin finalmente se escriba en el archivo, es necesario invocar al mtodo flush o cerrar el FileWriter invocando al mtodo close().
fw.flush(); fw.close();

Los mtodos write(), flush() y close() arrojan una excepcin del tipo IOException que debe ser tratada

4.2. BufferedReader/BufferedWriter
Para leer un archivo, puede utilizar la clase BufferedReader, la cual tiene un constructor que recibe como parmetro un FileReader.
FileReader fr=new FileReader("archivo1.txt"); BufferedReader br=new BufferedReader(fr);

Si se quiere leer el archivo, se puede usar el mtodo readLine, el cual lee una lnea del archivo, cuando ya no existen ms lneas retorna null.
String linea; while((linea=br.readLine())!=null){ }

El mtodo reaLine arroja una excepcin del tipo IOException, que debe ser tratada. Para escribir en un archivo, puede utilizar la clase BufferedWriter, la cual tiene un constructor que recibe como parmetro un FileWriter.
FileWriter fw=new FileWriter("archivo1.txt"); BufferedWriter bw=new BufferedWriter(fw);

Para escribir en el archivo puede utilizar el mtodo write. Para escribir una nueva lnea puede utilizar el mtodo newLine. Al ejecutar estos mtodos, la informacin an no se escribe en el archivo.
bw.write("linea1"); bw.newLine(); bw.write("linea2");

Para que la informacin finalmente se escriba en el archivo, es necesario invocar al mtodo flush o cerrar el BufferedWriter invocando al mtodo close().
bw.flush(); bw.close();

Los mtodos write(), flush() y close() arrojan una excepcin del tipo IOException que debe ser tratada. 89

4.3 Resumen de mtodos para el manejo de archivos


Clase Constructores File(String s) FileReader(String s) FileReader(File f) read() close() FileWriter(String s) FileWriter (File f) write() flush() close() readLine() close() write() newLine() close() Mtodos createNewFile() renameTo(File f) Excepciones IOException FileNotFoundException IOException FileNotFoundExcetion IOExceptoin

File

FileReader

FileWriter

BufferedReader BufferedReader(FileReader fr) BufferedWriter BufferedWriter(FileWriter w)

IOException IOException

90

5. EVALUACIN
1. Frente a cada mtodo indique si el mtodo arroja o no una excepcin del tipo Checked: read __________ readLine __________ Constructor de la clase File__________ Constructor de la clase FileWriter__________ Constructor de la clase BufferedReader__________ write __________ createNewFile__________ close__________ flush__________ mkdir__________ renameTo__________

2. En cada una de las siguientes preguntas, indique si el cdigo compila con o sin error, en caso de que exista un error, justifique su respuesta: 2.1 public static void main(String args[]){ File f=new File(); f.setName(archivo.txt); }
Respuesta:___________________________________________________

2.2 public static void main(String args[]){ File f1=new File(archivo2.txt); File f2=new File(directorio1); f1.createNewFile(); f2.mkdir(); }

Respuesta:___________________________________________________

91

2.3 public static void main(String args[]){ File f1=new File(archivo1.txt); FileReader fr=new FileReader(f1); FileReader fr2=new FileReader(archivo2.txt); }

Respuesta:___________________________________________________

2.4 public static void main(String args[]){ File f1=new File(archivo1.txt); FileReader fr=new FileReader(f1); FileReader fr2=new FileReader(archivo2.txt); }
Respuesta:___________________________________________________

2.5 public static void main(String args[]) throws IOException{ File f1=new File(archivo1.txt); FileReader fr=new FileReader(f1); FileReader fr2=new FileReader(archivo2.txt); }

Respuesta:___________________________________________________

2.6 public static void main(String args[]) throws IOException{ File f1=new File(archivo1.txt); FileReader fr=new FileReader(f1); BufferedReader br=new BufferedReader(fr); }

Respuesta:___________________________________________________

2.7 public static void main(String args[]) throws IOException{ BufferedReader br=new BufferedReader(new File(archivo1.txt)); }
Respuesta:___________________________________________________

2.8 public static void main(String args[]){ BufferedReader br=new BufferedReader(new FileReader(archivo1.txt)); }
Respuesta:___________________________________________________

92

2.9 public static void main(String args[]) throws IOException{ BufferedReader br=new BufferedReader(new FileReader(archivo1.txt)); }
Respuesta:___________________________________________________

2.10 public static void main(String args[]){ File f=new File(archivo.txt); f.renameTo(nuevo.txt); }

Respuesta:___________________________________________________

93

9
MODULO III THREADS

1. Cmo obtener el hilo de ejecucin actual 2. Creacin y ejecucin de hilos 2.1 Cmo crear un hilo heredando de Thread 2.2 Ejecucin de hilos 2.3 Cmo crear un hilo implementando Runnable 3. El mtodo sleep 4. Ejercicio Propuesto 5. Evaluacin

94

1. CMO OBTENER EL HILO DE EJECUCIN ACTUAL


Para obtener el nombre del hilo de ejecucin actual, se utiliza la siguiente sentencia:
Thread.currentThread().getName();

De la misma forma, con la siguiente lnea de cdigo, se obtiene el id del hilo de ejecucin actual.
Thread.currentThread().getId();

Ejercicio:
1. Crear el proyecto OCJP_Threads 2. En el paquete ocjp.threads, crear la clase Threads1, con el siguiente cdigo:
public class Threads1 { public static void main(String[] args) { System.out.println("Threads1 >> Nombre: " + Thread.currentThread().getName() + "Id: " + Thread.currentThread().getId()); } }

3. Ejecutar el cdigo.Como se puede ver en consola, el hilo actual de ejecucin se llama main y su cdigo es 1. (Ver Figura 1.1)

Figura 1.1

2. CREACIN Y EJECUCIN DE HILOS


Existen dos formas de crear Hilos en Java: 1) Heredar de la clase Thread y sobreescribir el mtodo run 2) Implementar la interface Runnable La interface Runnable tiene el mtodo run. La clase Thread implementa Runnable, sobreescribe el mtodo run y adems tiene el mtodo start.

95

2.1 Cmo crear un hilo heredando de Thread


Para crear un hilo en Java, se puede heredar de la clase Thread y sobreescribir el mtodo run. La firma del mtodo run en la clase padre es:
public void run() {}

Ejercicio:
1. Crear en el paquete ocjp.threads del proyecto OCJP_Threads anteriormente creado, la clase HiloUno con el siguiente cdigo:
public class HiloUno extends Thread { public void run() { System.out.println("Hilo Uno >> Nombre: " + Thread.currentThread().getName() + " Id: " + Thread.currentThread().getId()); } }

2.2 Ejecucin de hilos


Para ejecutar el mtodo run de HiloUno en un nuevo hilo de ejecucin, se debe invocar al mtodo start de HiloUno.

Ejercicio:
1. En el paquete ocjp.threads. Crear la clase Threads2 y en el mtodo main agregar el cdigo para ejecutar el mtodo run de HiloUno en un nuevo hilo de ejecucin.
public class Threads2 { public static void main(String[] args) { HiloUno h1 = new HiloUno(); h1.start(); } }

2. Ejecutar el cdigo. Como se puede ver en consola el mtodo run se ejecut en un hilo diferente al main. (Ver Figura 2.2.1)

Figura 2.2.1 96

Si en lugar de start(), invoca a run, se ejecutar el mtodo run de HiloUno pero en el mismo hilo de ejecucin, en este caso en el hilo del main. 3. Modificar el main para invocar a run en lugar de start:
public class Threads2 { public static void main(String[] args) { HiloUno h1 = new HiloUno(); //h1.start(); h1.run(); } }

4. Ejecutar el cdigo. Como se puede ver en consola el mtodo run se ejecut en el mismo hilo. (Ver Figura 2.2.1)

Figura 2.2.2

2.3 Cmo crear un hilo implementando Runnable


Otra forma de crear hilos en java es crear una clase que implemente la interface Runnable.

Ejercicio:
1. Crear la clase HiloDos en el paquete ocjp.threads, la cual implemente la interface Runnable, la clase est en la obligacin de implementar el mtodo abstracto run definido en la interface, coloque el siguiente cdigo :
public class HiloDos implements Runnable { public void run() { System.out.println("HiloDos >> Nombre: " + Thread.currentThread().getName()+" Id: " + Thread.currentThread().getId()); } }

97

2. Crear la clase Threads3 en el mismo paquete de la clase HiloDos, con un mtodo main.

En el mtodo main crear una instancia de HiloDos. Note que a diferencia de HiloUno, en HiloDos no existe el mtodo start, solamente el mtodo run. Si invoca al mtodo run se ejecutar dicho mtodo pero en el mismo hilo de ejecucin. (Ver Figura 2.3.1)
public class Threads3 { public static void main(String[] args) { HiloDos h2 = new HiloDos(); System.out.println("Hilo Threads3 >> Nombre: " + Thread.currentThread().getName() + " Id: " + Thread.currentThread().getId()); h2.run(); } }

Figura 2.3.1 3. Crear la clase Threads4 en el mismo paquete que se est trabajando, con el siguiente cdigo. En el cual se observa que para ejecutar el mtodo run en un nuevo hilo de ejecucin, se requiere crear un objeto Thread y pasarle como parmetro la instancia de HiloDos. Cuando se ejecute el mtodo start del Thread, este invocar al mtodo run de HiloDos en un nuevo hilo de ejecucin.
public class Threads4 { public static void main(String[] args) { HiloDos h2 = new HiloDos(); Thread tr = new Thread(h2); tr.start(); } }

4. Ejecutar el cdigo. Como se puede ver en consola que se ejecuta el run de HiloDos en un nuevo hilo de ejecucin. (Ver Figura 2.3.2)

Figura 2.3.2 No se puede invocar dos veces al mtodo start() de un Thread 98

Ejercicio:
1. En la clase Threads4 escribir el siguiente cdigo.
public class Threads4 { public static void main(String[] args) { HiloDos h2 = new HiloDos(); Thread tr = new Thread(h2); tr.start(); tr.start(); } }

2. Ejecutar el cdigo. Como se puede ver en consola se ejecuta el primer start sin complicaciones, al momento de llegar al segundo start se muestra un error de ejecucin, debido a que no se puede invocar dos veces al mtodo start. (Ver Figura 2.3.3)

Figura 2.3.3

3. EL MTODO SLEEP
El mtodo esttico sleep de la clase Thread, permite detener momentneamente (dormir) el hilo en el cual se est ejecutando dicha sentencia. El parmetro que recibe sleep, indica el tiempo en milisegundos que se quiere dormir al hilo. El mtodo sleep arroja la excepcin InterruptedException que al ser del tipo checked, necesita ser tratada.

Ejercicio:
1. Crear la clase EjercicioSleep en el paquete anteriormente mencionado con el siguiente cdigo:
public class EjercicioSleep { public static void main(String[] args) { System.out.println("Inicio"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Fin"); } }

99

3. Ejecutar el cdigo. Como se puede ver en consola se ejecuta la lnea inicio, luego se duerme el hilo durante un segundo y a continuacin imprime Fin. (Ver Figura 3.1)

Fin aparece luego de un segundo de Inicio Figura 3.1

Ejercicio:
4. Crear la clase MiHilo en el paquete ya creado anteriormente; la cual herede de Thread y colocar el siguiente cdigo:
public class MiHilo extends Thread public void run() { for (int i = 0; i < 10; i++) { System.out.println("Mi hilo >> Nombre: " + Thread.currentThread().getName() + i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

1. Crear la clase EjercicioSleep2 en el mismo paquete que se cre la clase MiHilo, que herede de Thread y colocar el siguiente cdigo:
public class EjercicioSleep2 extends Thread{ public void run() { for (int i=0; i<10; i++){ System.out.println("EjericioSleep2 >> Nombre: " + Thread.currentThread().getName() + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

100

2. Para ejecutar el cdigo, crear la clase Test con el siguiente cdigo. Como se puede ver en consola los dos hilos se ejecutan en paralelo. (Ver Figura 3.2)
public class Test { public static void main(String[] args) { MiHilo mhilo= new MiHilo(); EjercicioSleep2 ejPrueba = new EjercicioSleep2(); mhilo.start(); ejPrueba.start(); } }

Figura 3.2

4. EJERCICIO PROPUESTO
Se requiere crear una aplicacin Productor-Consumidor, con las siguientes caractersticas: El Productor coloca un mensaje en una lista cada cierto tiempo, el Consumidor verifica si existen mensajes en la lista, en caso de existir retira el mensaje de la lista. Para tal propsito, realizar las siguientes acciones: 1. Crear el Proyecto llamado OCJP_EjercicioThreads 2. Crear el paquete ocjp.ejercicio 3. Dentro del paquete crear las siguientes clases: Productor Consumidor TestProductorConsumidor 101

Clase Productor Productor Herencia Atributos

Productor hereda de Thread. List <String> mensajes

Clase Productor Constructor Descripcin Parmetros

Asigna al atributo mensajes, la variable mensajes que recibe como parmetro. Lista de mensajes

Clase Productor Mtodo run Descripcin Agrega un mensaje con el mtodo add de la lista, esto se realiza 10 veces. Cada vez que se agrega un mensaje, imprime en consola: Se agrega un mensaje; luego de esto duerme al hilo actual durante 1 segundo. Parmetros No recibe parmetros Retorna No retorna ningn valor

Clase Consumidor Consumidor Herencia Consumidor hereda de Thread. Atributos List <String> mensajes

Clase Consumidor Constructor Descripcin Asigna al atributo mensajes, la variable mensajes que recibe como parmetro. Parmetros Lista de mensajes

Clase Consumidor Mtodo run Descripcin Duerme el hilo actual de ejecucin durante 0.5 segundos; verifica si la lista tiene mensajes mediante el mtodo size() de la lista. Si la lista tiene mensajes, retira el mensaje con el mtodo remove (0). Cada vez que retira un mensaje imprime en consola: Se retira un mensaje, en caso de que la lista no tenga mensajes imprime en consola: No existen mensajes. Este proceso lo realiza 20 veces. Parmetros No recibe parmetros Retorna No retorna ningn valor 102

Clase TestProductorConsumidor Main Descripcin Tiene los siguientes atributos: Lista de mensajes, un Productor, un Consumidor. Se inicializa el consumidor y el productor invocando al constructor que recibe como parmetro una lista; se enva la lista de mensajes como parmetro. Se inicializan los dos hilos usando el mtodo start().

5. EVALUACIN
En cada una de las siguientes preguntas, indicar si el cdigo compila con o sin errores, en caso de que compile sin errores, indicar si ejecuta con o sin errores. Si existe algn error en compilacin o en ejecucin, justifique su respuesta.

1. PREGUNTA 1
class Hilo1 extends Thread{ public void run(){ } public static void main(String args[]){ Hilo1 h1=new Hilo1(); h1.start(); h1.start(); } } RESPUESTA: _________________________________________________________________

2. PREGUNTA 2
class Hilo2 extends Thread{ public void run(){ } public static void main(String args[]){ Hilo1 h1=new Hilo1(); h1.run(); } } RESPUESTA: _________________________________________________________________

103

3. PREGUNTA 3
class Hilo3 extends Thread{ public void run(){ } public static void main(String args[]){ Thread t1=new Thread(new Hilo1()); t1.start(); } } RESPUESTA: _______________________________________________________________

4. PREGUNTA 4
class Hilo4 implements Runnable{ public void run(){ } public static void main(String args[]){ Hilo4 h4=new Hilo4(); h4.start(); } } RESPUESTA: _________________________________________________________________

5. PREGUNTA 5
class Hilo6 implements Runnable{ public void run(){ } public static void main(String args[]){ Thread t1=new Thread(new Hilo5()); Thread t2=new Thread(new Hilo5()); t1.start(); t2.start(); } } RESPUESTA: _________________________________________________________________

6. PREGUNTA 6

class Hilo7 implements Runnable{ public void run(){ } public static void main(String args[]){ new Thread(new Hilo7()).start(); } } RESPUESTA: _________________________________________________________________

104

7. PREGUNTA 7

class Ejemplo1{ public static void main(String args[]){ Thread.sleep(1000); } } RESPUESTA: _________________________________________________________________

8. PREGUNTA 8

class Ejemplo2{ public static void main(String args[]) throws Exception{ Thread.sleep(1000); } } RESPUESTA: _________________________________________________________________

9. PREGUNTA 9

class Ejemplo3{ public static void main(String args[]){ try{ Thread.sleep(1000); }catch(InterruptedException ex){ } } } RESPUESTA: _________________________________________________________________

10. PREGUNTA 10
class Ejemplo4{ public static void main(String args[]){ Runnable r=new Runnable(){ public void run(){ } }; r.start(); } } RESPUESTA: _________________________________________________________________

105

11. PREGUNTA 11

class Ejemplo4{ public static void main(String args[]){ Thread t=new Thread(){ public void run(){} }; t.start(); } } RESPUESTA: _________________________________________________________________

12. PREGUNTA 12
class Ejemplo5{ public static void main(String args[]){ new Thread(){ public void run() {} }.start(); } RESPUESTA: _______________________________________________________________

En cada una de las siguientes preguntas, elija el resultado que se obtiene al ejecutar el cdigo

13. PREGUNTA 13

class Hilo8 extends Thread{ public void run(){ try{ Thread.sleep(1000); }catch(InterruptedException ex){ } } public static void main(String args[]){ System.out.println(Inicio); new Thread7().start(); System.out.println(Fin); } } 1. Se imprime en consola Inicio y al menos un segundo despus se imprime en consola Fin. 2. Se imprime en consola Inicio e inmediatamente Fin 3. Ocurre un error de ejecucin 4. Hay un error de compilacin 106

14. PREGUNTA 14
class Thread8 extends Thread{ public void run(){ try{ Thread.sleep(1000); }catch(InterruptedException ex){ } } public static void main(String args[]){ System.out.println(Inicio); new Thread8().run(); System.out.println(Fin); } } 1. Se imprime en consola Inicio y al menos un segundo despus se imprime en consola Fin. 2. Se imprime en consola Inicio e inmediatamente Fin 3. Ocurre un error de ejecucin 4. Hay un error de compilacin

107

Anda mungkin juga menyukai