Вы находитесь на странице: 1из 129

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

Universidad del Per, DECANA DE AMRICA)

FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA


Escuela Acadmico Profesional de Ingeniera de Sistemas

SILABO

1. ESPECIFICACIONES GENERALES:

1.1 Nombre del curso : Algortmica II


1.2 Cdigo del curso : 202001
1.3 Duracin del curso : Semestral
1.4 Forma de Dictado : Terico - Prctico Laboratorio
1.5 Horas semanales : Teora: 2h - Prctica: 2h - Laboratorio: 2h
1.6 Naturaleza : Bsico de la profesin
1.7 Nmero de crditos : Cuatro (4)
1.8 Pre-requisito : 201001 - Algortmica I
1.9 Semestre acadmico : 2017-II

2. SUMILLA
El paradigma de la programacin orientada a objetos (POO). Conceptos bsicos (objeto, clase,
encapsulacin, polimorfismo, etc). Relaciones semnticas y jerrquicas, clases abstractas. La
importancia de la POO en la especificacin y construccin de Patrones o plantillas, excepciones y
persistencia. Casos prcticos y su implementacin en lenguajes como C++ y java.
3. OBJETIVO GENERAL
Proveer a los estudiantes los conceptos y tcnicas de orientacin a objetos (OO) que son fundamento
terico prctico para la resolucin de problemas y construccin de programas basado en el
paradigma de la OO. Ello le permitir afrontar con xito la solucin de aplicaciones complejas
Adems se cultivar las diferentes tcnicas de re-uso y criterios de robustez en un programa,
considerando siempre que solucionar una aplicacin debe ser vista como una obra de ingeniera.
4. OBJETIVOS ESPECIFICOS
Utilizar y aplicar correctamente la terminologa y conceptos bsicos de la POO.
Implementar y utilizar correctamente los mensajes como medio de comunicacin de los objetos.
Disear, implementar y aplicar los conceptos sobre relaciones entre clases con el fin de modelar
aplicaciones del mundo real apoyndose en mecanismos de reutilizacin.
Manipular objetos de diferentes clases por medio de un mismo elemento y realizar la misma
operacin de formas diferente basado en conceptos de polimorfismo.
Disear y aplicar clases y mtodos que acten sobre diferentes tipos de datos (genericidad).
Disear e implementar el uso de mecanismos para manejo de errores o excepciones y registro de
manera permanente del estado de un objeto usando conceptos de persistencia.
Alcanzar en el estudiante un grado de abstraccin que le permita analizar, disear, discutir e
implementar soluciones a travs de las herramientas usadas hoy en da en la POO.
5. CONTENIDO ANALTICO POR SEMANAS
1ra Semana: INTRODUCCIN.
Teora
La POO como un nuevo paradigma, su diferencia con la programacin estructurada y modular,
abstraccin, ocultamiento de la implementacin, reutilizacin y lenguajes orientados a objetos.
Ventajas y desventajas de la POO.
Prctica
Construccin de TAD y su manipulacin en un enfoque estructurado a travs de ejercicios prcticos,
ventajas y desventajas.

1
Laboratorio
Implementacin de TAD.
[9] 1, 21,39; [10] 29, 581; [11] 328; [12] 19; [5] 43; [7] 490; [6] 43, 69; [2] 34; [3] 1; [1] 23

2da Semana: OBJETOS Y CLASES


Teora
Objetos y clases como TAD. Encapsulacin y ocultacin de la informacin, tipos de atributos.
Adems creacin de objetos como instancia de una clase.
Prctica
Comparacin entre lenguajes de POO, creacin de objetos.
Laboratorio
IDEs de desarrollo. Implementacin de clases y objetos.
[9] 157, 205; [10] .452; [11] 95; [12] 37, 391; [5] 58; [8] 98; [7] 507; [2] 46, 72; [3] 55; [1] 63; [6]
273; [13] 635

3ra Semana : MENSAJES


Teora
Mtodos y sus variantes como constructores y destructores. Activacin de objetos, definicin de
mensaje y partes de un mensaje. Introduccin a excepciones.
Prctica
Construccin y comparacin de mtodos y mecanismos de iniciacin y finalizacin (constructores y
destructores).
Prctica Calificada N 1
Laboratorio
Desarrollo de un caso de iniciacin en Java.
[10] 470; [11] 167; [5] 63; [8] 101, 104; [6] 243

4 y 5ta. Semana: RELACIONES ENTRE CLASES


Teora
Conceptos y terminologa bsica usada para describir relaciones de uso, asociacin, agregacin y
composicin, y su diseo en el diagrama de clases.
Prctica
Exposicin de casos reales basados en relaciones de asociacin, agregacin y composicin.
Laboratorio
Ejemplo de herramientas para el diseo de diagramas de clases e implementacin de las relaciones
en Java.
[11] 199; [12] 45.
6 y Semana: HERENCIA
Teora
Conceptos y propiedades, niveles de acceso, su importancia como mecanismo de rehuso, tipos de
herencia y su representacin en el diagrama de clases. Reutilizacin con herencia.
Prctica
Construccin de jerarquas de clases. Implementacin.
Prctica Calificada N 2
Laboratorio
Desarrollo de casos en Java bajo herencia simple (extends) o herencia mltiple (interface
implements).
[9] 65, 433, 489, 537; [10] 505; [11] 316; [12] 91; [5] 76; [8] 119; [3] 191; [6]307; [13]697

7ma Semana: Clase Abstracta e Interfaces


Teora
Concepto y propiedades de una clase abstracta, su ubicacin e importancia en la jerarqua de clases.
Interfaces. Conceptos, diferencias clases abstractas. aplicaciones
Prctica
Diseo de clases abstractas en el diagrama de clases, la redefinicin de sus mtodos (funciones
virtuales), tipos de ligadura, etc.

2
Laboratorio
Forma de Implementar y ejercicios sobre clases abstractas en Java
Proyecto: Planteamiento
[10] 505; [13]697

8va Semana: Examen Parcial

9na semana: POLIMORFISMO


Teora
Polimorfismo, su importancia en la POO, ventajas y desventajas de su uso en lenguajes de POO.
Prctica
Casos que hacen uso del polimorfismo..
Laboratorio
Ejercicios sobre polimorfismo en java o C++.
Proyecto: Diagramas de clase
[9] 441, 452; [10] 523; [5] 86, 95; [7] 523; [3] 223; [6] 307; [13] 667

10ma Semana: EXCEPCIONES


Teora
Concepto de excepciones, manejo de excepciones, lanzamiento de excepciones.
Prctica
Comparacin y construccin de excepciones.
Laboratorio
Casos en Java, que requieren el uso de excepciones como en la lectura de datos por consola.
Proyecto: Diagramas de clase y programacin al 50%
[9] 387; [6] 249, 419, 631; [2] 168; [3] 405; [1] 317

11va Semana: CLASES GENRICAS


Teora
Definicin de clases genricas o contenedores, conceptos bsicos sobre plantillas, prototipos,
ventajas y desventajas.
Prctica
Diseo y construccin de plantillas de clases y funciones en C++, comparacin y diferencias con
relacin a java.
Laboratorio
Ejercicio en Java.
Prctica Calificada N 3
Proyecto: Diagramas de clase de diseo, relaciones programacin al 60%
[9] 299, 1111

12va Semana: PERSISTENCIA


Teora
Definicin, tipos de instancias (persistente y transitoria), alternativas usadas para persistencia, el
concepto de servicio de persistencia y requisitos de un servicio de persistencia en un sistema gestor
de datos.
Prctica
Casos en java de serializacin as como especificacin de un servicio de persistencia en un gestor de
datos.
Laboratorio
Implementacin de la serializacin y de un servicio de persistencia.
[9] 983; [10] 642; [8] 124; [2] 710; [3] 439; [1] 419; [6] 593; [13] 715
Proyecto: Diagramas de clase de diseo, relaciones, programacin al 80% y persistencia

3
13va Semana: GUIs

Teora
Conceptos, componentes, disposicin, eventos
Practica
Implementacin de GUI en java, AWT y SWING
Laboratorio
Implementacin en Java

14 va Semana: PROGRAMACIN CONCURRENTE e HILOS (THREADS)

Teora
Definicin de Concurrencia,ejemplos de sistemas donde existe concurrencia, necesidad de la
programacin concurrente, problemas tpicos de la programacin concurrente, Multiprogramacin,
Multitarea, Multiprocesos, Sistemas Paralelos y Distribuidos.El Concepto de Hilos (Threads) ,
composicin de Hilos, comunicacin entre Hilos, sincronizacin entre Hilos, soluciones a problemas
de interbloqueo, ejemplos de uso de Hilos en Productor Consumidor, Semforos.
Prctica
Diseo y construccin de Threads en Java.
Prctica Calificada N 4
Laboratorio
Implementacin de la Threads y de uso de Hilos en Productor Consumidor,semforos

15 va Semana:CONECTIVIDAD CON BASE DE DATOS - JDBC


Teora
Introduccin a ORM, la API JDBC , el bridge jdbc-odbc, otras categoras de drivers ,estructura de
una aplicacin JDBC, DriverManager,conectndose a una base de datos , ejecucin de consultas,
conversiones de tipos de dato.
Prctica
Diseo e construccin de conexin JDBC con Java.
Laboratorio
Implementacin de conectividad entre JAVA MYSQL , JAVA MS-SQL Server
Proyecto: Presentacin y Sustentacin

16va Semana: Examen Final

17va Semana: Examen Sustitutorio.

6. METODOLOGA
El desarrollo del curso se realiza en base a sesiones terico, prctico y laboratorio por parte del
profesor y un sistema de enseanza y aprendizaje investigacin por parte de los alumnos. La
estructura del desarrollo del curso se asienta en una mixtura de mtodos activos en la que la
participacin de los alumnos les permite estar en permanente actividad mental. En ellas se producen
los estmulos necesarios, propiciando la motivacin indispensable para la realizacin del aprendizaje.
Las sesiones de aula y laboratorio se complementarn con el desarrollo de trabajos prcticos en
grupo los cuales no podrn exceder el 10 % del total de alumnos inscritos en el curso.

7. EVALUACIN
En base a una consideracin de evaluacin formativa, el proceso de obtencin de una calificacin
aprobatoria depender del logro de los objetivos por parte del alumno. Esto implica:

NF: Nota final.


EP + EF + PL + PP + PY EP: Nota del Examen Parcial.
NF = EF: Nota del Examen Final.
8. 5 PL: Nota de Laboratorios.
PP: Nota de Prcticas.
PY: Proyecto.

4
8. BIBLIOGRAFA

Bsica
[15]Deitel M. Harvey y Deitel J. Paul .(2008). Java Como Programar. Prentice Hall. Mexico D. F.
[1] Fco. Javier Ceballos. Java 2 Curso de Programacin. Alfaomega Ra-Ma
[14]Budd. Timothy. Introduccin a la Programacin orientada a objetos. Addison - Wesley
Iberoamericana.
[9] Bertrand Meyer. Construccin de Software Orientado a Objetos. Prentice Hall, segunda edicin

Complementaria
[3] Bruce Eckel. Piensa en Java. Prentice Hall Hispanoamericana S. A., 2002
[2] JhonZukowski. Java 2 J2SE 1.4. Anaya Multimedia 2003
[4] Luis Joyanes Aguilar. Programacin en Java 2, Algoritmos Estructuras de Datos y Programacin
Orientada a Objetos. Mc Graw Hill
[5] Mark Andrews. Aprenda Visual C++ Ya, McGraw-Hill, 1997
[6] Luis Joyanes Aguilar. Programacin Orientada a Objetos, Segunda edicin. McGraw-Hill
Interamericana De Espaa S.A. U, 1998
[7] Chris H. Pappas, William H. Murray. Visual C++ 6.0 . McGraw - Hill Interamericana S.A.U.
1999
[8] Kent Reisdorph. Aprendiendo Borland C++ Builder 3 en 21 Das. Prentice Hall Hispanoamericana
S. A. 1998
[10] Andrew C. Staugaard, Jr. Tcnicas Estructuradas y Orientadas a Objetos. Prentice Hall
Hispanoamericana S.A. 1998.
[11] Grady Booch. Anlisis y Diseo Orientado a Objetos. Addison Wesley Iberoamericana S.A., segunda
edicin, 1996
[12] James Rumbaugh, Michael Blaha, William Premerlani, Frederick Hed y William Lorenson.
Modelado y Diseo Orientado a Objetos, Metodologa OMT. Prentice Hall, 1996.
[13] Herbert Schildt. Turbo C/C++ Manual de Referencia, una informacin completa ideal para todo
usuario de Turbo C/C++. Osborne/ McGraw-Hill, 1999

5
Gua #1
Clases y Objetos

Arn Herrera Ponte


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Abrir NetBeans IDE


Pasos:
1. Hacer clic al men Inicio.
2. Hacer clic en la opcin Programas.
3. Hacer clic en la opcin NetBeans 5.0
4. Hacer clic en NetBeans IDE.

Esperamos unos segundos y aparece una ventana que muestra el


avance de una barra naranja (Barra de progreso). En este momento se
estn leyendo y cargando los paquetes necesarios para utilizar
NetBeans IDE 5.0

Luego de esperar unos segundos aparece la Interfaz de Desarrollo


Integrado NetBeans IDE 5.0

Prof. Arn Herrera Ponte Pg. 2


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Crear un Proyecto en NetBeans IDE 5.0


Pasos:
1. Hacer clic en el men File.
2. Hacer clic en la opcin New Project...

Aparece la ventana New Project


3. En el cuadro Categoras, hacer clic en la carpeta General
4. En el cuadro Proyectos, hacer clic en Java Application
5. Hacer clic en el botn Next >

Prof. Arn Herrera Ponte Pg. 3


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece la ventana New Java Application

6. Escribir el nombre del Proyecto (Project Name) : Proyecto01


7. Hacer clic en el botn Browser, para cambiar la Localizacin
donde se guardar el proyecto.

Prof. Arn Herrera Ponte Pg. 4


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece la ventana Select Project Location


8. Seleccionar una Unidad del disco duro, por ejemplo E:\
9. Hacer clic en el botn Abrir.

Aparece de nuevo la ventana New Java Application con las ltimas


modificaciones.
10. Deshabilitar la casilla Create Main Class
11. Hacer clic en el botn Finish.

Prof. Arn Herrera Ponte Pg. 5


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Ahora aparece el proyecto creado Proyecto01. Debemos observar que


se muestran 3 pestaas (Project, File y Runtime) que nos permitirn
administrar nuestro proyecto.

Cerrar un Proyecto en NetBeans IDE 5.0


Pasos:

1. Hacer clic en la
pestaa Project.

2. Hacer clic derecho


sobre el nombre del
proyecto que
deseamos cerrar.

3. Hacer clic en la
opcin Close Project.

Prof. Arn Herrera Ponte Pg. 6


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Ahora observamos que el nombre de nuestro proyecto ya no se muestra.

Abrir un Proyecto existente en NetBeans IDE 5.0


Pasos:
1. Hacer clic en el men File.
2. Hacer clic en la opcin Open Project

Aparece la ventana Open Project

Prof. Arn Herrera Ponte Pg. 7


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Para nuestro caso vamos a abrir Proyecto01 que se encuentra en la


