Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice de tablas IV
1. Introducción 1
2. Clases y relaciones 3
2.1. Conceptos básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Interacción entre objetos . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Relaciones entre clases . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1. Asociación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.2. Agregación . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.3. Composición . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3.4. Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.5. Dependencia . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.6. Realización . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3. Herencia 15
3.1. Tipos de herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1.1. Herencia simple . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1.2. Herencia multi-nivel . . . . . . . . . . . . . . . . . . . . . . 16
3.1.3. Herencia jerárquica . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.4. Herencia múltiple . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2. Interfaces en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
i
ÍNDICE GENERAL
4. Encapsulamiento y ocultamiento 24
4.1. Encapsulamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1.1. Por medio de métodos . . . . . . . . . . . . . . . . . . . . . 24
4.1.2. Por medio de clases . . . . . . . . . . . . . . . . . . . . . . . 25
4.1.3. Por medio de paquetes . . . . . . . . . . . . . . . . . . . . . 26
4.2. Ocultamiento de información . . . . . . . . . . . . . . . . . . . . . . 27
5. Polimorfismo 30
5.1. Polimorfismo de Inclusión (o Subtipado) . . . . . . . . . . . . . . . 30
5.2. Polimorfismo Paramétrico . . . . . . . . . . . . . . . . . . . . . . . 32
5.3. Polimorfismo de Sobrecarga . . . . . . . . . . . . . . . . . . . . . . 35
5.3.1. Ejemplo: Sobrecarga de constructores . . . . . . . . . . . . . 36
5.3.2. Ejemplo: Sobrecarga de métodos . . . . . . . . . . . . . . . 37
Acrónimos 38
ii
Índice de figuras
iii
Índice de tablas
iv
Capı́tulo 1
Introducción
1
• Ocultamiento de Información: Junto al encapsulamiento, el ocultamiento
de información es fundamental para la seguridad y la robustez del código.
Mediante este principio, los detalles internos del funcionamiento de un objeto
se mantienen ocultos del exterior, exponiendo solo lo que es necesario para
su uso. Esto evita que el estado interno del objeto sea alterado de manera
inapropiada, preservando la integridad y la fiabilidad del programa.
Estas caracterı́sticas hacen que la POO sea especialmente adecuada para ma-
nejar proyectos de software grandes y complejos, facilitando su escalabilidad, man-
tenimiento y colaboración. Empresas y desarrolladores se inclinan hacia la POO
no solo para resolver problemas complejos de manera eficiente, sino también pa-
ra crear un código que sea intuitivo y alineado con la forma en que pensamos y
entendemos el mundo.
El presente documento se organiza de la siguiente forma:
2
Capı́tulo 2
Clases y relaciones
3
2.1. Conceptos básicos
Objeto
Un objeto no es más que un conjunto de variables (o datos) y métodos (o
funciones) relacionados entre sı́. Los objetos en programación se usan para
modelar objetos o entidades del mundo real. Un objeto es, por tanto, la
representación ver Figura 2.1 en un programa de un concepto.
Atributos
Métodos
4
Figura 2.2: Representación de un objeto persona
Ejercicio
Cómo representar los siguientes conceptos como objetos:
• Alumno
• Libro
Clase
Una clase (clase regular o clase concreta) es una plantilla que define las
variables y los métodos que son comunes para todos los objetos de un cierto
tipo. Un objeto particular se conoce como una instancia de una clase.
5
Figura 2.3: Representación de una clase Automóvil.
3 S t r i n g marca ;
4 S t r i n g modelo ;
5 int anio ;
6 Color c o l o r ;
7
6
17 S t r i n g getMarca ( ) {
18 r e t u r n marca ;
19 }
20 v o i d setModelo ( S t r i n g modelo ) {
21 t h i s . modelo=modelo ;
22 }
23 S t r i n g getModelo ( ) {
24 r e t u r n modelo ;
25 }
26 void setAnio ( i n t anio ) {
27 t h i s . a n i o=a n i o ;
28 }
29 S t r i n g getAnio ( ) {
30 return anio ;
31 }
32 void setColor ( i n t c o l o r ) {
33 t h i s . c o l o r=c o l o r ;
34 }
35 Color getColor ( ) {
36 return color ;
37 }
38 }
7
2.3. Relaciones entre clases
Las relaciones entre clases son fundamentales para modelar cómo diferentes
entidades interactúan o se asocian entre sı́. Estas relaciones son esenciales para la
creación de diseños de software robustos y mantenibles. Las principales relaciones
entre clases en POO son:
• Asociación: Esta relación implica que una clase conoce a otra y puede inter-
actuar con ella. Las asociaciones pueden ser unidireccionales (solo una clase
conoce a la otra) o bidireccionales (ambas clases se conocen mutuamente).
2.3.1. Asociación
La Figura 2.4 muestra un ejemplo de una relación de asociación entre las clases
Automovil y TarjetaCirculacion. La linea dado que no tiene sentido (flecha) se dice
8
que representa una relación bidireccional. Además, los números al extremos de la
linea representa la multiplicidad o cardinalidad de la relación, es decir, cuántos
objetos de un tipo están relacionados con cuántos del otro tipo. La implementación
de esta relación en Java se muestra en el Código 2.2.
Automovil TarjetaCirculacion
1
1
3 Automovil a u t o m o v i l ;
4
6 }
7
8 p u b l i c c l a s s Automovil {
9
10 TarjetaCirculacion tarjetaCirculacion ;
11
12 }
2.3.2. Agregación
La Figura 2.5 muestra un ejemplo de una relación de agregación entre las
clases Automovil y Motor. El rombo vacı́o representa la relación del contenedor
(Automovil) y su contenido (Motor). La implementación de esta relación en Java se
muestra en el Código 2.3. Es importante resaltar en este ejemplo que si se destruye
el Automovil el Motor no se destruye (se puede reutilizar).
9
Automovil Motor
1 p u b l i c c l a s s Motor {
2 // A t r i b u t o s y metodos d e l motor
3 }
4
5 p u b l i c c l a s s Automovil {
6 Motor motor ;
7
13 // Uso
14 Motor motor = new Motor ( ) ;
15 Automovil c o c h e = new Automovil ( motor ) ;
2.3.3. Composición
La Figura 2.6 muestra un ejemplo de una relación de composición entre las
clases Automovil y Motor. El rombo lleno representa la relación del contenedor
(Automovil) y su contenido (Motor). La implementación de esta relación en Java
se muestra en el Código 2.3. Es importante resaltar en este ejemplo que si se
destruye el Automovil el Motor también (no se puede reutilizar).
10
Automovil Motor
1 p u b l i c c l a s s Motor {
2 // A t r i b u t o s y metodos d e l motor
3 }
4
5 p u b l i c c l a s s Automovil {
6 Motor motor ;
7
8 Automovil ( ) {
9 t h i s . motor = new Motor ( ) ;
10 }
11 }
12
13 // Uso
14 Automovil c o c h e = new Automovil ( ) ;
2.3.4. Herencia
La Figura 2.7 muestra un ejemplo de una relación de herencia entre las clases
TransporteTerrestre y Automovil. El flecha representa la relación de la clase pa-
dre (TransporteTerrestre) y su clase hija (Automovil). La implementación de esta
relación en Java se muestra en el Código 2.5. .
11
TransporteTerrestre
Automovil
3 }
4 p u b l i c c l a s s Automovil extends TransporteTerrestre {
5
6 }
7 // Uso
8 Automovil c o c h e = new Automovil ( ) ;
2.3.5. Dependencia
La Figura 2.8 muestra un ejemplo de una relación de dependencia entre las
clase Automovil y la clase Conductor. La implementación de esta relación en Java
se muestra en el Código 2.6. .
Automovil Conductor
1 p u b l i c c l a s s Conductor {
2
12
3 }
4 p u b l i c c l a s s Automovil {
5 p u b l i c v o i d a s i g n a r C o n d u c t o r ( Conductor c o n d u c t o r ) {
6 // L o g i c a para a s i g n a r e l c o n d u c t o r a l a u t o m o v i l
7 }
8 }
9 // Uso
10 Automovil c o c h e = new Automovil ( ) ;
2.3.6. Realización
La Figura 2.9 muestra un ejemplo de una relación de realización entre las clase
Vehiculo y la clase Automovil. La implementación de esta relación en Java se
muestra en el Código 2.7.
Vehiculo
Automovil
1 public i n t e r f a c e Vehiculo {
2 void arrancar ( ) ;
3 void detener ( ) ;
4 void a c e l e r a r ( ) ;
5 }
6 p u b l i c c l a s s Automovil implements V e h i c u l o {
7
13
8 @Override
9 public void arrancar ( ) {
10 System . out . p r i n t l n ( ” El a u t o m o v i l e s t a a r r a n c a n d o . ” ) ;
11 }
12
13 @Override
14 public void detener ( ) {
15 System . out . p r i n t l n ( ” El a u t o m o v i l s e ha d e t e n i d o . ” ) ;
16 }
17
18 @Override
19 public void a c e l e r a r ( ) {
20 System . out . p r i n t l n ( ” El a u t o m o v i l e s t a a c e l e r a n d o . ” ) ;
21 }
22
14
Capı́tulo 3
Herencia
Herencia
La herencia es un principio fundamental de la Programación Orientada a
Objetos (POO) que permite a una clase (llamada subclase o clase hija)
heredar propiedades y métodos de otra clase (conocida como superclase o
clase padre).
La herencia permite definir una clase en términos de otra, lo cual hace más
fácil el mantenimiento y desarrollo de una aplicación. También proporciona una
oportunidad para la reutilización de código y con ellos tener un desarrollo más
rápido. Cuando un clase X hereda de otra clase Y, la clase X hereda todos sus
atributos y comportamiento. La clase X se conoce como clase hija o clase derivada
y la clase X como super clase o clase padre.
15
1. Simple (Figura 3.1a)
1 c l a s s Automovil {
2
3 }
4 c l a s s S e n t r a e x t e n d s Automovil {
5
6 }
16
1 c l a s s Automovil {
2
3 }
4
5 c l a s s Rio e x t e n d s Automovil {
6
7 }
8
9 c l a s s RioHatchback e x t e n d s Rio {
10
11 }
3 }
4
5 c l a s s Rio e x t e n d s Automovil {
6
7 }
8
9 c l a s s S e n t r a e x t e n d s Automovil {
10
11 }
17
3.1.4. Herencia múltiple
En esta herencia una clase hereda de 2 o más clases. En Java no es posible la
herencia múltiple debido a un problema de ambigüedad. Considere el ejemplo de
la Figura 3.2. La clase A hereda de la clase B y C sus comportamientos. ¿Cuál
método f hereda A?.
3 void r e g i s t r a r P a c i e n t e ( Paciente e ) ;
18
4 Paciente eliminarRegistro ( int expediente ) ;
5 void mostrarPacientes ( ) ;
6 int getTotalPacientes () ;
7 void citasEdad ( i n t i n i c i o , i n t f i n ) ;
8 void mostrarPorEspecialidad ( Especialidad e ) ;
9 v o i d mostrarAgrupacion ( ) ;
10 void modificarPaciente ( i n t expediente ) ;
11 }
1 p u b l i c c l a s s Pegaso implements C l i n i c a {
2
3 p u b l i c Pegaso ( ) {
4
5 }
6
7 @Override
8 public void r e g i s t r a r P a c i e n t e ( Paciente e ) {
9
10 }
11
12 i n t buscarPorExpediente ( i n t expediente ) {
13 r e t u r n −1;
14 }
15
16 @Override
17 public Paciente eliminarRegistro ( int expediente ) {
18 return null ;
19 }
20
21 @Override
22 public void mostrarPacientes ( ) {
23
19
24 }
25
26 @Override
27 public int getTotalPacientes () {
28 r e t u r n −1;
29 }
30
31 @Override
32 public void citasEdad ( i n t i n i c i o , i n t f i n ) {
33
34 }
35
36 @Override
37 public void mostrarPorEspecialidad ( Especialidad es ) {
38
39 }
40
41 @Override
42 p u b l i c v o i d mostrarAgrupacion ( ) {
43
44 }
45
46 @Override
47 public void modificarPaciente ( i n t expediente ) {
48
49 }
50
51 }
20
3.3. Clases abstractas
Clase abstracta
Una clase abstracta es un tipo de clase que no puede ser instanciada direc-
tamente, es decir, no se pueden crear objetos de ella de manera directa.
El principal propósito de una clase abstracta es servir como clase base para
otras clases. Las clases abstractas se utilizan para definir interfaces comunes y
funcionalidades parciales que pueden ser compartidas y extendidas por sus clases
derivadas.
En Java una clase abstracta es una clase que se declara como abstracta y puede,
o no, tener métodos abstractos. Las clases abstractas no pueden ser instanciadas,
pero se pueden crear instancias por medio de clases derivadas de ellas. Un método
abstracto es un método que se declara sin una implementación. El Código 3.6
muestra la definición de una clase abstracta en Java llamada Banco. Usando esta
clase se definen las clases HSBC y la clase Banorte. Al ser la clase Banco abstracta,
es posible crear instancias de HSBC y Banorte pero no de Banco.
El siguiente ejemplo muestra el uso de clases abstractas:
1 a b s t r a c t c l a s s Banco{
2 abstract int getTasaInteres () ;
3 }
4 c l a s s HSBC e x t e n d s Banco{
5 int getTasaInteres () {
6 return 7;
7 }
8 }
9 c l a s s Banorte e x t e n d s Banco{
10 int getTasaInteres () {
11 return 8;
12 }
13 }
14
15 c l a s s TestBanco {
21
16 p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
17 Banco b ;
18 b=new HSBC( ) ;
19 System . out . p r i n t l n ( ” Tasa de i n t e r e s : ”+b . g e t T a s a I n t e r e s ( )+” \%”
);
20 b=new Banorte ( ) ;
21 System . out . p r i n t l n ( ” Tasa de i n t e r e s : ”+b . g e t T a s a I n t e r e s ( )+” \%”
);
22 }
23 }
Otro ejemplo se muestra en los Códigos 3.7 y 3.8. Se define la clase abstracta
Persona y se crea la clase Paciente mediante una relación de herencia con Persona.
1 p u b l i c a b s t r a c t c l a s s Persona {
2
3 p r i v a t e S t r i n g nombre ;
4 private String genero ;
5
13 @Override
14 public String toString () {
15 r e t u r n ”Nombre=”+nombre+” : : Genero=”+g e n e r o ;
16 }
17
18 p u b l i c v o i d cambiarNombre ( S t r i n g nuevoNombre ) {
22
19 nombre = nuevoNombre ;
20 }
21 }
1 p u b l i c c l a s s Empleado e x t e n d s Persona {
2
3 p r i v a t e i n t numEmpleado ;
4
10 @Override
11 public void getTrabajo ( ) {
12 .
13 .
14 .
15 }
16
17 p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
18 .
19 .
20 .
21 .
22 }
23
24 }
Código 3.8: Clase Paciente que hereda de una clase abstracta Persona
23
Capı́tulo 4
Encapsulamiento y ocultamiento
4.1. Encapsulamiento
Encapsulamiento
El encapsulamiento es unos de los conceptos pilares en la programación
orientada a objetos. Se define como el proceso de agrupar o encerrar datos
y/o funciones para desempeñar acciones sobre estos como si fueran una solo
unidad ⇒ empaquetar información.
24
4.1.2. Por medio de clases
Las clases encapsulan atributos y comportamientos. El ejemplo del Código 4.1
muestra la clase Persona en Lenguaje Java, la cual encapsula los atributos nombre,
apellido y fnacimiento y encapsula los comportamientos getNombre, setNombre,
getApellido, setApellido, getFnacimiento y setFnacimiento.
1 c l a s s Persona {
2
3 S t r i n g nombre ;
4 String apellido ;
5 Fecha fnacimiento ;
6
7 Persona ( ) {
8 }
9 Persona ( S t r i n g nombre , S t r i n g a p e l l i d o , Fecha f n a c i m i e n t o ) {
10 t h i s . nombre = nombre ;
11 this . apellido = apellido ;
12 t h i s . f n a c i m i e n t o=f n a c i m i e n t o ;
13 }
14 S t r i n g getNombre ( ) {
15 r e t u r n nombre ;
16 }
17 v o i d setNombre ( S t r i n g nombre ) {
18 t h i s . nombre = nombre ;
19 }
20 String getApellido () {
21 return apellido ;
22 }
23 void s e t A p e l l i d o ( String a p e l l i d o ) {
24 this . apellido = apellido ;
25 }
26 Fecha g e t F n a c i m i e n t o ( ) {
27 return fnacimiento ;
25
28 }
29 v o i d s e t F n a c i m i e n t o ( Fecha f n a c i m i e n t o ) {
30 this . fnacimiento = fnacimiento ;
31 }
32 }
26
Figura 4.1: Paquetes en un proyecto.
27
Modificador Clase Paquete Sub-Clase Otro
public ✓ ✓ ✓ ✓
protected ✓ ✓ ✓
no modifier ✓ ✓
private ✓
El ejemplo del Código 4.2 se muestra un ejemplo en Java donde se aplican los
modificadores private en los atributos de la clase Persona, y el modificador public
en sus métodos. Lo anterior garantiza que los atributos solo puedan ser accedidos
únicamnete dentro de la clase y los métodos desde cualquier parte (desde la clase,
desde otra clase en el mismo paquete, o bien desde una clase en otro paquete.).
1
2 p u b l i c c l a s s Persona {
3
4 p r i v a t e S t r i n g nombre ;
5 private String apellido ;
28
6 p r i v a t e Fecha fnacimiento ;
7
8 p u b l i c Persona ( ) {
9 }
10 p u b l i c Persona ( S t r i n g nombre , S t r i n g a p e l l i d o , Fecha f n a c i m i e n t o ) {
11 t h i s . nombre = nombre ;
12 this . apellido = apellido ;
13 t h i s . f n a c i m i e n t o=f n a c i m i e n t o ;
14 }
15 p u b l i c S t r i n g getNombre ( ) {
16 r e t u r n nombre ;
17 }
18 p u b l i c v o i d setNombre ( S t r i n g nombre ) {
19 t h i s . nombre = nombre ;
20 }
21 public String getApellido () {
22 return apellido ;
23 }
24 public void s e t A p e l l i d o ( String a p e l l i d o ) {
25 this . apellido = apellido ;
26 }
27 p u b l i c Fecha g e t F n a c i m i e n t o ( ) {
28 return fnacimiento ;
29 }
30 p u b l i c v o i d s e t F n a c i m i e n t o ( Fecha f n a c i m i e n t o ) {
31 this . fnacimiento = fnacimiento ;
32 }
33 }
Código 4.2: Clase Persona en Java con modificadores private y public para definir
niveles de ocultamiento.
29
Capı́tulo 5
Polimorfismo
Polimorfismo
El polimorfismo en la Programación Orientada a Objetos (POO) es un con-
cepto fundamental que permite a los objetos de diferentes clases ser tratados
como objetos de una clase común.
30
tipo de la clase base. Este tipo de polimorfoismo se logra mediante la herencia.
Las clases derivadas extienden la clase base y pueden sobrescribir sus métodos.
En tiempo de ejecución, se invocan los métodos de la clase derivada, aunque la
referencia sea del tipo de la clase base.
En el Código 5.1 se tiene una clase base Persona y clases derivadas como
Alumno y Profesor. Si Persona tiene un método mostrarDetalles, las clases Profesor
y Alumno pueden sobrescribir este método para hacer mostrar detalles especı́ficos.
Una referencia de tipo Persona puede apuntar a un objeto Profesor o Alumno, y
mostrarDetalles invocará el método correspondiente al tipo real del objeto.
1 p u b l i c c l a s s Persona {
2 p r i v a t e S t r i n g nombre ;
3
4 p u b l i c Persona ( S t r i n g nombre ) {
5 t h i s . nombre = nombre ;
6 }
7
15 p u b l i c Alumno ( S t r i n g nombre , S t r i n g m a t r i c u l a ) {
16 s u p e r ( nombre ) ;
17 this . matricula = matricula ;
18 }
19
20 @Override
21 public void mostrarDetalles ( ) {
22 super . mostrarDetalles () ;
23 System . out . p r i n t l n ( ” M a t r i c u l a : ” + m a t r i c u l a ) ;
31
24 }
25 }
26
27 p u b l i c c l a s s P r o f e s o r e x t e n d s Persona {
28 p r i v a t e i n t numEmpleado ;
29
30 p u b l i c P r o f e s o r ( S t r i n g nombre , i n t numEmpleado ) {
31 s u p e r ( nombre ) ;
32 t h i s . numEmpleado =numEmpleado ;
33 }
34
35 @Override
36 public void mostrarDetalles ( ) {
37 super . mostrarDetalles () ;
38 System . out . p r i n t l n ( ”Num. Empleado : ” + numEmpleado ) ;
39 }
40 }
32
dato que realmente le pasaremos a la clase (o método). Para especificar los tipos
genéricos se utilizan los operados diamante, es decir, el tipo se encierra entre los
operadores mayor y menor que (Código 5.2, lı́nea 1).
1 c l a s s C l a s e G e n e r i c a <T> {
2 T obj ;
3
4 p u b l i c C l a s e G e n e r i c a (T o ) {
5 obj = o ;
6 }
7
13 p u b l i c c l a s s App {
14 p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
15 // Creamos una i n s t a n c i a de C l a s e G e n e r i c a para I n t e g e r .
16 C l a s e G e n e r i c a <I n t e g e r > i n t O b j = new C l a s e G e n e r i c a <I n t e g e r >(88) ;
17 intObj . classType ( ) ;
18
23 }
24 }
El tipo de T es java.lang.Integer
El tipo de T es java.lang.String
33
Hay que tener en cuenta que los genéricos de java solo funcionan con objetos.
Existen una serie de convenciones para nombrar a los genéricos:
El Código 5.3 muestra un ejemplo del uso de tipos genéricos mediante la defi-
nición de un almacén. El almacén puede contener cualquier tipo que se especifique
mediante en los operadores diamante.
1 p u b l i c c l a s s Almacen<E> {
2
3 p u b l i c s t a t i c f i n a l i n t CAPACIDAD=5;
4 p r i v a t e Object [ ] bodega= new Object [CAPACIDAD ] ;
5 p r i v a t e i n t i n d e x =0;
6
7 v o i d a g r e g a r (E e ) {
8 i f ( index<CAPACIDAD) {
9 bodega [ i n d e x ]= e ;
10 i n d e x++;
11 }
12 }
13 @Override
14 public String toString () {
15 S t r i n g tmp=” ” ;
16 int i ;
17 f o r ( i =0; i <i n d e x ; i ++)
18 tmp = tmp +bodega [ i ] ;
34
19 r e t u r n tmp ;
20
21 }
22 }
23 public class Principal {
24
25 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
26 Almacen<Automovil> b1 = new Almacen<Automovil >() ;
27
36 System . out . p r i n t l n ( b1 ) ;
37 System . out . p r i n t l n ( b2 ) ;
38 }
39
40 }
35
de los parámetros. Es una forma de polimorfismo que se resuelve en tiempo de
compilación.
En Java podemos encontrar la sobrecarga en:
• Constructores
• Métodos
2 p u b l i c c l a s s Fecha {
3 private int dia ;
4 p r i v a t e i n t mes ;
5 private int anio ;
6
14 String delimitador = ” [ / ] ” ;
15 String [ ] tokens = fecha . s p l i t ( delimitador ) ;
16
17 d i a=I n t e g e r . p a r s e I n t ( t o k e n s [ 0 ] ) ;
18 mes=I n t e g e r . p a r s e I n t ( t o k e n s [ 1 ] ) ;
19 a n i o=I n t e g e r . p a r s e I n t ( t o k e n s [ 2 ] ) ;
20
21 }
22 @Override
23 public String toString () {
36
24 r e t u r n ” Fecha [ d i a=” + d i a + ” , mes=” + mes + ” , a n i o=” + a n i o +
”]”;
25 }
26 }
1 public c l a s s Calculadora {
2
3 i n t sumar ( i n t a , i n t b ) {
4 r e t u r n a+b ;
5 }
6 d o u b l e sumar ( d o u b l e a , d o u b l e b ) {
7 r e t u r n a+b ;
8 }
9 int restar ( int a , int b) {
10 r e t u r n a−b ;
11 }
12 double r e s t a r ( double a , double b) {
13 r e t u r n a−b ;
14 }
15 int multiplicar ( int a , int b) {
16 r e t u r n a∗b ;
17 }
18 double m u l t i p l i c a r ( double a , double b) {
19 r e t u r n a∗b ;
20 }
21 }
37
Acrónimos
GG Gramática de Grafos.
38
Acrónimos
39