Unidad E de nuestro disco duro.
3. Hacer clic en la Unidad (E:)
4. Hacer clic en Proyecto01
5. Hacer clic en el botn Open Project Folder

Nota: Para seleccionar el proyecto, debemos buscar aquellas carpetas


que tengan un pequeo cuadrado amarillo en el borde inferior derecho.

Aparece el nombre de nuestro proyecto.

Prof. Arn Herrera Ponte Pg. 8


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Crear un Paquete Java en NetBeans IDE 5.0


Pasos
1. Hacer clic en la pestaa File
2. Hacer clic doble clic en el nombre de nuestro proyecto

3. Hacer clic derecho en la carpeta SRC


4. Hacer clic en la opcin New
5. Hacer clic en la opcin Java Package

Prof. Arn Herrera Ponte Pg. 9


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece la ventana New Java Package


6. Escribir el nombre del paquete (Package Name) : jpackGuia01
7. Hacer clic en el botn Finish

Aparece el nombre del paquete creado jpackGuia01

Prof. Arn Herrera Ponte Pg. 10


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Prof. Arn Herrera Ponte Pg. 11


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Crear una Clase Java en NetBeans IDE 5.0


Pasos:
1. Hacer clic derecho en el paquete jpackGuia01
2. Hacer clic en la opcin New
3. Hacer clic en la opcin Java Class

Aparece la ventana New Java Class


4. Escribir el nombre de la clase (Class Name) : jclsPunto
5. Hacer clic en el botn Finish

Prof. Arn Herrera Ponte Pg. 12


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece en el lado derecho una pestaa con el nombre del archivo


creado jclsPunto.java , esta pestaa muestra el cdigo de la clase
jclsPunto escrito en el Lenguaje de Programacin Java.

Se recomienda borrar los comentarios que se generaron al momento de


crear la clase jclsPunto.

Prof. Arn Herrera Ponte Pg. 13


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

El cuerpo de la clase, estar encerrado entre llaves { }


Los atributos (variables) y mtodos (funciones) constituyen la clase.
No es obligatorio, pero en general se listan primero los atributos y luego
los mtodos

Declaracin de atributos
En Java no hay variables globales; todas las variables se declaran
dentro del cuerpo de la clase o dentro de un mtodo. Las variables
declaradas dentro de un mtodo son locales al mtodo; las variables
declaradas en el cuerpo de la clase se dice que son miembros de la
clase y son accesibles por todos los mtodos de la clase.

Finalmente, los atributos miembros de la clase pueden ser atributos de


clase o atributos de instancia; se dice que son atributos de clase si se
usa la palabra clave static: en ese caso la variable es nica para todas
las instancias (objetos) de la clase (ocupa un nico lugar en memoria).
Si no se usa static, el sistema crea un lugar nuevo para esa variable
con cada instancia (o sea que es independiente para cada objeto).

La declaracin sigue siempre el mismo esquema:

[private|protected|public] [static] [final] [transient] [volatile] Tipo NombreVariable


[= Valor];

private, protected o public


Java tiene 4 tipos de acceso diferente a las variables o mtodos de una
clase: privado, protegido, pblico o por paquete (si no se especifica
nada).

De acuerdo a la forma en que se especifica un atributo, los objetos


tendrn distintas posibilidades de acceso:

Acceso desde: private protected public (package)


la propia clase S S S S
subclase en el
N S S S
mismo paquete
otras clases en el
N S S S
mismo paquete
subclases en
otros paquetes
N X S N
otras clases en
N N S N
otros paquetes

S: puede acceder
N: no puede acceder
X: puede acceder al atributo en objetos que pertenezcan a la subclase,
pero no en los que pertenecen a la clase Padre.

Prof. Arn Herrera Ponte Pg. 14


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Declaracin de Atributos de la clase jclsPunto

private double x;
private double y;

Declaracin de Mtodos

[private|protected|public] [static] [abstract] [final] [native]


[synchronized] TipoDevuelto NombreMtodo ( [tipo1 nombre1[, tipo2
nombre2 ]] ) [throws excepcin1 [,excepcin2] ]

Bsicamente, los mtodos son como las funciones de C/C++:


Implementan operaciones y estructuras de control, el clculo de algn
parmetro que es el que devuelven al objeto que los llama. Slo pueden
devolver un valor (del tipo TipoDevuelto), aunque pueden no devolver
ninguno (en ese caso TipoDevuelto es void).

Como ya veremos, el valor de retorno se especifica con la instruccin


return, dentro del mtodo.

Los mtodos pueden utilizar valores que les pasa el objeto que los llama
(parmetros), indicados con tipo1 nombre1, tipo2 nombre2 en el
esquema de la declaracin.

Estos parmetros pueden ser de cualquiera de los tipos conocidos. Si


son tipos bsicos, el mtodo recibe el valor del parmetro; si son
arrays, clases o interfases, recibe un puntero a los datos (referencia).

Prof. Arn Herrera Ponte Pg. 15


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Mtodo Constructor
Tanto Java como C++ soportan la nocin de constructor. El
constructor es un tipo especfico de mtodo que siempre tiene el mismo
nombre que la clase y se utiliza para construir objetos de esa clase. No
tiene tipo de dato especfico de retorno, ni siquiera void. Esto se debe a
que el tipo especfico que debe devolver un constructor de clase es el
propio tipo de la clase.

En este caso, no se puede especificar un tipo de retorno, ni se puede


colocar ninguna sentencia que devuelva un valor. Los constructores
pueden sobrecargarse, y aunque puedan contener cdigo, su funcin
primordial es inicializar el nuevo objeto que se instancia de la clase. En
C++, el constructor se invoca automticamente a la hora de crear un
objeto. En Java, ha de hacerse una llamada explcita al constructor
para instanciar un nuevo objeto.

Cuando se declara una clase en Java, se pueden declarar uno o ms


constructores opcionales que realizan la inicializacin cuando se
instancia (se crea una ocurrencia) un objeto de dicha clase.

Tanto en Java como en C++, si no se proporciona explcitamente un


constructor, el sistema proporciona uno por defecto que inicializar
automticamente todas las variables miembro a cero o su equivalente,
en Java. En C++, el constructor de defecto no realiza ningn tipo de
inicializacin.

Implementacin del Mtodo Constructor jclsPunto()

Implementacin del Mtodo Constructor por Parmetro


jclsPunto(double x, double y)

Prof. Arn Herrera Ponte Pg. 16


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Dentro de un mtodo, el identificador this contiene una referencia al


objeto con que se invoc este mtodo.

Mtodo main()
El mtodo main(), es el cerebro de cualquier aplicacin Java. Cuando se
ejecuta una aplicacin Java utilizando el intrprete Java, se debe
especificar el nombre de la clase que se desea ejecutar. El intrprete
entonces, invoca al mtodo main() definido dentro de esa clase, que debe
controlar el flujo del programa, pedir al sistema los recursos que
necesite y ejecutar cualquier otro mtodo necesario para completar la
funcionalidad de la aplicacin.

La definicin del mtodo main() debe estar precedida por tres


modificadores:
public indica que el mtodo main() puede ser llamado por
cualquier objeto
static indica que el mtodo main() es un mtodo esttico, es
decir, un mtodo propio de la clase
void indica que el mtodo main() no devolver ningn valor

El mtodo main() en Java es similar a la funcin main() de C y C++.


Cuando se ejecuta un programa escrito en C o C++, arranca llamando
en primer lugar a la funcin main(), que llamar a las dems funciones
necesarias en la ejecucin del programa. De forma similar, en el
lenguaje Java, cuando se ejecuta una clase con el intrprete Java, el
sistema comienza llamando al mtodo main() de la clase, que llamar a
los dems mtodos necesarios para completar la ejecucin de la
aplicacin. Si se intenta ejecutar una clase con el intrprete Java que
no contenga el mtodo main(), el intrprete generar un mensaje de
error.

Prof. Arn Herrera Ponte Pg. 17


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

El mtodo main() acepta como argumento un array de Strings:

public static void main( Strings args[ ] ) {

Este array de Strings es el mecanismo a travs del cual el sistema


puede pasar informacin a la aplicacin. Cada una de las cadenas
String es un argumento de lnea de comandos. Permiten pasar
informacin a la aplicacin, para variar su ejecucin, sin necesidad de
recompilarla.

Implementacin del Mtodo main(String args[ ])

Instanciar Objetos
Para instanciar un objeto el mtodo que se utiliza es "new". "New" crea
un objeto de la clase que le especifiquemos pero antes de esto se tiene
que declarar la variable que contendr ese nuevo objeto.

Ejm:

jclasPunto P = new jclsPunto();

Despus de ser instanciado un nuevo objeto P, el valor de los atributos


x , y en el objeto P ser igual a 0 y 0 respectivamente.

Prof. Arn Herrera Ponte Pg. 18


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Crear el Objeto P de la clase jclsPunto

Imprimir mensajes por consola


Para imprimir mensajes en la consola se utilizan llamadas al mtodo
println() de la clase System.

System.out.println( "Hola, mundo" );

Mostrar por consola el valor de los atributos del Objeto P

Prof. Arn Herrera Ponte Pg. 19


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Compilar un archivo Java en NetBeans IDE 5.0


Pasos:
1. El cursor del Mouse debe estar entre las lneas de cdigo.
2. Hacer clic en el men Build
3. Hacer clic en la opcin Compile <nombre_archivo>.java

O simplemente presione la tecla F9.

Prof. Arn Herrera Ponte Pg. 20


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Ejecutar un archivo Java en NetBeans IDE 5.0


Pasos:
1. El cursor del Mouse debe estar entre las lneas de cdigo.
2. Hacer clic en el men Run
3. Hacer clic en la opcin Run File >
4. Hacer clic en la opcin Run <nombre_archivo>.java Mayscula + F6

O simplemente presione la combinacin de teclas Shilft + F6

Prof. Arn Herrera Ponte Pg. 21


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Mtodos del tipo set y get.

set: Este tipo de mtodo se utiliza cuando se va a ingresar, asignar o


establecer valor a un atributo de la clase.
get: Este tipo de mtodo se utiliza cuando se va a obtener o retornar el
valor de un atributo de la clase.

Ejm: Mtodos de tipo set

public void setX(double x){


this.x = x;
}

public void setY(double y){


this.y = y;
}

Ejm: Mtodos de tipo get

public double getX(){


return this.x;
}

public double getY(){


return this.y;
}

Implementacin de los mtodos de tipo set y get.

Prof. Arn Herrera Ponte Pg. 22


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Ejercicios: En cada caso analizar el algoritmo e indicar los valores que


se muestran por consola.

1)

Prof. Arn Herrera Ponte Pg. 23


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

2)

3)

4)

5)

Prof. Arn Herrera Ponte Pg. 24


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Implementar el mtodo leerDato()

1) Debemos importa el paquete io

import java.io.*;

2) Escribimos el mtodo dentro de la clase

public String leerDato(){


String dato = "";

try{
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
dato = teclado.readLine();
}catch(Exception e){
System.out.println("Error");
}

return dato;
}

Implementar el mtodo convertirCademaReal(String cadena)

1) Escribimos el mtodo dentro de la clase

public double convertirCadenaReal(String cadena){


double numero= 999;

try{
numero = Double.parseDouble(cadena);
}catch(Exception e){
System.out.println("Error al momento de convertir a real");
}

return numero;
}

Implementar el mtodo convertirCademaReal(String cadena)

1) Escribimos el mtodo dentro de la clase

public void mostrar(String texto){


System.out.println(texto);
}

Prof. Arn Herrera Ponte Pg. 25


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Cdigo completo de la clase jclsPunto

package jpackGuia01;

import java.io.*;

public class jclsPunto {


private double x;
private double y;

public jclsPunto() {
x = y = 0;
}

public jclsPunto(double x, double y) {


this.x = x;
this.y = y;
}

public void setX(double x){


this.x = x;
}

public void setY(double y){


this.y = y;
}

public double getX(){


return this.x;
}

public double getY(){


return this.y;
}

public String leerDato(){


String dato = "";

try{
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
dato = teclado.readLine();
}catch(Exception e){
System.out.println("Error")
}

return dato;
}

public double convertirCadenaReal(String cadena){


double numero= 999;

try{
numero = Double.parseDouble(cadena);

Prof. Arn Herrera Ponte Pg. 26


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

}catch(Exception e){
System.out.println("Error al momento de convertir a real");
}

return numero;
}

public void mostrar(String texto){


System.out.println(texto);
}

public static void main(String args[]){


jclsPunto P = new jclsPunto();
double num;

do{
P.mostrar("Ingrese la Abcisa (x) = ");
num = P.convertirCadenaReal(P.leerDato());
}while(num == 999);

P.setX(num);

do{
P.mostrar("Ingrese la Ordenada (y) = ");
num = P.convertirCadenaReal(P.leerDato());
}while(num == 999);

P.setY(num);

P.mostrar("(x,y) = (" + P.getX() + " , " + P.getY() + ")");


}

Prof. Arn Herrera Ponte Pg. 27


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

NUNCA
NUNCA
NUNCA

NUNCA
NUNCA
TE RINDAS
.

Prof. Arn Herrera Ponte Pg. 28


Gua #2
Clases y Objetos

Arn Herrera Ponte


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Abrir el proyecto existente Proyecto01 que se fue creado en


NetBeans IDE 5.0
(Sino ha creado el proyecto, se recomienda revisar la Gua #1)
Pasos:
1. Hacer clic en el men File.
2. Hacer clic en la opcin Open Project

Aparece la ventana Open Project


Para nuestro caso vamos a abrir Proyecto01 que se encuentra en la
Unidad E de nuestro disco duro.
3. Hacer clic en la Unidad (E:)
4. Hacer clic en Proyecto01
5. Hacer clic en el botn Open Project Folder

Nota: Para seleccionar el proyecto, debemos buscar aquellas carpetas


que tengan un pequeo cuadrado amarillo en el borde inferior derecho.

Prof. Arn Herrera Ponte Pg. 2


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece el nombre de nuestro proyecto.

Crear el Paquete Java jpackGuia02 en NetBeans IDE 5.0


Pasos
1. Hacer clic en la pestaa File
2. Hacer clic doble clic en el nombre de nuestro proyecto

3. Hacer clic derecho en la carpeta SRC


4. Hacer clic en la opcin New
5. Hacer clic en la opcin Java Package

Prof. Arn Herrera Ponte Pg. 3


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece la ventana New Java Package


6. Escribir el nombre del paquete (Package Name) : jpackGuia02
7. Hacer clic en el botn Finish

Prof. Arn Herrera Ponte Pg. 4


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece el nombre del paquete creado jpackGuia02

Crear la Clase Java jclsEjmStatic dentro del paquete jpackGuia02


Pasos:
1. Hacer clic derecho en el paquete jpackGuia02
2. Hacer clic en la opcin New
3. Hacer clic en la opcin Java Class

Aparece la ventana New Java Class


4. Escribir el nombre de la clase (Class Name) : jclsEjmStatic
5. Hacer clic en el botn Finish

Prof. Arn Herrera Ponte Pg. 5


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Aparece en el lado derecho una pestaa con el nombre del archivo


creado jclsEjmStatic.java, esta pestaa muestra el cdigo de la clase
jclsEjmStatic escrito en el Lenguaje de Programacin Java.

Se recomienda borrar los comentarios que se generaron al momento de


crear la clase jclsEjmStatic.

Prof. Arn Herrera Ponte Pg. 6


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

VARIABLES Y METODOS ESTATICOS

En la POO podemos crear una clase en la que el valor de una variable de


instancia sea el mismo para todos los objetos instanciados a partir de esa
clase. Es decir, que exista una nica copia de la variable de instancia. Se
usar para ello la palabra clave static.

public class jclsEjmStatic {


private double contA;
private static double contB;

El valor de la variable contB ser el mismo para cualquier objeto instanciado


de la clase jclsEjmStatic. Siempre que un objeto instanciado de jclsEjmStatic
cambie la variable contB, sta cambiar para todos los objetos.

De la misma forma se puede declarar un mtodo como esttico, lo que evita


que el mtodo pueda acceder a las variables de instancia no estticas:

public class jclsEjmStatic {


private double contA;
private static double contB;

public static void setContB(double aContB) {


contB = aContB; //Esta lnea SI es correcta
contA = 100; //Esta lnea NO es correcta
}
}

La modificacin de la variable contA no funciona porque se est violando una


de las reglas de acceso al intentar acceder desde un mtodo esttico a una
variable no esttica.

Todas las clases que se derivan, cuando se declaran estticas, comparten la


misma pgina de variables; es decir, todos los objetos que se generen
comparten la misma zona de memoria. Las funciones estticas se usan para
acceder solamente a variables estticas.

public class jclsEjmStatic {


private double contA;
private static double contB;

public static void setContB(double aContB) {


this.contB = aContB; //Esta lnea NO es correcta
}

Prof. Arn Herrera Ponte Pg. 7


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Ejercicio 1: Implementar la clase jclsEjmStatic

package jpackGuia02;

public class jclsEjmStatic {


private double contA;
private static double contB;

// Mtodos constructores
public jclsEjmStatic() {
contA = contB = 0;
}

public jclsEjmStatic(double contA, double aContB) {


this.contA = contA;
contB = aContB;
}

public jclsEjmStatic(jclsEjmStatic objEjm) {


this.contA = objEjm.getContA();
contB = objEjm.getContB();
}

// Mtodos del tipo SET


public void setContA(double contA) {
this.contA = contA;
}

public static void setContB(double aContB) {


contB = aContB;
}

// Mtodos del tipo GET


public double getContA() {
return contA;
}

public static double getContB() {


return contB;
}

public void mostrar(String texto){


System.out.println(texto);
}

// Mtodo incrementar
public void incrementarAtributos(){
this.contA++;
contB++;
}

public static void main(String args[]){


jclsEjmStatic E = new jclsEjmStatic();
jclsEjmStatic F = new jclsEjmStatic(E);

E.mostrar("Valores iniciales:");
E.mostrar("[contA , contB] = [" + E.getContA() + " , " + E.getContB() + "]");
F.mostrar("[contA , contB] = [" + F.getContA() + " , " + F.getContB() + "]");

Prof. Arn Herrera Ponte Pg. 8


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

E.incrementarAtributos();

E.mostrar("Valores despues de incrementar el Objeto E:");


E.mostrar("[contA , contB] = [" + E.getContA() + " , " + E.getContB() + "]");
F.mostrar("[contA , contB] = [" + F.getContA() + " , " + F.getContB() + "]");

F.incrementarAtributos();

E.mostrar("Valores despues de incrementar el Objeto F:");


E.mostrar("[contA , contB] = [" + E.getContA() + " , " + E.getContB() + "]");
F.mostrar("[contA , contB] = [" + F.getContA() + " , " + F.getContB() + "]");
}
}

IMPORTANTE: Aunque se puede acceder a las variables y mtodos de clase a


travs de un objeto, est permitido y se recomienda utilizar mejor el nombre
de la clase.

Utilizamos
nombreClase.nombreVarClase;
nombreClase.nombreMetodoClase();

En lugar de
nombreObjeto.nombreVarClase;
nombreObjeto.nombreMetodoClase();

Ejercicio 2: Implementar la clase jclsEjmStatic

package jpackGuia02;

public class jclsEjmStatic {


private static double contA = 5;
private static double contB = 5;

// Mtodos constructores
public jclsEjmStatic() {
contA = contB = 0;
}

public jclsEjmStatic(double contA, double aContB) {


this.contA = contA;
contB = aContB;
}

public jclsEjmStatic(jclsEjmStatic objEjm) {


this.contA = objEjm.getContA();
contB = objEjm.getContB();
}

// Mtodos del tipo SET


public static void setContA(double aContA) {
contA = aContA;
}

Prof. Arn Herrera Ponte Pg. 9


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

public static void setContB(double aContB) {


contB = aContB;
}

// Mtodos del tipo GET


public static double getContA() {
return contA;
}

public static double getContB() {


return contB;
}

public static void mostrar(String texto){


System.out.println(texto);
}

// Mtodo incrementar
public static void incrementarAtributos(){
contA++;
contB++;
}

public static void main(String args[]){

jclsEjmStatic.mostrar("Valores iniciales:");
jclsEjmStatic.mostrar("[contA , contB] = [" + jclsEjmStatic.getContA() + " , " + jclsEjmStatic.getContB() + "]");
jclsEjmStatic.mostrar("[contA , contB] = [" + jclsEjmStatic.getContA() + " , " + jclsEjmStatic.getContB() + "]");

jclsEjmStatic.incrementarAtributos();

jclsEjmStatic.mostrar("Valores despues de incrementar el Objeto E:");


jclsEjmStatic.mostrar("[contA , contB] = [" + jclsEjmStatic.getContA() + " , " + jclsEjmStatic.getContB() + "]");
jclsEjmStatic.mostrar("[contA , contB] = [" + jclsEjmStatic.getContA() + " , " + jclsEjmStatic.getContB() + "]");

jclsEjmStatic.incrementarAtributos();

jclsEjmStatic.mostrar("Valores despues de incrementar el Objeto F:");


jclsEjmStatic.mostrar("[contA , contB] = [" + jclsEjmStatic.getContA() + " , " + jclsEjmStatic.getContB() + "]");
jclsEjmStatic.mostrar("[contA , contB] = [" + jclsEjmStatic.getContA() + " , " + jclsEjmStatic.getContB() + "]");

}
}

Prof. Arn Herrera Ponte Pg. 10


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Crear la Clase Java jclsEjmStatic dentro del paquete jpackGuia02

CONSTANTES

En Java, se utiliza la palabra clave final para indicar que una variable debe
comportarse como si fuese constante, esto significa que no se permite su
modificacin una vez que haya sido declarada e inicializada.

Como es una constante, se le ha de proporcionar un valor en el momento en


que se declare, por ejemplo:

package jpackGuia02;

public class jclsEjmFinal {


private final double PI = 3.14159;

public jclsEjmFinal() {
PI = 3.14159; //Esta lnea NO es correcta
}

Si se intenta modificar el valor de una variable final desde el cdigo de la


aplicacin, se generar un error de compilacin.

Si se usa la palabra clave final con una variable o clase esttica, se pueden
crear constantes de clase, haciendo de esto modo un uso altamente eficiente
de la memoria, porque no se necesitaran mltiples copias de las constantes.

La palabra clave final tambin se puede aplicar a mtodos, significando en


este caso que los mtodos no pueden ser sobrescritos.

Prof. Arn Herrera Ponte Pg. 11


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

RESUMEN

Palabra clave final


CLASE Se emplea para evitar que esta clase pueda ser derivada.

El atributo es una constante, en ese caso debe de tener


ATRIBUTO valor inicial obligatoriamente. Por convenio en java las
constantes se escriben en maysculas.

METODO El mtodo no puede ser sobrescrito en una clase derivada

Crear la Clase Java jclsEjmStatic dentro del paquete jpackGuia02

Ejercicio 3: Implementar la clase jclsEjmFinal

package jpackGuia02;

public class jclsEjmFinal {

public static void mostrar(String texto){


System.out.println(texto);
}

public static void main(String args[]){


jclsEjmFinal.mostrar("Valor de PI = " + Math.PI);
jclsEjmFinal.mostrar("Valor de E = " + Math.E);
jclsEjmFinal.mostrar("Valor absoluto de -5.2 = " + Math.abs(-5.2));
jclsEjmFinal.mostrar("Potencia, 3 elevado a 4 = "+Math.pow(3,4));
jclsEjmFinal.mostrar("Raiz cuadrada de 81 = "+Math.sqrt(81));
jclsEjmFinal.mostrar("Random = "+Math.random());
}
}

Prof. Arn Herrera Ponte Pg. 12


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Juego de la Tortuga

Descripcin:
Se tiene N jugadores sentados en una mesa circular, el determina el orden de
lanzamiento de cada jugador. El juego trata de tirar un dado, si se obtiene
como resultado el nmero 5 (por primera vez) se estara formando el cuerpo
de la tortuga, despus se busca obtener 4 nmeros UNOS (1) para formar las
4 patitas de la tortuga. Gana el juego aquel jugador que formo la tortuga.

Implementacin de la Clase jclsDado

package jpackGuia02;

public class jclsDado {


private static int numero;

public jclsDado() {
this.numero = 1;
}

public static int lanzarDado(){

do{
numero = (int)(Math.random() * 10);
}while(numero < 1 || numero > 6);

return numero;
}
}

Implementacin de la Clase jclsJugador

package jpackGuia02;

public class jclsJugador {


private String nombre;
private int contador;

public jclsJugador() {
setNombre("Juan Perez");
setContador(0);
}

public void setContador(int contador) {


this.contador = contador;
}

public void setNombre(String nombre) {

Prof. Arn Herrera Ponte Pg. 13


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

this.nombre = nombre;
}

public String getNombre() {


return nombre;
}

public int getContador() {


return contador;
}

public void incrementarContador(){


contador++;
}
}

Implementacin de la Clase jclsJuego

package jpackGuia02;

import java.io.*;

public class jclsJuego {


private jclsJugador J[];
private int cantJugadores;

public jclsJuego() {
cantJugadores = 0;
}

public void setDatosJugadores(){


String nombre = "nombre";

do{
mostrar("Ingrese la cantidad de Jugadores:");
cantJugadores = convertirCadenaEntero(leerDato().trim());
}while(cantJugadores == 999);

J = new jclsJugador[cantJugadores];

for(int i=0; i < cantJugadores; i++){


jclsJugador jugador = new jclsJugador();

do{
mostrar("Ingrese el nombre del Jugador #" + (i+1) + ":");
nombre = leerDato().trim();
}while(nombre.length() == 0);

Prof. Arn Herrera Ponte Pg. 14


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

jugador.setNombre(nombre);
J[i] = jugador;
}
}

public void iniciarJuego(){


int i = 0, avance, resultado;
int estado = 0;

while(estado == 0){

if(i < cantJugadores){


jclsJugador jugador = J[i];

avance = jugador.getContador();

resultado = jclsDado.lanzarDado();

mostrar("Lanzamiento del jugador - " + jugador.getNombre()


+ ": " + resultado);

if(avance == 0){
if(resultado == 5){
jugador.incrementarContador();
}
}

if(avance > 0 && avance < 5){


if(resultado == 1){
jugador.incrementarContador();
}
}

if(avance == 5){
mostrar("El jugador - " + jugador.getNombre() + " ha
GANADO el JUEGO");
estado = 1;
}

i++;
}else{
i = 0;
}
}

public static void mostrar(String texto){


System.out.println(texto);

Prof. Arn Herrera Ponte Pg. 15


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

public int getOpcionMenu(){


int opcion = 0;

do{
mostrar("****************************************");
mostrar("* JUEGO DE LA TORTUGA *");
mostrar("*______________________________________*");
mostrar("* Ingresar datos de Jugadores ____ [1] *");
mostrar("* Iniciar juego __________________ [2] *");
mostrar("* Salir del juego ________________ [3] *");
mostrar("****************************************");
mostrar("* Ingrese la opcin: ");

opcion = convertirCadenaEntero(leerDato().trim());
}while(opcion < 1 || opcion > 3);

return opcion;
}

public void pintarMenuOpciones(){


int opcion, A, B;

do{
opcion = getOpcionMenu();

switch(opcion){
case 1:
setDatosJugadores();
break;

case 2:
iniciarJuego();
break;
}

}while(opcion != 3);

public String leerDato(){


String dato = "dato";

try{
BufferedReader teclado = new BufferedReader(new
InputStreamReader(System.in));
dato = teclado.readLine();
}catch(Exception e){

Prof. Arn Herrera Ponte Pg. 16


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

mostrar("Error");
}

return dato;
}

public int convertirCadenaEntero(String cadena){


int numero = 999;

try{
numero = Integer.parseInt(cadena);
}catch(Exception e){
mostrar("Error al convertir a real");
}

return numero;
}

public static void main(String args[]){


jclsJuego juego = new jclsJuego();
juego.pintarMenuOpciones();
}
}

Resultado en consola:

****************************************
* JUEGO DE LA TORTUGA *
*______________________________________*
* Ingresar datos de Jugadores ____ [1] *
* Iniciar juego __________________ [2] *
* Salir del juego ________________ [3] *
****************************************
* Ingrese la opcin:
1
Ingrese la cantidad de Jugadores:
2
Ingrese el nombre del Jugador #1:
Juan Perez
Ingrese el nombre del Jugador #2:
Luis Flores
****************************************
* JUEGO DE LA TORTUGA *
*______________________________________*
* Ingresar datos de Jugadores ____ [1] *
* Iniciar juego __________________ [2] *
* Salir del juego ________________ [3] *

Prof. Arn Herrera Ponte Pg. 17


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

****************************************
* Ingrese la opcin:
2
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 1
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 5
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 1
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 1
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 1
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 5
Lanzamiento del jugador - Juan Perez: 4
Lanzamiento del jugador - Luis Flores: 5

Prof. Arn Herrera Ponte Pg. 18


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Lanzamiento del jugador - Juan Perez: 6


Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 4
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 4
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 5
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 5
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 2
Lanzamiento del jugador - Luis Flores: 4
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 5
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 6
Lanzamiento del jugador - Luis Flores: 2
Lanzamiento del jugador - Juan Perez: 3
Lanzamiento del jugador - Luis Flores: 3
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 6
Lanzamiento del jugador - Juan Perez: 1
Lanzamiento del jugador - Luis Flores: 5
Lanzamiento del jugador - Juan Perez: 4
El jugador - Juan Perez ha GANADO el JUEGO
****************************************
* JUEGO DE LA TORTUGA *
*______________________________________*
* Ingresar datos de Jugadores ____ [1] *
* Iniciar juego __________________ [2] *
* Salir del juego ________________ [3] *
****************************************

Prof. Arn Herrera Ponte Pg. 19


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

* Ingrese la opcin:
3

NUNCA
NUNCA
NUNCA

NUNCA
NUNCA
TE RINDAS
.

Prof. Arn Herrera Ponte Pg. 20


EJEMPLO DE DESARROLLO DE PROGRAMAS.

Ejemplo 1.

En una empresa que brinda mantenimiento a PCs se han


clasificado a las maquinas de acuerdo al numero de
desperfectos que estas presentan. Si la PC no tiene ninguna
falla es tipo A, si la PC tiene 3 fallas se le considera tipo B y si
la PC tiene ms de 3 fallas es tipo C.
Escribir un algoritmo para implementar este proceso, No se
sabe cuantas PCs se evaluaran en un da, el algoritmo debe
preguntar si se desea continuar y terminar el ingreso N.
Asimismo al finalizar se debe mostrar por pantalla las
estadsticas porcentuales correspondientes a la evaluacin de
ese da.

Ejemplo del reporte a mostrar:

TIPO TOTAL DE COMPUTADORAS


PORCENTAJE
A 33
52.33%
B 24
38.71%
C 5
8.06%

Anlisis Del Problema:


En este problema se utilizara el mtodo
LeeProcesaNumFallas() , el cual lee el numero de
fallas de cada computadora y simultneamente procesa
este dato, realiza la clasificacin correspondiente al
numero de fallas, calcula las estadsticas solicitadas y
finalmente muestra el mensaje correspondiente.

Asimismo se utiliza el mtodo MuestraEstadisticas().

Los contadores ContA, ContB y ContC deben ser


inicializados en cero.

Clase Solucin Del Problema:

Clase Inspector

Atributos:
NumFallas : entero
ContA : entero
ContB : entero
ContC : entero

Mtodos:
LeeProcesaNumFallas()
MuestraEstadisticas()

Implementacin en Pseudocodigo:
CLASE INSPECTOR
{ // Atributos
entero NumFallas
entero ContA
entero ContB
entero ConrC

//Mtodos
Inspector()
{
ContA = 0 , ContB = 0 , ContC = 0
}

LeeProcesoNumFallas( )
{ caracter Rpta =

Mientras (Rpta < > N y Rpta < > n)

Escribe (Ingrese el numero de fallas)


Leer ( NumFallas)
Si ( NumFallas = 0) ContA ContA
+ 1
Sino
Si ( NumFallas < = 3)
ContB ContB + 1
Sino
ContC ContC + 1
FinSi
FinSi
Escribe (Desea Continuar S/N?)
Leer (Rpta)
FinMientras
}

MuestraEstadisticas()
{ entero Total.
Total ContA + ContB + ContC
Escribir ( ESTADISTICAS
)
Escribir ( TIPO TOTAL DE
COMPUTADORAS PORCENTAJE )
Escribir (-------------------------------------------------
----------------------------------)
Escribir ( A , ContA , ContA * 100
/ Total )
Escribir ( B , ContB , ContB * 100
/ Total )
Escribir ( C , ContC , ContC * 100
/ Total )
}
}

Programa Principal:
Inspector Oscar <- nuevo Inspector()
Oscar. LeeProcesaNumFallas()
Oscar.MuestraEstadisticas()

Fin.
Ejemplo 2.

Una financiera tiene 3000 clientes, ha decidido premiar a su


staff de 30 vendedores. Escribir una solucin que permita,
saber quien es el ejecutivo con el mayor nmero de contratos
conseguidos pues recibir un Bono especial de $ 500 dlares
como premio.
Adems se otorgara otros premios al resto del personal segn
la siguiente tabla:

Numero de contratos conseguidos


Bono ($)
Mas de 100
200
Menos de 50 pero ms de 10
50
Menores de 100 y mayores o iguales a 50
100

Determinar el Monto total en dlares que desembolsara la


financiera en concepto de bonos.

Anlisis Del Problema:

En este problema se utilizara el mtodo


ProcesaDatos() , para leer el nombre de los
vendedores de la Financiera y el numero de contratos
que han colocado, determinando al ejecutivo que
obtendr el premio, tambin se procesara todos los
casos por los cuales la financiera otorgara por bonos,
obteniendo el total del importe en bonos.
Asimismo se utiliza el mtodo MuestraResultados().

Clase Solucin Del Problema:

Clase Financiera

Atributos:
NombreVG
NumeroCG
TotalBonos

Mtodos:
ProcesaDatos()
MuestraResultados()

Implementacin en Pseudocodigo:

CLASE Financiera
{ // Atributos
Cadena NombreVG
Entero NumerosCG
Real TotalBonos

//Mtodos
Financiera()
{
NumeroCG 0
TotalEnBonos 0

ProcesoDatos( )

{ cadena Nombre
Entero NumContrato
entero i
Para i desde 1 hasta 30
Escribe (Ingrese el nombre del vendedor: , i
)
Leer (Nombre)
Escribe (Ingrese nmero de contratos )
Leer ( NumContrato)
Si ( NumContratos > NumeroCG)
NumeroCG NumContratos
NombreVG Nombre
FinSi.
Si ( NumContratos > 10 y
NumContratos < 50 )
TotalBonos TotalBonos + 50
FinSi
Si ( NumContratos > = 50 y
NumContratos < 100 )
TotalBonos TotalBonos +
100
FinSi
Si ( NumContratos >= 100 )
TotalBonos TotalBonos +
200
FinSi
FinPara

MuestraResultados()
{
Escribir ( EL EJECUTIVO GANADOR ES :
, NombreVG )
Escribir (EL TOTAL DE CONTRAROS SON:
,NumeroCG )
Escribir (EL TOTAL A DESEMBOLSAR POR
LA FINANCIERA ES: )
Escribir ( TotalBonos )
}

} //Fin de la clase.

Programa Principal:
Financiera F nuevo Financiera ()
F.ProcesoDatos()
F.MuestraResultados()

Fin.
JERARQUIA DE CLASES, CLASES ABSTRACTAS, Public String muestra_nombre()`
POLIMORFISMO {return nombre}

public double TipoInteres()


En el diagrama se presenta la clase abstracta Ccuenta con las {return tipoDeInteres; }
subclases Clase CuentaAhorros y Clase CuentaCorriente.
public abstract void comisiones();
CLASE CCUENTA
public abstract double intereses();

public boolean ingreso(double cantidad)


{if (cantidad < 0) return false;
CLASE CLASE saldo += cantidad;
CUENTA AHORROS CUENTA CORRIENTE
return cantidad >= 0; }

public boolean retiro(double cantidad)


Clase Ccuenta.java {if ((saldo - cantidad)< 0) return false ;
saldo -= cantidad;
public abstract class Ccuenta return cantidad >=0; }
{//atributos }
private String nombre;
private String cuenta;
private double saldo; Clase Cuenta Ahorros.
private double tipoDeInteres;
import java.util.*;
//metodos public class CuentaAhorros extends Ccuenta
public Ccuenta(String n, String c, double s, double t) { private double cuotaMantenimiento;
{nombre = n; java.util.Calendar fecha = java.util.Calendar.getInstance();
cuenta = c; public CuentaAhorros(String c,String i, double r, int a)
saldo = s; { super(c,i,r,a); }
tipoDeInteres = t; public boolean asignarCuotaM(double c)
} { if (c < 0) return false;
cuotaMantenimiento = c;
public double estado() return c >= 0;
{return saldo; }
}
public String muestraFecha() }
{ String miFecha= fecha.get(java.util.Calendar.DATE) + "/" + }
fecha.get(java.util.Calendar.MONTH) + "/" + return miCuenta;
fecha.get(java.util.Calendar.YEAR);
//DATE devuelve el entero correspondiente al DIA
return miFecha; } Codigo del Bottom MuestraDatosCliente

public void comisiones() private void


{ //Se aplica mensualmente mantenimiento de la cuenta btnMuestraClienteActionPerformed(java.awt.event.ActionEvent evt)
//dia 1 de cada mes {
int fa = fecha.get(java.util.Calendar.DATE); //Del Frame obtener mediante cajas de texto nombre, cuenta, saldo y
if (fa == 1) retiro(cuotaMantenimiento); } tipodeInteres
//CuentaAhorros cliente01 = new
public double intereses() CuentaAhorros("nombre","cuenta",2.5,300);
{ int fa = fecha.get(java.util.Calendar.DATE); Ccuenta[] cc= new Ccuenta[4];
if (fa != 1) return 0.0; cc[0]= new CuentaAhorros("Miguelito","Ahorros",100,300);
double InteresesProducidos= 0.0; cc[1]= new CuentaAhorros("Gasto","Ahorros",1,20);
InteresesProducidos = estado() *TipoInteres()/1200.0; cc[2]= new CuentaAhorros("Raul","Ahorros",1000,300);
// ingresos(InteresesProducidos); cc[3]= new CuentaAhorros("Sarita","Ahorros",5000,300);
return InteresesProducidos; }
} // SE PRESENTA EL NOMBRE DEL CLIENTE QUE TIENE EL
MAYOR SALDO EN SU CUENTA.

Polimorfismo TA.setText(NOMBRE: + CuentaMayor(cc).muestra_nombre() +


SALDO: + String.valueOf(CuentaMayor(cc).estado()));
Se define el mtodo CuentaMayor del tipo Ccuenta,
que tiene como parmetros un vector de cuentas. EJERCICIOS:
1. Implementar la clase cuenta corriente.
Static Ccuenta CuentaMayor(Ccuenta[] cuentas){ 2. Declarar los objetos para esta clase y considerarlos en el
Ccuenta miCuenta=null; proceso de Cuenta Mayor.
double cuentaMayor=0.0; 3. Definir un procedimiento para ingresar los clientes y definir
for(int i=0; i<cuentas.length; i++) un men para dar a opcin de mostrar la informacin que
{ if(cuentas[i].estado()>cuentaMayor){ requiera.
cuentaMayor=cuentas[i].estado();
miCuenta=cuentas[i];
UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA
E.A.P. INGENIERIA DE SISTEMAS
(Semestre 2017-I)

PROYECTO DEL CURSO DE ALGORITMICA II

Objetivo: Desarrollar una aplicacin que presente los conocimientos adquiridos en el curso.
Considerar las siguientes indicaciones:

1. GRUPOS: SE COMPONE DE 5 INTEGRANTES.

2. TEMA: DEBE CONSIDERAR:


a. MINIMO 5 CLASES
b. CONSIDERAR ENCAPSULAMIENTO
c. RELACIONES ENTRE CLASES
d. HERENCIA
e. EXCEPCIONES
f. POLIMORFISMO
g. INTERFACES
h. CLASES ABSTRACTAS.
i. PERSISTENCIA

3. INFORMES:
FECHAS
5 Junio : Descripcin del tema a tratar. (aula)
12 Junio : Diagrama de clases inicial. (aula)
19 Junio : Programas iniciales (aula) (laboratorio)
26 Junio : Cdigo Java (aula) (laboratorio)
03 Julio : EXPOSICONES FINALES DEL PROYECTO.

4. INFORME DEL PROYECTO (presentar en digital):


CARATULA CON LOS INTEGRANTES
INTRODUCCION.
INDICE DE CONTENIDO
COMENTARIO DEL TEMA
DIAGRAMA DE CLASES
CODIGO JAVA: COMENTADO
CAPTURA DE PANTALLAS MS IMPORTANTES
CONCLUSIONES.
Gua #6
Clases y Objetos

Arn Herrera Ponte


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

CLASES ABSTRACTAS
Descripcin:
Una de las caractersticas ms tiles de cualquier lenguaje orientado a objetos es la
posibilidad de declarar clases que solamente definen los mtodos van a utilizar, sin tener
que implementar los mtodos. Esto es muy til cuando la implementacin es especfica para
cada usuario, pero todos los usuarios tienen que utilizar los mismos mtodos.

Un ejemplo de clase abstracta en Java es la clase Graphics:

public abstract class Graphics {



public abstract void drawLine( int x1,int y1,int x2,int y2 );
public abstract void drawOval( int x,int y,int width,int height );

}

Los mtodos se declaran en la clase Graphics, pero el cdigo que ejecutar el mtodo est en
otro sitio:

public class MiClase extends Graphics {

public void drawLine(int x1,int y1,int x2,int y2 ) {


//<cdigo para pintar lneas>
}
}

Cuando una clase contiene un mtodo abstracto tiene que declararse abstracta. No obstante,
no todos los mtodos de una clase abstracta tienen que ser abstractos. Las clases abstractas
no pueden tener mtodos privados (no se podran implementar) ni tampoco estticos. Una
clase abstracta tiene que derivarse obligatoriamente, no se puede hacer un new de una clase
abstracta.

Una clase abstracta no se puede instanciar pero si se puede heredar y las clases hijas sern
las encargadas de agregar la funcionalidad a los mtodos abstractos. Si no lo hacen as, las
clases hijas deben ser tambin abstractas.

Ejemplo:

import java.util.*;

abstract class Instrumento {

public abstract void tocar();

public abstract void afinar();

Prof. Arn Herrera Ponte Pg. 2


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

public String tipo() {


return "Instrumento";
}
}

class Guitarra extends Instrumento {

public void tocar() {


System.out.println("Guitarra.tocar()");
}

public String tipo() {


return "Guitarra";
}

public void afinar() {

}
}

class Piano extends Instrumento {

public void tocar() {


System.out.println("Piano.tocar()");
}

public String tipo() {


return "Piano";
}

public void afinar() {

}
}

class Saxofon extends Instrumento {

public void tocar() {


System.out.println("Saxofon.tocar()");
}

public String tipo() {


return "Saxofon";
}

public void afinar() {


}

Prof. Arn Herrera Ponte Pg. 3


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

// Un tipo de Guitarra
class Guzla extends Guitarra {

public void tocar() {


System.out.println("Guzla.tocar()");
}

public void afinar() {


System.out.println("Guzla.afinar()");
}
}

// Un tipo de Guitarra
class Ukelele extends Guitarra {

public void tocar() {


System.out.println("Ukelele.tocar()");
}

public String tipo() {


return "Ukelele";
}
}

public class Musica {


// No importa el tipo de Instrumento,
// seguir funcionando debido a Polimorfismo:

static void afinar(Instrumento i) {


i.tocar();
}

static void afinarTodo(Instrumento[] e) {

for(int i = 0; i < e.length; i++){


afinar(e[i]);
}
}

public static void main(String[] args) {


// Declarar un Arreglo SIN INSTANCIAS es valido en Clases Abstractas
Instrumento[] orquesta = new Instrumento[5];
// Generar una INSTANCIA de una la Clase Abstracta no es valido
// Instrumento nuevo = new Instrumento();
int i = 0;

Prof. Arn Herrera Ponte Pg. 4


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

// Up-casting al asignarse el Arreglo


orquesta[i++] = new Guitarra();
orquesta[i++] = new Piano();
orquesta[i++] = new Saxofon();
orquesta[i++] = new Guzla();
orquesta[i++] = new Ukelele();

afinarTodo(orquesta);
}
}

Clase Musica
La Clase anterior es idntica aquella definida en el ejemplo de Polimorfismo, sin embargo, la
Clase Base de Instrumento fue definida como abstract, algunos detalles de esta definicin:

Ntese que los mtodos definidos como abstract no contienen ningn tipo de cdigo
dentro de ellos, inclusive no declaran ni llaves ({ }).
Cuando es definido ms de un mtodo como abstract, es necesario que la Clase como tal
sea definida tambin como abstract.

La caracterstica de hacer una Clase/Mtodo abstract reside en que no puede ser generada
una instancia de la misma, este comportamiento se demuestra en el mtodo principal (main)

Aunque dentro del mtodo sea generado un Arreglo de esta Clase abstracta, recuerde que
un arreglo es nicamente un contenedor de Objetos, esto permite que sea generado sin
ningn error.
Dentro de comentarios se encuentra la generacin de una instancia del tipo Instrumento
la cual generara un error al ser compilada la Clase.

Prof. Arn Herrera Ponte Pg. 5


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Clase jclsFiguraGeometrica:

package jpackClases;

import java.awt.*;

abstract class jclsFiguraGeometrica {


protected String nombre;
protected Graphics2D g2;
protected Font fuente;

public jclsFiguraGeometrica() {
nombre = "Figura";
fuente = new Font("ARIAL",Font.BOLD,30);
}

abstract void dibujar(Graphics g);


}

Clase jclsCirculo:

package jpackClases;

import java.awt.*;
import java.awt.geom.*;

public class jclsCirculo extends jclsFiguraGeometrica{


private int x, y, ancho, alto;

public jclsCirculo(int x, int y, int ancho, int alto) {


nombre = "CIRCULO";
this.x = x;
this.y = y;
this.ancho = ancho;
this.alto = alto;
}

public void dibujar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
}

Prof. Arn Herrera Ponte Pg. 6


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Clase jclsRectangulo:

package jpackClases;

import java.awt.*;
import java.awt.geom.*;

public class jclsRectangulo extends jclsFiguraGeometrica{


private int x, y, ancho, alto;

public jclsRectangulo(int x, int y, int ancho, int alto) {


nombre = "RECTANGULO";
this.x = x;
this.y = y;
this.ancho = ancho;
this.alto = alto;
}

public void dibujar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.yellow);
g2.fill(new Rectangle2D.Double(x,y,ancho,alto));
g2.setColor(Color.red);
g2.draw(new Rectangle2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("RECTANGULO",x+50,y+50);
}
}

Clase jclsInicio:

package jpackGUI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class jclsInicio extends JFrame implements ActionListener{


private JMenuBar jmnubBarra;
private JMenu jmnuArchivo, jmnuPoligono;
private JMenuItem jmnuiIniciar, jmnuiCerrar, jmnuiSalir;
private JMenuItem jmnuiRect, jmnuiCir;
private JSeparator jsep1;
private JPanel jpanFondo, jpanLimpiar;
private jpanDibujo jpanDibu;

public jclsInicio() {
this.setTitle("Guia 6: Clases Abstracta");

Prof. Arn Herrera Ponte Pg. 7


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

this.setSize(600,400);
this.setLocation(100,50);
this.setVisible(true);
this.setIconImage(new ImageIcon("src\\jpackImagenes\\bandera.gif").getImage());
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

preparBarraMenu();
prepararPanelFondo();
prepararPanelLimpiar();
prepararPanelDibujo();
}

public void preparBarraMenu(){


jmnubBarra = new JMenuBar();

jmnuArchivo = new JMenu("Archivo");


jmnuPoligono = new JMenu("Poligono");

jmnuiIniciar = new JMenuItem("Iniciar sesin");


jmnuiCerrar = new JMenuItem("Cerrar sesin");
jmnuiSalir = new JMenuItem("Salir");

jmnuiRect = new JMenuItem("Rectngulo");


jmnuiCir = new JMenuItem("Crculo");

jmnuArchivo.setMnemonic('A');
jmnuPoligono.setMnemonic('P');

jmnubBarra.setBackground(Color.yellow);
jmnuArchivo.setForeground(Color.blue);
jmnuPoligono.setForeground(Color.blue);
jmnuiIniciar.setBackground(Color.yellow);
jmnuiIniciar.setForeground(Color.blue);
jmnuiCerrar.setBackground(Color.yellow);
jmnuiCerrar.setForeground(Color.red);
jmnuiSalir.setBackground(Color.white);
jmnuiSalir.setForeground(Color.black);
jmnuiRect.setBackground(Color.yellow);
jmnuiRect.setForeground(Color.blue);
jmnuiCir.setBackground(Color.yellow);
jmnuiCir.setForeground(Color.blue);

jmnuPoligono.setEnabled(false);
jmnuiCerrar.setEnabled(false);

jmnuiIniciar.addActionListener(this);
jmnuiCerrar.addActionListener(this);
jmnuiSalir.addActionListener(this);
jmnuiRect.addActionListener(this);
jmnuiCir.addActionListener(this);

jsep1 = new JSeparator();

jmnuArchivo.add(jmnuiIniciar);
Prof. Arn Herrera Ponte Pg. 8
Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

jmnuArchivo.add(jmnuiCerrar);
jmnuArchivo.add(jsep1);
jmnuArchivo.add(jmnuiSalir);

jmnuPoligono.add(jmnuiRect);
jmnuPoligono.add(jmnuiCir);

jmnubBarra.add(jmnuArchivo);
jmnubBarra.add(jmnuPoligono);

this.setJMenuBar(jmnubBarra);
}

public void prepararPanelFondo(){


jpanFondo = new JPanel();
jpanFondo.setLayout(new CardLayout());
jpanFondo.setBackground(Color.yellow);
jpanFondo.setBounds(0,0,600,400);

this.add(jpanFondo);
}

public void prepararPanelLimpiar(){


jpanLimpiar = new JPanel();
jpanLimpiar.setBackground(Color.white);

jpanFondo.add(jpanLimpiar,"Limpiar");
}

public void prepararPanelDibujo(){


jpanDibu = new jpanDibujo();
jpanFondo.add(jpanDibu,"Dibujo");
}

public void actionPerformed(ActionEvent e){

if(e.getSource()==jmnuiIniciar){
jmnuPoligono.setEnabled(true);
jmnuiIniciar.setEnabled(false);
jmnuiCerrar.setEnabled(true);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}

if(e.getSource()==jmnuiCerrar){
jmnuPoligono.setEnabled(false);
jmnuiIniciar.setEnabled(true);
jmnuiCerrar.setEnabled(false);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}

if(e.getSource()==jmnuiSalir){
System.exit(0);
}

Prof. Arn Herrera Ponte Pg. 9


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

if(e.getSource()==jmnuiRect){
jpanDibu.setNombre("RECTANGULO");
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiCir){
jpanDibu.setNombre("CIRCULO");
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
}

public static void main(String args[]){


jclsInicio I = new jclsInicio();
}
}

Clase jpanDibujo:

package jpackGUI;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

import jpackClases.*;

public class jpanDibujo extends JPanel{


private String nombre;

public jpanDibujo() {
setNombre("CIRCULO");
}

public void paint(Graphics g){


Graphics2D g2 = (Graphics2D)g;

if(nombre.equalsIgnoreCase("CIRCULO")){
jclsCirculo C = new jclsCirculo(50,50,250,250);
C.dibujar(g2);
}

if(nombre.equalsIgnoreCase("RECTANGULO")){
jclsRectangulo R = new jclsRectangulo(50,50,400,250);
R.dibujar(g2);
}
}

public String getNombre() {


return nombre;

Prof. Arn Herrera Ponte Pg. 10


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

public void setNombre(String nombre) {


this.nombre = nombre;
}
}

Prof. Arn Herrera Ponte Pg. 11


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Diagrama de rbol

Ejecutando el Programa
- El cursor del Mouse debe estar en el cdigo del programa.
- Presionar las teclas SHIFT + F9

Observamos el men Archivo en estado activo y Polgono en estado inactivo.

Prof. Arn Herrera Ponte Pg. 12


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Realizar los siguientes pasos para iniciar sesin y utilizar el programa:


- Hacer clic en el men Archivo.
- Hacer clic en la opcin Iniciar sesin.

Ahora observamos el men Polgono en estado activo.

Prof. Arn Herrera Ponte Pg. 13


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Si hacemos clic en el men Archivo observaremos la opcin Iniciar sesin en estado


inactivo.

Ahora hacemos clic en el men Polgono y observamos las opciones Rectngulo y Crculo.

Prof. Arn Herrera Ponte Pg. 14


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Hacer clic en la opcin Rectngulo y observamos el dibujo de un rectngulo que se muestra


en el Panel jpanDibu.

Hacer clic en la opcin Crculo y observamos el dibujo de un crculo que se muestra en el


Panel jpanDibu.

Prof. Arn Herrera Ponte Pg. 15


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

El fracaso no me sobrecoger nunca


si mi determinacin para alcanzar el xito
es lo suficientemente poderosa

Prof. Arn Herrera Ponte Pg. 16


Gua #7
Clases y Objetos

Arn Herrera Ponte


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

POLIMORFISMO
Descripcin:
Es la capacidad de tener mtodos con el mismo nombre y diferente implementacin.

Uno de los objetivos principales de las tcnicas OO es utilizar una y otra vez el mismo cdigo.
Sin embargo, algunas de las operaciones requieren adaptacin para resolver necesidades
particulares. Esta necesidad, se da generalmente entre superclases y subclases, donde una
subclase es una especializacin de su superclase, y puede requerir alcanzar los mismos
objetivos, pero con distintos mecanismos. Por ejemplo, una superclase Rectngulo podra
tener una operacin calculoArea() cuyo objetivo es calcular el rea del rectngulo, definida
como la multiplicacin de las longitudes de dos lados contiguos. A su vez, la clase Cuadrado
es una subclase de Rectngulo que tambin tiene una operacin calculoArea() cuyo objetivo
es calcular el rea del cuadrado, pero que est definida especialmente para los objetos del
tipo cuadrado como la multiplicacin de la longitud de uno de sus lados por si mismo. Este
fenmeno, polimorfismo, se aplica a una operacin que adopta varias formas de implantacin
segn el tipo de objeto, pero cumple siempre el mismo objetivo.

Una de las ventajas del polimorfismo es que se puede hacer una solicitud de una operacin
sin conocer el mtodo que debe ser llamado. Estos detalles de la implantacin quedan ocultos
para el usuario y la responsabilidad descansa en el mecanismo de seleccin de la
implantacin. Por ejemplo, al tratar de frenar un vehculo siempre se debe oprimir el pedal
del lado izquierdo y as el vehculo se detendr sin importar si los frenos son de tambor o de
aire.

Polimorfismo significa mltiples formas; en programacin orientada por objetos esto significa
que una operacin puede tener ms de un mtodo que la implementa. La propiedad de
polimorfismo permite que cuando se enva un mensaje a un objeto, slo se decida en tiempo
de ejecucin que mtodo se invoca. Este concepto se conoce como encadenamiento tardo. En
lenguajes tradicionales estructurados se hace el encadenamiento temprano, lo que significa
que el encadenador sabe resolver todos los llamados a rutinas en tiempo de
compilacin/encadenamiento.

El polimorfismo es una de las caractersticas ms poderosas de los lenguajes orientados a


objetos y es especialmente til en la implementacin de clases contenedoras (listas,
vectores, matrices, colas, etc.). Piense, por ejemplo, que una aplicacin para un banco, tiene
en una lista todas las cuentas (corrientes y de ahorros) y que mensualmente hay que calcular
los intereses de cada cuenta. Para calcularlos, basta recorrer la lista e invocar para cada
cuenta la operacin calcularInteres(). Cada objeto sabe, en tiempo de ejecucin, cul es el
mtodo indicado que debe aplicar.

Ejemplo 1: Aplicacin de Polimorfismo en Java.

import java.util.*;

class Instrumento {

public void tocar() {


System.out.println("Instrumento.tocar()");
}

Prof. Arn Herrera Ponte Pg. 2


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

public String tipo() {


return "Instrumento";
}

public void afinar() { }


}

class Guitarra extends Instrumento {

public void tocar() {


System.out.println("Guitarra.tocar()");
}

public String tipo() {


return "Guitarra";
}

public void afinar() { }


}

class Piano extends Instrumento {

public void tocar() {


System.out.println("Piano.tocar()");
}

public String tipo() {


return "Piano";
}

public void afinar() { }


}

class Saxofon extends Instrumento {

public void tocar() {


System.out.println("Saxofon.tocar()");
}

public String tipo() {


return "Saxofon";
}

public void afinar() { }


}

// Un tipo de Guitarra
class Guzla extends Guitarra {

public void tocar() {


System.out.println("Guzla.tocar()");
}

Prof. Arn Herrera Ponte Pg. 3


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

public void afinar() {


System.out.println("Guzla.afinar()");
}

// Un tipo de Guitarra
class Ukelele extends Guitarra {

public void tocar() {


System.out.println("Ukelele.tocar()");
}

public String tipo() {


return "Ukelele";
}
}

public class Musica {

// No importa el tipo de Instrumento,


// seguir funcionando debido a Polimorfismo:
static void afinar(Instrumento i) {
i.tocar();
}

static void afinarTodo(Instrumento[ ] e) {

for(int i = 0; i < e.length; i++)


afinar(e[i]);
}

public static void main(String[ ] args) {


Instrumento[ ] orquesta = new Instrumento[5];
int i = 0;
// Up-casting al asignarse el Arreglo
orquesta[i++] = new Guitarra();
orquesta[i++] = new Piano();
orquesta[i++] = new Saxofon();
orquesta[i++] = new Guzla();
orquesta[i++] = new Ukelele();
afinarTodo(orquesta);
}
}

Clase Musica
En el cdigo fuente de Musica.java son diseadas diversas Clases que demuestran el uso de
Polimorfismo:
Instrumento: Es utilizada como la Clase Base para el resto de Clases y en ella son definidos
tres mtodos: tocar, tipo y afinar.
Guitarra: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los mtodos de
sta.
Piano: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los mtodos de sta.

Prof. Arn Herrera Ponte Pg. 4


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Saxofon: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los mtodos de


sta.
Guzla: Hereda ("Inherit") de la Clase Guitarra y redefine ("Override") los mtodos de sta.
Ukelele: Hereda ("Inherit") de la Clase Guitarra y redefine ("Override") los mtodos de sta.

Las definiciones de la Clase principal Musica son descritas en los siguientes incisos:
El primer mtodo definido en esta Clase llamado afinar toma como valor de entrada una
referencia del tipo Instrumento, sobre la cual es invocado el mtodo tocar.
Un segundo mtodo nombrado afinarTodo toma como valor de inicia un arreglo de
Instrumento, el cual es procesado por un ciclo que a su vez manda llamar el mtodo afinar
con los respectivos valores del arreglo.
Dentro del mtodo principal se define lo siguiente:
Primeramente se genera un arreglo de Instrumento para 5 Objetos.
Se inicializa un entero i con un valor de cero.
A travs de la referencia orquesta son asignados distintos Objetos al arreglo, ntese
que aunque el arreglo es de tipo Instrumento es posible asignar los Objetos: Guitarra,
Piano, Saxofon, Guzla, Ukelele.
Finalmente se invoca el mtodo afinarTodo con la referencia que representa el arreglo
de Instrumento.

Al ser ejecutado este programa se obtienen los siguientes resultados:

Guitarra.tocar()
Piano.tocar()
Saxofon.tocar()
Guzla.tocar()
Ukelele.tocar()

Lo interesante de este resultado reside en la manera que fue realizada la invocacin de


mtodos, el mtodo que realiza las llamadas hacia las diversas clases es afinar dentro de la
Clase Musica, observe que este mtodo toma como valor inicial una referencia del tipo
Instrumento y se invoca el mtodo tocar.

Sin embargo, al ser invocado el mtodo tocar a pesar de ser a travs de una referencia
Instrumento es invocado el mtodo de Clase acordemente, esto es, se llama el mtodo de la
Clase especifica; lo anterior es una labor de Polimorfismo ya que ocurre el comportamiento
adecuado a pesar de realizarse las llamadas a travs de una clase general (Instrumento).

Ejemplo 2: Aplicacin de Polimorfismo en Java.

Clase jclsFiguraGeometrica

package jpackClases;

import java.awt.*;

abstract class jclsFiguraGeometrica{


protected String nombre;
protected Graphics2D g2;
protected Font fuente;

Prof. Arn Herrera Ponte Pg. 5


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

protected innt x, y, ancho, alto;

public jclsFiguraGeometrica() {
nombre = "Figura";
fuente = new Font("ARIAL",Font.BOLD,30);
}

abstract void dibujar(Graphics g);


}

Clase jclsCirculo

package jpackClases;

import java.awt.*;
import java.awt.geom.*;

public class jclsCirculo extends jclsFiguraGeometrica{

public jclsCirculo(int x, int y, int ancho, int alto) {


fuente = new Font("ARIAL",Font.BOLD,30);
this.x = x;
this.y = y;
this.ancho = ancho;
this.alto = alto;
}

public void dibujar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
}

Clase jclsRectangulo

package jpackClases;

import java.awt.*;
import java.awt.geom.*;

public class jclsRectangulo extends jclsFiguraGeometrica{

public jclsRectangulo(int x, int y, int ancho, int alto) {

Prof. Arn Herrera Ponte Pg. 6


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

fuente = new Font("ARIAL",Font.BOLD,30);


this.x = x;
this.y = y;
this.ancho = ancho;
this.alto = alto;
}

public void dibujar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.yellow);
g2.fill(new Rectangle2D.Double(x,y,ancho,alto));
g2.setColor(Color.red);
g2.draw(new Rectangle2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("RECTANGULO",x+50,y+50);
}
}

Clase jpanDibujo

package jpackClases;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class jpanDibujo extends JPanel{


private String nombre;
private jclsFiguraGeometrica figura;

public jpanDibujo() {
nombre = "CIRCULO";
}

public void setFigura(jclsFiguraGeometrica figura){


this.figura = figura;
}

public void paint(Graphics g){


figura.dibujar(g);
}
}

Clase jclsInicio

package jpackGUI;

Prof. Arn Herrera Ponte Pg. 7


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import jpackClases.jpanDibujo;

import jpackClases.*;

public class jclsInicio extends JFrame implements ActionListener{


private JMenuBar jmnubBarra;
private JMenu jmnuArchivo, jmnuPoligono;
private JMenuItem jmnuiIniciar, jmnuiCerrar, jmnuiSalir;
private JMenuItem jmnuiRect, jmnuiCir;
private JSeparator jsep1;
private JPanel jpanFondo, jpanLimpiar;
private jpanDibujo jpanDibu;

public jclsInicio() {
this.setTitle("Guia 7: Polimorfismo");
this.setSize(600,400);
this.setLocation(100,50);
this.setVisible(true);
this.setIconImage(new ImageIcon("src\\jpackImagenes\\bandera.gif").getImage());
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

preparBarraMenu();
prepararPanelFondo();
prepararPanelLimpiar();
prepararPanelDibujo();
}

public void preparBarraMenu(){


jmnubBarra = new JMenuBar();

jmnuArchivo = new JMenu("Archivo");


jmnuPoligono = new JMenu("Poligono");

jmnuiIniciar = new JMenuItem("Iniciar sesin");


jmnuiCerrar = new JMenuItem("Cerrar sesin");
jmnuiSalir = new JMenuItem("Salir");

jmnuiRect = new JMenuItem("Rectngulo");


jmnuiCir = new JMenuItem("Crculo");

jmnuArchivo.setMnemonic('A');
jmnuPoligono.setMnemonic('P');

jmnubBarra.setBackground(Color.yellow);
jmnuArchivo.setForeground(Color.blue);
jmnuPoligono.setForeground(Color.blue);
jmnuiIniciar.setBackground(Color.yellow);
jmnuiIniciar.setForeground(Color.blue);
jmnuiCerrar.setBackground(Color.yellow);
jmnuiCerrar.setForeground(Color.red);
jmnuiSalir.setBackground(Color.white);
Prof. Arn Herrera Ponte Pg. 8
Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

jmnuiSalir.setForeground(Color.black);
jmnuiRect.setBackground(Color.yellow);
jmnuiRect.setForeground(Color.blue);
jmnuiCir.setBackground(Color.yellow);
jmnuiCir.setForeground(Color.blue);

jmnuPoligono.setEnabled(false);
jmnuiCerrar.setEnabled(false);

jmnuiIniciar.addActionListener(this);
jmnuiCerrar.addActionListener(this);
jmnuiSalir.addActionListener(this);
jmnuiRect.addActionListener(this);
jmnuiCir.addActionListener(this);

jsep1 = new JSeparator();

jmnuArchivo.add(jmnuiIniciar);
jmnuArchivo.add(jmnuiCerrar);
jmnuArchivo.add(jsep1);
jmnuArchivo.add(jmnuiSalir);

jmnuPoligono.add(jmnuiRect);
jmnuPoligono.add(jmnuiCir);

jmnubBarra.add(jmnuArchivo);
jmnubBarra.add(jmnuPoligono);

this.setJMenuBar(jmnubBarra);
}

public void prepararPanelFondo(){


jpanFondo = new JPanel();
jpanFondo.setLayout(new CardLayout());
jpanFondo.setBackground(Color.yellow);
jpanFondo.setBounds(0,0,600,400);

this.add(jpanFondo);
}

public void prepararPanelLimpiar(){


jpanLimpiar = new JPanel();
jpanLimpiar.setBackground(Color.white);

jpanFondo.add(jpanLimpiar,"Limpiar");
}

public void prepararPanelDibujo(){


jpanDibu = new jpanDibujo();
jpanFondo.add(jpanDibu,"Dibujo");
}

public void actionPerformed(ActionEvent e){

Prof. Arn Herrera Ponte Pg. 9


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

if(e.getSource()==jmnuiIniciar){
jmnuPoligono.setEnabled(true);
jmnuiIniciar.setEnabled(false);
jmnuiCerrar.setEnabled(true);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}

if(e.getSource()==jmnuiCerrar){
jmnuPoligono.setEnabled(false);
jmnuiIniciar.setEnabled(true);
jmnuiCerrar.setEnabled(false);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}

if(e.getSource()==jmnuiSalir){
System.exit(0);
}

if(e.getSource()==jmnuiRect){
jclsRectangulo R = new jclsRectangulo(50,50,400,250);
jpanDibu.setFigura(R);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiCir){
jclsCirculo C = new jclsCirculo(50,50,250,250);
jpanDibu.setFigura(C);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
}

public static void main(String args[]){


jclsInicio I = new jclsInicio();
}
}

Ejemplo 3: Aplicacin de Polimorfismo en Java.

Interface Objeto

package jpackClases;

import java.awt.*;

public interface Objeto {

public void pintar(Graphics g);

Prof. Arn Herrera Ponte Pg. 10


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Clase Persona

package jpackClases;

import java.awt.*;

public class Persona implements Objeto{


protected String nombre;
protected Font fuente;

public Persona() {
nombre = "Persona";
fuente = new Font("ARIAL",Font.BOLD,30);
}

public void pintar(Graphics g){

public String getNombre() {


return nombre;
}

public void setNombre(String nombre) {


this.nombre = nombre;
}
}

Clase Cantante

package jpackClases;

import java.awt.*;

public class Cantante extends Persona{

public Cantante(String nombre) {


this.nombre = nombre;
}

public void pintar(Graphics g){


g.setFont(fuente);
g.setColor(Color.RED);
g.drawString(nombre,50,50);
}
}

Clase Futbolista

package jpackClases;

Prof. Arn Herrera Ponte Pg. 11


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

import java.awt.*;

public class Futbolista extends Persona {

public Futbolista(String nombre) {


this.nombre = nombre;
}

public void pintar(Graphics g){


g.setFont(fuente);
g.setColor(Color.BLUE);
g.drawString(nombre,50,50);
}
}

Clase Modelo

package jpackClases;

import java.awt.*;

public class Modelo extends Persona {

public Modelo(String nombre) {


this.nombre = nombre;
}

public void pintar(Graphics g){


g.setFont(fuente);
g.setColor(Color.PINK);
g.drawString(nombre,50,50);
}
}

Clase Tablista

package jpackClases;

import java.awt.*;

public class Tablista extends Persona {

public Tablista(String nombre) {


this.nombre = nombre;
}

public void pintar(Graphics g){


g.setFont(fuente);
g.setColor(Color.ORANGE);
g.drawString(nombre,50,50);
}

Prof. Arn Herrera Ponte Pg. 12


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

Clase Abstracta jclsFiguraGeometrica

package jpackClases;

import java.awt.*;

abstract class jclsFiguraGeometrica implements Objeto{


protecnted String nombre;
protected Graphics2D g2;
protected Font fuente;
protected int x, y, ancho, alto;

public jclsFiguraGeometrica() {
nombre = "Figura";
fuente = new Font("ARIAL",Font.BOLD,30);
}

abstract void dibujar(Graphics g);

public void pintar(Graphics g){

}
}

Clase jclsCirculo

package jpackClases;

import java.awt.*;
import java.awt.geom.*;

public class jclsCirculo extends jclsFiguraGeometrica implements Objeto{

public jclsCirculo(int x, int y, int ancho, int alto) {


fuente = new Font("ARIAL",Font.BOLD,30);
this.x = x;
this.y = y;
this.ancho = ancho;
this.alto = alto;
}

public void dibujar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));

Prof. Arn Herrera Ponte Pg. 13


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}

public void pintar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
}

Clase jclsRectangulo

package jpackClases;

import java.awt.*;
import java.awt.geom.*;

public class jclsRectangulo extends jclsFiguraGeometrica{

public jclsRectangulo(int x, int y, int ancho, int alto) {


fuente = new Font("ARIAL",Font.BnOLD,30);
this.x = x;
this.y = y;
this.ancho = ancho;
this.alto = alto;
}

public void dibujar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.yellow);
g2.fill(new Rectangle2D.Double(x,y,ancho,alto));
g2.setColor(Color.red);
g2.draw(new Rectangle2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("RECTANGULO",x+50,y+50);
}

public void pintar(Graphics g){


g2 = (Graphics2D)g;

g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);

Prof. Arn Herrera Ponte Pg. 14


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

g2.drawString("CIRCULO",x+55,y+50);
}
}

Clase jpanDibujo

package jpackClases;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class jpanDibujo extends JPanel{


private String nombre;
private Objeto objeto;

public jpanDibujo() {
nombre = "CIRCULO";
}

public void setObjeto(Objeto objeto){


this.objeto = objeto;
}

public void paint(Graphics g){


objeto.pintar(g);
}
}

Clase jclsInicio

package jpackGUI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import jpackClases.jpanDibujo;

import jpackClases.*;

public class jclsInicio extends JFrame implements ActionListener{


private JMenuBar jmnubBarra;
private JMenu jmnuArchivo, jmnuPoligono, jmnuPersona, jmnuH, jmnuM;
private JMenuItem jmnuiIniciar, jmnuiCerrar, jmnuiSalir;
private JMenuItem jmnuiRect, jmnuiCir, jmnuiH1, jmnuiH2, jmnuiM1, jmnuiM2;
private JSeparator jsep1;
private JPanel jpanFondo, jpanLimpiar;
private jpanDibujo jpanDibu;

public jclsInicio() {
this.setTitle("Guia 7: Polimorfismo");

Prof. Arn Herrera Ponte Pg. 15


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

this.setSize(600,400);
this.setLocation(100,50);
this.setVisible(true);
this.setIconImage(new ImageIcon("src\\jpackImagenes\\bandera.gif").getImage());
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

preparBarraMenu();
prepararPanelFondo();
prepararPanelLimpiar();
prepararPanelDibujo();
}

public void preparBarraMenu(){


jmnubBarra = new JMenuBar();

jmnuArchivo = new JMenu("Archivo");


jmnuPoligono = new JMenu("Poligono");

jmnuPersona = new JMenu("Persona");


jmnuH = new JMenu("Hombres");
jmnuM = new JMenu("Mujeres");

jmnuiIniciar = new JMenuItem("Iniciar sesin");


jmnuiCerrar = new JMenuItem("Cerrar sesin");
jmnuiSalir = new JMenuItem("Salir");

jmnuiRect = new JMenuItem("Rectngulo");


jmnuiCir = new JMenuItem("Crculo");

jmnuiH1 = new JMenunItem("Paolo Guerrero");


jmnuiH2 = new JMenuItem("Pedro Suarez");
jmnuiM1 = new JMenuItem("Maria Julia Mantilla");
jmnuiM2 = new JMenuItem("Sofia Mulanovich");

jmnuArchivo.setMnemonic('A');
jmnuPoligono.setMnemonic('o');
jmnuPersona.setMnemonic('e');

jmnubBarra.setBackground(Color.yellow);
jmnuArchivo.setForeground(Color.blue);
jmnuPoligono.setForeground(Color.blue);
jmnuPersona.setForeground(Color.blue);
jmnuiIniciar.setBackground(Color.yellow);
jmnuiIniciar.setForeground(Color.blue);
jmnuiCerrar.setBackground(Color.yellow);
jmnuiCerrar.setForeground(Color.red);
jmnuiSalir.setBackground(Color.white);
jmnuiSalir.setForeground(Color.black);
jmnuiRect.setBackground(Color.yellow);
jmnuiRect.setForeground(Color.blue);
jmnuiCir.setBackground(Color.yellow);
jmnuiCir.setForeground(Color.blue);
jmnuH.setForeground(Color.blue);
jmnuM.setForeground(Color.blue);
Prof. Arn Herrera Ponte Pg. 16
Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

jmnuiH1.setBackground(Color.yellow);
jmnuiH1.setForeground(Color.blue);
jmnuiH2.setBackground(Color.yellow);
jmnuiH2.setForeground(Color.blue);
jmnuiM1.setBackground(Color.yellow);
jmnuiM1.setForeground(Color.blue);
jmnuiM2.setBackground(Color.yellow);
jmnuiM2.setForeground(Color.blue);

jmnuPersona.setEnabled(false);
jmnuPoligono.setEnabled(false);
jmnuiCerrar.setEnabled(false);

jmnuiIniciar.addActionListener(this);
jmnuiCerrar.addActionListener(this);
jmnuiSalir.addActionListener(this);
jmnuiRect.addActionListener(this);
jmnuiCir.addActionListener(this);
jmnuiH1.addActionListener(this);
jmnuiH2.addActionListener(this);
jmnuiM1.addActionListener(this);
jmnuiM2.addActionListener(this);

jsep1 = new JSeparator();

jmnuArchivo.add(jmnuiIniciar);
jmnuArchivo.add(jmnuiCerrar);
jmnuArchivo.add(jsep1);
jmnuArchivo.add(jmnuiSalir);

jmnuPoligono.add(jmnuiRect);
jmnuPoligono.add(jmnuiCir);

jmnuPersona.add(jmnuH);
jmnuPersona.add(jmnuM);

jmnuH.add(jmnuiH1);
jmnuH.add(jmnuiH2);
jmnuM.add(jmnuiM1);
jmnuM.add(jmnuiM2);

jmnubBarra.add(jmnuArchivo);
jmnubBarra.add(jmnuPoligono);
jmnubBarra.add(jmnuPersona);

this.setJMenuBar(jmnubBarra);
}

public void prepararPanelFondo(){


jpanFondo = new JPanel();
jpanFondo.setLayout(new CardLayout());
jpanFondo.setBackground(Color.yellow);
jpanFondo.setBounds(0,0,600,400);

Prof. Arn Herrera Ponte Pg. 17


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

this.add(jpanFondo);
}

public void prepararPanelLimpiar(){


jpanLimpiar = new JPanel();
jpanLimpiar.setBackground(Color.white);

jpanFondo.add(jpanLimpiar,"Limpiar");
}

public void prepararPanelDibujo(){


jpanDibu = new jpanDibujo();
jpanFondo.add(jpanDibu,"Dibujo");
}

public void actionPerformed(ActionEvent e){

if(e.getSource()==jmnuiIniciar){
jmnuPersona.setEnabled(true);
jmnuPoligono.setEnabled(true);
jmnuiIniciar.setEnabled(false);
jmnuiCerrar.setEnabled(true);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}

if(e.getSource()==jmnuiCerrar){
jmnuPersona.setEnabled(false);
jmnuPoligono.setEnabled(false);
jmnuiIniciar.setEnabled(true);
jmnuiCerrar.setEnabled(false);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}

if(e.getSource()==jmnuiSalir){
System.exit(0);
}

if(e.getSource()==jmnuiRect){
jclsRectangulo R = new jclsRectangulo(50,50,400,250);
jpanDibu.setObjeto(R);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiCir){
jclsCirculo C = new jclsCirculo(50,50,250,250);
jpanDibu.setObjeto(C);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiH1){
Futbolista Futbol = new Futbolista("Paolo Guerrero");
jpanDibu.setObjeto(Futbol);
Prof. Arn Herrera Ponte Pg. 18
Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiH2){
Cantante Canta = new Cantante("Pedro Suarez Vertiz");
jpanDibu.setObjeto(Canta);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiM1){
Modelo Mode = new Modelo("Mara Julia Mantilla");
jpanDibu.setObjeto(Mode);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

if(e.getSource()==jmnuiM2){
Tablista Tabla = new Tablista("Sofa Mulanovich");
jpanDibu.setObjeto(Tabla);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}

public static void main(String args[]){


jclsInicio I = new jclsInicio();
}
}

Prof. Arn Herrera Ponte Pg. 19


Grupo de Estudios FENIX JAVA - Clases y Objetos
Aprendes, Creas e Innovas

El fracaso no me sobrecoger nunca


si mi determinacin para alcanzar el xito
es lo suficientemente poderosa

Prof. Arn Herrera Ponte Pg. 20


UNMSM - Algortmica II

Relaciones entre clases: herencia y realizacin


Hasta este punto conocemos varios tipos de relaciones:

La DEPENDENCIA, que indica que un objeto de una clase hace uso de


otro objeto de una clase, slo de forma momentnea. Se representa
en cdigo como un parmetro recibido por un mtodo o tambin por
un objeto que est siendo instanciado dentro de algn mtodo.

La ASOCIACIN, que indica que un objeto de una clase hace uso de


otro objeto de una clase, de forma ms permanente. Se representa en
cdigo como un atributo de una clase.

La AGREGACIN, que indica como un objeto de una clase es la


PARTE de otro objeto de una clase, conocida como el TODO,
adems si el TODO fuese destruido, las PARTES no sern
necesariamente destruidas. Al tratarse de un subtipo de la relacin de
ASOCIACIN se representa en cdigo como un atributo de una clase,
adems opcionalmente podemos agregarle los mtodos add, get y
remove para agregar, obtener y eliminar los objetos PARTE
respectivamente.

La COMPOSICIN, que es exactamente igual a la AGREGACIN, con la


diferencia de que al destruir el TODO necesariamente las PARTES
tambin son destruidas.

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Ahora para finalizar con el estudio de las relaciones en la POO, veremos la


HERENCIA y la REALIZACIN.

Relacin de HERENCIA

Definicin
La herencia es una propiedad de la POO que permite que las clases hereden
los atributos y los mtodos de otras clases.

Notacin
Se representa con una lnea slida, que va desde una clase (llamada "HIJA")
haca otra clase, con un tringulo al final (llamada "PADRE")

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Formas de lectura
"La clase A hereda de la clase B"
"La clase A es hija de la clase B"
"La clase B es padre de la clase A"

Forma de implementacin
En Java se logra por medio de la palabra reservada "extends" y otorgndoles
una visibilidad de protected a los atributos y mtodos.

Ejemplo
Imaginemos que estamos realizando un programa informtico para un
colegio y necesitamos crear las clases Alumno y Profesor, en UML
podemos hacer lo siguiente:

Alumno Profesor
nombres : String nombres : String
apellidos : String apellidos : String
edad : int edad : int
grado : int dni : String

Alumno() Profesor()
getNombres() : String getNombres() : String
setNombres(nombres : String) setNombres(nombres : String)
getApellidos() : String getApellidos() : String
setApellidos(apellidos : String) setApellidos(apellidos : String)
getEdad() : int getEdad() : int
setEdad(edad : int) setEdad(edad : int)
getGrado() : int getDni() : String
setGrado(grado : int) setDni(dni : String)

Vemos que hay varios atributos y mtodos que se repiten, con ellos podemos
crear una tercera clase llamada Persona:

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Persona
nombres : String
apellidos : String
edad : int

Persona()
getNombres() : String
setNombres(nombres : String)
getApellidos() : String
setApellidos(apellidos : String)
getEdad() : int
setEdad(edad : int)

Esta clase Persona rene los atributos y mtodos comunes a las clases
Alumno y Profesor. Por ltimo slo falta agregar la relacin de HERENCIA
entre las clases:

Persona
nombres : String
apellidos : String
edad : int

Persona()
getNombres() : String
setNombres(nombres : String)
getApellidos() : String
setApellidos(apellidos : String)
getEdad() : int
setEdad(edad : int)

Alumno Profesor
grado : int dni : String

Alumno() Profesor()
getGrado() : int getDni() : String
setGrado(grado : int) setDni(dni : String)

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

De esta manera hacemos que la clase ALUMNO herede todos los mtodos
y atributos de la clase PERSONA, lo mismo para la clase PROFESOR.

Ahora veamos la implementacin en Java:

Clase Persona.java
public class Persona{

protected String nombres;


protected String apellidos;
protected int edad;

public Persona(){

public String getNombres() {


return nombres;
}

public void setNombres(String nombres) {


this.nombres = nombres;
}

public String getApellidos() {


return apellidos;
}

public void setApellidos(String apellidos) {


this.apellidos = apellidos;
}

public int getEdad() {


return edad;
}

public void setEdad(int edad) {


this.edad = edad;
}

Clase Alumno.java
public class Alumno extends Persona{

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

private int grado;

public Alumno(){

public int getGrado() {


return grado;
}

public void setGrado(int grado) {


this.grado = grado;
}

Clase Profesor.java
public class Profesor extends Persona{

private String dni;

public Profesor(){

public String getDni() {


return dni;
}

public void setDni(String dni) {


this.dni = dni;
}

Para realizar la herencia en las clases Alumno y Profesor estamos usando


la palabra reservada extends seguido por el nombre de la clase de la cual
heredamos, en este caso Persona.

Tambin, en la clase padre Persona los atributos no tienen una visibilidad


de private, sino una de protected, de esta manera las clases hijas pueden
acceder a estos atributos, ya que si fueran private no podran usarlos.

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Podemos probar nuestras clases en el main:

Clase Programa.java
public class Programa{

public static void main(String[] args){

/*Creamos una alumno y un profesor*/


Alumno alumno = new Alumno();
Profesor profesor = new Profesor();

/*Les colocamos un nombre*/


alumno.setNombres("Juan Luis");
profesor.setNombres("Marco Aurelio");

/*Los mostramos en pantalla*/


System.out.println("Alumno: "+alumno.getNombres());
System.out.println("Profesor: "+profesor.getNombres());

/*Tambin es posible crear un objeto de la clase padre*/


Persona unaPersona = new Persona();
unaPersona.setNombres("Mark Twain");
System.out.println("Una persona: "+unaPersona.getNombres());

De esta manera podemos crear un alumno y un profesor para luego usar los
mtodos heredados desde la clase Persona. Tambin, si as lo quisiramos,
podemos crear un objeto de la clase Persona como si se tratase de una
clase cualquiera.

Los constructores en la herencia

A nuestro ejemplo anterior agregumosle un constructor ms a nuestras


clases, que reciba como parmetro el nombre:

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Clase Persona.java
public class Persona{

protected String nombres;


protected String apellidos;
protected int edad;

public Persona(){

public Persona(String nombres){


this.nombres = nombres;
}

public String getNombres() {


return nombres;
}

public void setNombres(String nombres) {


this.nombres = nombres;
}

public String getApellidos() {


return apellidos;
}

public void setApellidos(String apellidos) {


this.apellidos = apellidos;
}

public int getEdad() {


return edad;
}

public void setEdad(int edad) {


this.edad = edad;
}

Clase Alumno.java
public class Alumno extends Persona{

private int grado;

public Alumno(){

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

public Alumno(String nombres) {

public int getGrado() {


return grado;
}

public void setGrado(int grado) {


this.grado = grado;
}

Clase Profesor.java
public class Profesor extends Persona{

private String dni;

public Profesor(){

public Profesor(String nombres){

public String getDni() {


return dni;
}

public void setDni(String dni) {


this.dni = dni;
}

Y en nuestro main colocamos:

Clase Programa.java
public class Programa{

public static void main(String[] args){

/*Creamos una alumno y un profesor*/


Alumno alumno = new Alumno("Juan Luis");
Profesor profesor = new Profesor("Marco Aurelio");

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

/*Los mostramos en pantalla*/


System.out.println("Alumno: "+alumno.getNombres());
System.out.println("Profesor: "+profesor.getNombres());

Si ejecutamos todo esto, obtenemos como salida:

Salida:
Alumno: null
Profesor: null

Por qu obtuvimos este resultado?, pues porque los constructores que


estamos usando de Alumno y Profesor estn sin una implementacin:

Constructor de la clase Alumno


public Alumno(String nombres){

Constructor de la clase Profesor


public Profesor(String nombres){

Sin embargo el constructor de la clase padre Persona si tiene la


implementacin:

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Constructor de la clase Persona


public Persona(String nombres){
this.nombres = nombres;
}

Para hacer referencia al constructor de la clase padre a la clase hija debemos


de usar la palabra reservada super, que representa al constructor de la
clase padre, y dentro de ella enviarle los parmetros de construccin:

Constructor de la clase Alumno


public Alumno(String nombres){
super(nombres);
}

Constructor de la clase Profesor


public Profesor(String nombres){
super(nombres);
}

De esta manera estamos llamando al constructor de la clase padre desde la


clase hija.

Referenciando a clases hijas con las clases padre

Gracias a la herencia es posible referenciar a las clases hijas con las clases
padres. Veamos el siguiente cdigo en Java que hace uso de las clases
Alumno, Profesor y Persona vistos antes:

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Clase Programa.java
public class Programa{

public static void main(String[] args){

Persona persona = new Alumno();


persona.setNombres("Juan Pablo");

Alumno alumno = (Alumno) persona;


alumno.setGrado(3);

System.out.println("Nombre (desde persona): "+persona.getNombres());


System.out.println("Nombre (desde alumno): "+alumno.getNombres());
System.out.println("Grado: "+alumno.getGrado());

Vemos que una variable llamada persona que es del tipo Persona est
siendo instanciada como un tipo Alumno. Esto es posible porque la clase
padre de Alumno es Persona.

Sin embargo, slo podremos acceder a los atributos y mtodos de la clase


Persona desde la variable persona. Si quisiramos acceder a los atributos
y mtodos de la clase Alumno primero debemos de realizar un casting de
la variable persona para convertirla a una variable del tipo Alumno. Slo
as podemos acceder a los atributos y mtodos de la clase Alumno.

Hay que tener en cuenta que el casting que realicemos debe ser vlido. Por
ejemplo, lo siguiente producira un error:

Clase Programa.java
public class Programa{

public static void main(String[] args){

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Persona persona = new Alumno();


persona.setNombres("Juan Pablo");

Profesor profesor = (Profesor) persona;


profesor.setDni("12345678");

System.out.println("Nombre (desde persona): "+persona.getNombres());


System.out.println("Nombre (desde alumno): "+profesor.getNombres());
System.out.println("Grado: "+profesor.getDni());

El origen de error se debe a que la variable persona fue instanciada como


un objeto de la clase Alumno, y en el casting estamos convirtindola a una
variable del tipo Profesor. Esto es incorrecto, el casting debe realizarse al
tipo de dato con el que fue instanciado.

En todo caso, Java nos da una herramienta para averiguar la instancia con la
cual fue construido un objeto gracias a la palabra reservada instanceof:

Clase Programa.java
public class Programa{

public static void main(String[] args){

Persona persona = new Alumno();


persona.setNombres("Juan Pablo");

if(persona instanceof Alumno){


System.out.println("Se instanci como Alumno");
}else{
if(persona instanceof Profesor){
System.out.println("Se instanci como Profesor");
}
}

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Aqu estamos preguntado si la variable persona es una instancia de la clase


Alumno, o si la variable persona es una instancia de la clase Profesor

Jerarqua de herencia

Es posible formar jerarquas de herencia entre las clases. Por ejemplo, si


tenemos a la clase A, B y C podemos relacionarlas de la siguiente
manera:

A B C

En este caso C hereda de B, y a su vez B hereda de A, por lo tanto por


transitividad C hereda de A.

Herencia mltiple

En la vida real podemos encontrarnos con muchos escenarios en donde una


clase debe de heredar no slo de una, sino de varias clases, por ejemplo si
estamos modelando un vehculo anfibio que vaya tanto por tierra como agua
podemos crear el siguiente diagrama:

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

VehiculoTerrestre VehiculoAcuatico

VehiculoAnfibio

En este caso la clase VehiculoAnfibio hereda de VehiculoTerrestre y


VehiculoAcuatico.

Cmo podemos implementar esta herencia mltiple en Java?, la respuesta


es que no se puede. En Java no se permite la herencia mltiple, una clase
slo puede heredar a lo ms de otra clase, no de dos o ms.

De todas maneras aunque no sea posible implementar la herencia mltiple


en Java existen formas de emularla, pero antes de aprenderla debemos de
ver el ltimo tipo de relacin que estudiaremos: la REALIZACIN.

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Relacin de REALIZACIN

Definicin
La herencia es una relacin de la POO que permite definir el comportamiento
de una clase sin la necesidad de implementar los mtodos: define el qu,
no el cmo.

Notacin
Se representa con una lnea punteada, que va desde una clase haca una
interfaz, con un tringulo al final.

Interfaz

Clase

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Formas de lectura
"La clase A implementa la interfaz B"
"La interfaz B define la clase A"

Forma de implementacin
En Java definimos una interfaz por medio de la palabra reservada interface,
y la implementamos en una clase por medio de la palabra reservada
implements.

Ejemplo
Supongamos que una fbrica especializada en la fabricacin de calculadoras
nos contrata para desarrollar su software. La fbrica produce calculadoras de
dos tipos: comunes y cientficas. Tambin nos dicen que las calculadoras
comunes pueden sumar, restar, multiplicar y dividir, mientras que las
cientficas adems de esas operaciones pueden obtener el seno, el coseno y
la tangente. Por ltimo nos informan que las calculadoras cientficas al
tratarse de aparatos usados para clculos avanzados deben implementar los
algoritmos de clculos de la forma ms eficiente posible.

En este problema vemos claramente que hay dos tipos de calculadora,


adems se nos menciona que ambos comparten operaciones iguales pero
que tienen implementaciones diferentes (las calculadoras cientficas tienen
implementado un algoritmo de clculo ms eficiente). Este es el escenario
perfecto para el uso de interfaces.

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

Calculadora

sumar(a : double, b : double) : double


restar(a : double, b : double) : double
multiplicar(a : double, b : double) : double
dividir(a : double, b : double) : double

CalculadoraCientifica
CalculadoraComun
seno(a : double) : double
coseno(a : double) : double
tangente(a : double) : double

En este caso definimos los cuatro mtodos comunes en la interfaz, y


agregamos los mtodos propios a la calculadora cientfica.

Su implementacin en Java es como sigue:

Interfaz Calculadora.java
public interface Calculadora {

public double sumar(double a, double b);


public double restar(double a, double b);
public double multiplicar(double a, double b);
public double dividir(double a, double b);

Clase CalculadoraComun.java
public class CalculadoraComun implements Calculadora{

public double sumar(double a, double b) {


System.out.println("Algoritmo comn de suma");

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

return a+b;
}

public double restar(double a, double b) {


System.out.println("Algoritmo comn de resta");
return a-b;
}

public double multiplicar(double a, double b) {


System.out.println("Algoritmo comn de multiplicacin");
return a*b;
}

public double dividir(double a, double b) {


System.out.println("Algoritmo comn de divisin");
return a/b;
}

Clase CalculadoraCientifica.java
public class CalculadoraCientifica implements Calculadora{

/*Mtodos implementados*/

public double sumar(double a, double b) {


System.out.println("Algoritmo comn de suma");
return a+b;
}

public double restar(double a, double b) {


System.out.println("Algoritmo comn de resta");
return a-b;
}

public double multiplicar(double a, double b) {


System.out.println("Algoritmo comn de multiplicacin");
return a*b;
}

public double dividir(double a, double b) {


System.out.println("Algoritmo comn de divisin");
return a/b;
}

/*Mtodos propios*/

public double seno(double a){


return Math.sin(a);
}

public double coseno(double a){


return Math.cos(a);
}

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

public double tangente(double a){


return Math.tan(a);
}

Como se puede observar, hemos declarado la interfaz Calculadora gracias a


la palabra reservada interface, y hemos implementado esta interfaz en dos
clases diferentes, en donde cada una de ellas tiene su propia
implementacin.

Pero por qu no usamos la herencia?, pues porque con la herencia la


interfaz Calculadora hubiese tenido que ser no una interfaz, sino una clase
que ya implemente los mtodos, si hubiese sido as ambos tipos de
calculadora hubiesen tenido la misma implementacin y no se hubiese
podido implementar los mtodos optimizados para la calculadora cientfica.

Siempre debemos implementar los mtodos de las interfaces?


Cuando una clase implementa una interfaz necesariamente debe de
implementar todos los mtodos que la interfaz defina, incluso esta
implementacin puede ser vaca, pero todos deben de ser implementados.

Por ejemplo si tenemos la siguiente interfaz:

Interfaz Dibujante.java
public interface Dibujante {

public void dibujarCuadrado();


public void dibujarCirculo();
public void dibujarRectangulo();

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

public void dibujarFiguraHumana();

Clase DibujantePrincipiante.java
public class DibujantePrincipiante implements Dibujante{

public void dibujarCuadrado() {


System.out.println("Dibujando cuadrado");
}

public void dibujarCirculo() {


System.out.println("Dibujando circulo");
}

public void dibujarRectangulo() {


System.out.println("Dibujando rectangulo");
}

/*Este metodo tiene una implementacin vaca*/


public void dibujarFiguraHumana() {

Vemos claramente que la clase implementa los cuatro mtodos de la interfaz,


pero el mtodo dibujarFiguraHumana tiene una implementacin vaca.
Repetimos nuevamente: una clase debe implementar todos los mtodos de
la interfaz, y si se desea esa implementacin puede estar vaca.

Ahora nos podemos preguntar, qu es una interfaz?

Las interfaces
Una interfaz es una agrupacin de mtodos declarados ms no
implementados, que sirven para definir un conjunto de funcionalidades que
una clase debe implementar. Tambin debemos saber que los mtodos en

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

las interfaces siempre deben de tener una visibilidad del tipo public.
Recordar que una interfaz slo define el qu se hace, mas no el cmo se
hace.

Implementando mltiples interfaces a la vez


En Java es posible que una clase implemente ms de una interfaz a la vez. Por
ejemplo, imaginemos que tenemos el siguiente diagrama que representa a
personas que son expertas en natacin y artes marciales:

ExpertoEnNatacion
ExpertoEnArtesMarciales

nadarEstiloLibre()
darGolpeDePatada()
nadarEstiloEspalda()
darGolpeDeMano()
nadarEstiloBuceo()
darSaltoConPatada()
nadarEstiloMariposa()

Persona
nombre : String

caminar()
comer()
dormir()

En este caso tenemos que implementar en la clase Persona la interfaz


ExpertoEnNatacion y la interfaz ExpertoEnArtesMarciales. En Java la
implementacin la realizamos de la siguiente manera:

Interfaz ExpertoEnNatacion.java
public interface ExpertoEnNatacion {

public void nadarEstiloLibre();

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

public void nadarEstiloEspalda();


public void nadarEstiloBuceo();
public void nadarEstiloMariposa();

Interfaz ExpertoEnArtesMarciales.java
public interface ExpertoEnArtesMarciales {

public void darGolpeDePatada();


public void darGolpeDeMano();
public void darSaltoConPatada();

Clase Persona.java
public class Persona implements ExpertoEnNatacion, ExpertoEnArtesMarciales{

public void caminar(){


System.out.println("Caminando");
}

public void comer(){


System.out.println("Comiendo");
}

public void dormir(){


System.out.println("Durmiendo");
}

public void nadarEstiloLibre() {


System.out.println("Nadando estilo libre");
}

public void nadarEstiloEspalda() {


System.out.println("Nadando estilo espalda");
}

public void nadarEstiloBuceo() {


System.out.println("Nadando estilo buceo");
}

public void nadarEstiloMariposa() {


System.out.println("Nadando estilo mariposa");
}

public void darGolpeDePatada() {


System.out.println("Dando golpe de patada");
}

public void darGolpeDeMano() {

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

System.out.println("Dando golpe de mano");


}

public void darSaltoConPatada() {


System.out.println("Dando salto con patada");
}

Como vemos en este ejemplo es muy fcil implementar ms de una interfaz a


la vez, slo tenemos que separar la declaracin de qu interfaces vamos a
implementar por medio de comas.

Verificando la instancia que implementa la interfaz


Para entender esto usaremos las clases y la interfaz que definimos en el
ejemplo de las calculadoras. Creemos una clase llamada Programa:

Clase Programa.java
public class Programa {

public static void main(String[] args){


/*Definimos una variable del tipo de la interfaz*/
Calculadora calculadora = null;

/*Instanciamos la interfaz con alguna de las clases que la


implementa*/
calculadora = new CalculadoraComun();
//calculadora = new CalculadoraCientifica();

/*Verificamos a qu instancia pertenece*/


if(calculadora instanceof CalculadoraComun){
System.out.println("La calculadora se cre como una comn");
}else{
if(calculadora instanceof CalculadoraCientifica){
System.out.println("La calculadora se cre como una
cientfica");
}
}

/*Llamamos a un mtodo*/
System.out.println(calculadora.sumar(1, 2));
}

Prof. Alonso Ral Melgarejo Galvn


UNMSM - Algortmica II

De forma similar a la herencia, podemos declarar una variable del tipo de la


interfaz e instanciarla con un constructor de alguna de las clases que la
implemente. Tambin, para saber qu clase implement la variable de la
interfaz que usamos, utilizamos la palabra reservada instanceof

Emulando la herencia mltiple en Java


Ahora que conocemos las interfaces, podemos mostrar las dos formas en que
es posible emular la herencia mltiple.

La primera de ellas hace uso del concepto de jerarqua de herencia en la


cual una clase A hereda de una clase B, y esta a su vez hereda de la clase
C. De esta manera por transitividad la clase A hereda de C, con esto
logramos que A herede tanto de B como de C.

La otra forma de emular la herencia mltiple es usando las interfaces. Aqu


creamos tantas interfaces como necesitemos y definimos los mtodos en
ellas, luego hacemos que una clase las implemente. De esta forma simulamos
una herencia mltiple de mtodos sin implementacin.

Debemos recordar, estas son formas de emular la herencia mltiple en Java,


pero realmente no es herencia mltiple ya que no cumple con todas las
pautas necesarias para definirla como tal.

Prof. Alonso Ral Melgarejo Galvn


UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS
INGENIERIA DE SISTEMAS
PRACTICA DIRIGIDA DE ALGORITMICA II

TEMAS: OBJETOS Y ARREGLO DE OBJETOS

PREGUNTAS:

1. Qu se entiende por un TDA?


2. Un objeto es una variable?
3. Por qu se definen los arreglos de objetos?
4. Cmo se sabe si se necesita un arreglo de objetos?
5. Mencione los pasos para definir un arreglo de objetos.

DESARROLLAR:

EJERCICIO 1:
En un descentralizado de ftbol se presentan 12 equipos. Cada equipo pertenece a un club
y es dirigido por un director tcnico; adems el club tiene su presidente y un estadio donde
juega, y los puntos acumulados, presentar a los equipos en orden de sus puntos.

EJERCICIO 2:
Una empresa tiene unos 20 trabajadores, cada registra su cdigo, nombre, horas
trabajadas y cargo, segn el cargo se le paga, si es obrero 100 por hora, si es empleado el
doble y si es asesor el triple. Presentar en un reporte los datos de los trabajadores y su
sueldo.

EJERCICIO 3:
Gestin de unos cursos escolares.
Se considera una cantidad de 5 cursos con sus respectivos profesores, consideramos en
cada curso informacin referente a si esta activo o no, presentar los cursos que estn
activos y los que no lo estn, con sus datos.
UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA

ALGORITMICA II

PRACTICA DE HERENCIA

Profesora: Mg. Virginia Vera Pomalaza

1. Definir una clase base persona que contenga informacin de propsito general
comn a todas las personas (nombre, direccin, fecha de nacimiento, sexo, etc.).
Disear una jerarqua de clases que contemple las clases siguientes: estudiante,
empleado, estudiante _ empleado. Escribir un programa que lea la informacin
y cree una lista de personal a) general; b) estudiante; c)empleado; d) estudiante _
empleado.

2. Implementar una jerarqua LIBRERA que tenga varias clases. Considere una
librera que tenga colecciones de libros de literatura, humanidades, tecnologa,
etc.

3. Implementar una jerarqua EMPLEADO de cualquier tipo de empresa que le sea


familiar. La jerarqua debe tener al menos cuatro niveles, con herencia de
miembros dato y mtodos. Los mtodos deben poder calcular salarios, despidos,
promocin, dar de alta, jubilacin, etc. Los mtodos deben permitir tambin
calcular aumentos salriales y primas para Empleados de acuerdo con su
categora y productividad. La jerarqua de herencia debe poder ser utilizada para
proporcionar diferentes tipos de acceso a Empleados. Por ejemplo, el tipo de
acceso garantizado al publico general diferir del tipo de acceso proporcionado a
un supervisor de empleado, al departamento de nominas, o al Ministerio de
Hacienda. Utilice la herencia para distinguir entre al menos cuatro tipos
diferentes de acceso a la informacin de Empleado.

4. Implementar una clase Automvil dentro de una jerarqua de herencia mltiple.


Considere que, adems de ser un Vehculo, un automvil es tambin una
comodidad, un smbolo de estado social, un modo de transporte, etc. Automvil
debe tener al menos tres clases base al menos tres clases derivadas.

5. Escribir una clase FigGeometrica que represente figuras geomtricas tales como
punto, lnea, rectngulo, triangulo y similares. Debe proporcionar mtodos que
permitan dibujar, ampliar, mover y destruir tales objetos. La jerarqua debe
constar de varias clases.
UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS
INGENIERIA DE SISTEMAS
PRACTICA DIRIGIDA DE ALGORITMICA II
(Semestre 2017)

TEMAS: RELACIONES ENTRE CLASES

PREGUNTAS:

1. Por qu se definen relaciones entre clases?


2. Cmo se saben que clases se van a considerar en un diseo OO?
3. Cuntos tipos de relaciones entre clases existen?
4. Cul de estas relaciones establece la herencia entre clases?
5. Cul de ellas permite dividir un objeto en partes o subobjetos?
6. Por qu utilizar UML?
7. Presentar un ejemplo de cada tipo de relacin de clases utilizando UML

DESARROLLAR:

Para los siguientes ejercicios grafique las relaciones entre clases que se puedan presentar.

EJERCICIO 1:
Un empresario maneja una cartera de artistas (grupos o solistas) y desea realizar un sistema que le
permita visualizar las caractersticas de cada artista como nmero de integrantes, voz principal y
tarifa por hora. Adems, los artistas pueden pertenecer a alguna agremiacin. El empresario a su
vez cuenta con una oficina donde gestiona todas sus reuniones. El telfono celular rara vez deja de
usarlo y usualmente lleva a almorzar a sus mejores artistas a un exclusivo restaurante miraflorino.

EJERCICIO 2:
En una biblioteca.
Por cada libro existente en la biblioteca, el catalogo contiene el ttulo, el nombre del autor y el
numero de ISBN del libro. Puede haber varios ejemplares de un libro en la biblioteca. Cada
ejemplar de un libro tiene un nico nmero de acceso. Hay muchos lectores registrados que estn
asociados a la biblioteca, cada uno de los cuales tiene un nmero de tickets para prstamo. El
sistema registra el nombre y direccin de cada lector y el nmero de tickets que se han emitido. Los
lectores pueden solicitar libros en prstamo, uno por cada ticket que posean y el sistema mantiene
un registro de los libros que un lector tiene prestados, junto con la fecha en que se debe devolver el
libro

EJERCICIO 3:
Gestin de unos cursos escolares.
Las entidades implicadas son: calendario, curso, profesor y estudiante. Cada profesor tiene un
cdigo y un nombre y un comportamiento especifico. Cada alumno tambin tiene un cdigo y un
nombre y una promedio final. Los cursos tienen su nombre, un horario y los estudiantes del curso.
El calendario presenta los cursos posibles a ser implementados y el total de cursos.

Вам также может понравиться