Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A OBJETOS
CON C++, JAVA Y RUBY
Notas de clase
C++
Elaborado por:
Carlos Alberto Fernndez y Fernndez
Instituto de Electrnica y Computacin
Universidad Tecnolgica de la Mixteca
Primavera 2008
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 2 -
Contenido
Eclipse ................................................................................................................ 12
Caractersticas de C++...................................................................................... 15
Comentarios en C++........................................................................................ 15
Flujo de entrada/salida..................................................................................... 15
Funciones en lnea............................................................................................ 16
Declaraciones de variables............................................................................... 18
Operador de resolucin de alcance .................................................................. 19
Valores por Default .......................................................................................... 21
Parmetros por referencia................................................................................ 23
Variables de referencia...................................................................................24
Asignacin de memoria en C++....................................................................... 26
Plantillas .......................................................................................................... 30
Introduccin a la programacin orientada a objetos [2, 3] ............................ 34
Programacin no estructurada......................................................................... 34
Programacin procedural ................................................................................ 34
Programacin modular..................................................................................... 35
Datos y Operaciones separados ....................................................................... 36
Programacin orientada a objetos ................................................................... 37
Tipos de Datos Abstractos ................................................................................ 38
Los Problemas................................................................................................38
Tipos de Datos Abstractos y Orientacin a Objetos.......................................39
Conceptos de bsicos de objetos....................................................................... 40
Lenguajes de programacin orientada a objetos .............................................. 43
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 3 -
C.....................................................................................................................44
Introduccin a Java........................................................................................... 46
Origen............................................................................................................... 46
Caractersticas de diseo.................................................................................. 47
Simple y familiar............................................................................................47
Orientado a Objetos........................................................................................48
Independiente de la plataforma.......................................................................48
Portable..........................................................................................................49
Robusto..........................................................................................................49
Diferencias entre Java y C++ .......................................................................... 51
Archivos .java y .class ...................................................................................... 53
Programas generados con java ........................................................................ 53
El Java Developers Kit .................................................................................... 54
Compilacin...................................................................................................54
Hola Mundo ................................................................................................. 56
Hola mundo bsico en J ava............................................................................56
Hola mundo bsico en C++............................................................................57
Hola mundo en un J ava Applet.......................................................................57
Archivo HTML ..............................................................................................59
Ejecucin........................................................................................................59
Hola mundo en Eclipse...................................................................................60
Fundamentos del Lenguaje Java...................................................................... 61
Comentarios ..................................................................................................... 61
Tipos de datos................................................................................................... 62
Tipos de datos simples...................................................................................63
Referencias a objetos......................................................................................64
Identificadores.................................................................................................. 64
Variables .......................................................................................................... 65
mbito de una variable. .................................................................................66
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 4 -
Operadores ....................................................................................................... 69
Operadores aritmticos:..................................................................................69
Operadores relacionales: ................................................................................71
Operadores lgicos:........................................................................................72
Operadores de bits:.........................................................................................73
Operadores de asignacin:..............................................................................74
Precedencia de operadores en J ava.................................................................74
Valores literales................................................................................................ 75
Literales lgicos.............................................................................................75
Literales de tipo entero...................................................................................76
Literales de tipo real .......................................................................................76
Literales de tipo carcter ................................................................................77
Literales de tipo String...................................................................................78
Estructuras de control ...................................................................................... 79
Estructuras condicionales...............................................................................79
Ciclos. ............................................................................................................83
Saltos..............................................................................................................87
Arreglos ............................................................................................................ 88
Enumeraciones ................................................................................................. 92
Introduccin a Ruby ......................................................................................... 94
Caractersticas ................................................................................................. 94
Comparado con C...........................................................................................95
Comparado con C++......................................................................................96
Comparado con J ava......................................................................................97
Herramientas.................................................................................................... 98
Ruby: Fundamentos del lenguaje..................................................................... 99
Convenciones lxicas........................................................................................ 99
Literales.......................................................................................................... 100
Variables ........................................................................................................ 101
Operadores ..................................................................................................... 103
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 5 -
Arreglos .......................................................................................................... 106
Probando Ruby............................................................................................... 109
Estructuras de control .................................................................................... 110
Entrada y Salida bsica en Ruby .................................................................... 118
Abstraccin de datos: Clases y objetos .......................................................... 119
Clases ............................................................................................................. 119
Objetos e instancias........................................................................................ 120
Instanciacin................................................................................................120
Clases en C++................................................................................................ 121
Miembros de una clase en C++...................................................................... 122
Atributos miembro.......................................................................................122
Mtodos miembro........................................................................................122
Un vistazo al acceso a miembros..................................................................124
Objetos de clase en C++................................................................................ 126
Clases en Java ................................................................................................ 129
Miembros de una clase en Java ...................................................................... 130
Atributos miembro.......................................................................................130
Mtodos miembro........................................................................................131
Un vistazo al acceso a miembros..................................................................131
Objetos de clase en Java................................................................................. 132
Asignacin de memoria al objeto.................................................................132
Clases en Ruby ............................................................................................... 136
Miembros de una clase en Ruby ..................................................................... 136
Mtodos miembro........................................................................................137
Un vistazo al acceso a mtodos....................................................................138
Atributos miembro.......................................................................................139
Objetos de clase en Ruby................................................................................ 140
Asignacin de memoria al objeto.................................................................140
Alcance de Clase en C++............................................................................... 144
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 6 -
Alcance de Clase en Java ............................................................................... 144
Alcance de Clase en Ruby............................................................................... 145
Usando la palabra reservada this en C++ y Java .......................................... 146
Usando la palabra reservada self en Ruby ..................................................... 147
Sobrecarga de operaciones............................................................................. 148
Constructores y destructores en C++............................................................. 150
Constructor...................................................................................................150
Constructor de Copia....................................................................................151
Destructor.....................................................................................................153
Constructores y finalizadores en Java ............................................................ 156
Constructor...................................................................................................156
Finalizador ...................................................................................................157
Inicializadores en Ruby .................................................................................. 158
Miembros estticos en C++ ........................................................................... 160
Miembros estticos en Java............................................................................ 163
Miembros de clase en Ruby ............................................................................ 166
Atributos de clase.........................................................................................166
Mtodos de clase..........................................................................................166
Objetos constantes en C++ ............................................................................ 168
Objetos finales en Java................................................................................... 171
Objetos constantes en Ruby ............................................................................ 173
Funciones amigas en C++ ............................................................................... 176
Sobrecarga de operadores en C++ ................................................................. 181
Algunas restricciones: .................................................................................... 181
Sobrecarga de operadores en Ruby ............................................................... 191
Herencia en C++.............................................................................................. 193
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 7 -
Introduccin ................................................................................................... 193
Implementacin en C++................................................................................. 194
Control de Acceso a miembros en C++.......................................................... 196
Control de acceso en herencia en C++.......................................................... 198
Manejo de objetos de la clase base como objetos de una clase derivada y
viceversa en C++ ........................................................................................... 202
Constructores de clase base en C++.............................................................. 206
Redefinicin de mtodos en C++.................................................................... 209
Herencia Mltiple en C++ ............................................................................. 212
Ambigedades..............................................................................................216
Constructores en herencia mltiple..............................................................220
Herencia en Java ............................................................................................. 221
Implementacin en Java ................................................................................. 221
BlueJ............................................................................................................... 223
Clase Object ................................................................................................... 226
Control de acceso a miembros en Java........................................................... 227
Control de acceso de clase public en Java...................................................... 230
Constructores de superclase........................................................................... 230
Manejo de objetos de la subclase como objetos de una superclase en Java ... 231
Redefinicin de mtodos ................................................................................. 235
Calificador final ............................................................................................. 237
Interfaces ......................................................................................................... 238
Herencia en Ruby............................................................................................ 243
Implementacin en Ruby................................................................................. 243
Clase Class ..................................................................................................... 244
Clase Object ................................................................................................... 245
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 8 -
Control de acceso a miembros en Ruby.......................................................... 246
Inicializadores de superclase.......................................................................... 249
Manejo de objetos de la subclase como objetos de una superclase en Ruby... 250
Redefinicin de mtodos ................................................................................. 252
Mdulos............................................................................................................ 254
Mixins............................................................................................................... 255
Asociaciones entre clases en C++ ................................................................... 259
Asociaciones reflexivas en C++..................................................................... 261
Multiplicidad de una asociacin en C++....................................................... 262
Tipos de asociaciones segn su multiplicidad..............................................262
Asociaciones entre Clases en Java.................................................................. 266
Asociacin reflexiva en Java .......................................................................... 267
Multiplicidad de una asociacin en Java........................................................ 267
Asociaciones entre Clases en Ruby ................................................................ 271
Asociacin reflexiva en Ruby.......................................................................... 271
Multiplicidad de una asociacin en Ruby ....................................................... 272
Objetos compuestos en C++............................................................................ 273
UMLGEC ++................................................................................................... 277
Objetos compuestos en Java........................................................................... 279
Objetos compuestos en Ruby.......................................................................... 284
Funciones virtuales y polimorfismo en C++.................................................. 289
Clase abstracta y clase concreta en C++....................................................... 292
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 9 -
Polimorfismo .................................................................................................. 293
Destructores virtuales..................................................................................... 294
Clases Abstractas y Polimorfismo en Java .................................................... 309
Clase abstracta y clase concreta en Java ....................................................... 311
Ejemplo de Polimorfismo con una Interfaz en Java........................................ 323
Polimorfismo en Ruby .................................................................................... 325
Y la clase abstracta?..................................................................................... 327
Plantillas de clase en C++ ............................................................................... 337
Standard Template Library (STL) ................................................................ 341
Clases Genricas en Java................................................................................. 344
Biblioteca de Clases Genricas en Java ......................................................... 347
Manejo de Excepciones ................................................................................... 350
Manejo de Excepciones en C++...................................................................... 351
Excepciones estandar en C++........................................................................ 352
Manejo de Excepciones en Java ..................................................................... 354
Cmo funciona?............................................................................................ 354
Lanzamiento de excepciones (throw) .............................................................. 355
Manejo de excepciones ................................................................................... 356
El bloque try.................................................................................................357
El bloque catch.............................................................................................357
El bloque finally...........................................................................................359
Jerarqua de excepciones................................................................................ 361
Ventajas del tratamiento de excepciones......................................................362
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 10 -
Lista de Excepciones ...................................................................................363
Afirmaciones en Java...................................................................................... 367
Usando afirmaciones ...................................................................................... 367
Habilitando y deshabilitando las afirmaciones............................................... 368
Manejo de Excepciones en Ruby.................................................................... 370
Raise & Rescue............................................................................................... 370
Jerarqua de Excepciones ............................................................................... 372
Catch & Throw............................................................................................... 373
Introduccin a Multihilos en Java ................................................................. 375
Programas de flujo mltiple.........................................................................375
Estados de un hilo........................................................................................... 377
La clase Thread .............................................................................................. 379
Comportamiento de los hilos .......................................................................... 380
Interfaz Grfica AWT .................................................................................... 383
Clases de ventana ........................................................................................... 383
Clase Frame..................................................................................................384
Clase Dialog.................................................................................................384
Clase Filedialog............................................................................................384
Componentes grficos .................................................................................... 385
Aplicaciones con mens.................................................................................. 390
Clase MenuBar.............................................................................................390
Clase Menu..................................................................................................390
Clase MenuItem...........................................................................................391
Manejo de Eventos .......................................................................................... 394
Introduccin ................................................................................................... 394
Modelo de manejo de eventos actual .............................................................. 395
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 11 -
Adaptadores.................................................................................................399
Otras tecnologas Java .................................................................................... 407
Principales tecnologas de Java EE................................................................ 408
Otras tecnologas (no necesariamente Java).................................................. 410
Referencias....................................................................................................... 413
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 12 -
Eclipse
Eclipse es desarrollado como un proyecto de codigo abierto lanzada en
noviembre de 2001 por IBM, Object Technology Internacional y otras compaias.
El objetivo era desarrollar una plataforma abierta de desarrollo. Fue planeada para
ser extendida mediante plug-ins.
Es desarrollada en J ava por lo que puede ejecutarse en un amplio rango de
sistemas operativos. Tambien incorpora facilidades para desarrollar en J ava
aunque es posible instalarle plug-ins para otros lenguajes como C/C++, PHP,
Ruby, Haskell, etc. Incluso antiguos lenguajes como Cobol tienen extensiones
disponibles para Eclipse [1]:
Eclipse +J DT =J ava IDE
Eclipse +CDT =C/C++IDE
Eclipse +PHP =PHP IDE
Eclipse +J DT +CDT +PHP =J ava, C/C++, PHP IDE
Trabaja bajo workbenchs que determinan la interfaz del usuario centrada
alrededor del editor, vistas y perspectivas.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 13 -
Los recursos son almacenados en el espacio de trabajo (workspace) el cual es un
flder almacenado normalmente en el directorio de Eclipse. Es posible manejar
diferentes reas de trabajo.
Eclipse, sus componentes y documentacin pueden ser obtenidos de:
www.eclipse.org
Para trabajar en este curso se requerir preferentemente:
1. J ava 1.5 o 1.6
2. Eclipse SDK 3.3.x
3. Plug in para C/C++en Eclipse (CDT) y compilador de ANSI C/C++si no
se tiene uno instalado.
4. Ruby 1.8
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 14 -
5. Plug in para Ruby (RDT Rubt Development Tools) si se quiere usar Ruby
con Eclipse
Tips para instalar CDT (C/C++ Development Toolkit) en Eclipse en Windows:
1. Instalar un compilador de C/C++
a. Si se instala MinGW y se tiene que renombrar el archivo mingw32-
make.exe por make.exe. Ver http://www.mingw.org
b. Adems, aadir el depurador gdb pues no viene incluido en MinGW,
aunque existe una copia en el sitio antes mencionado o puede
obtenerse de: http://sourceware.org/gdb
2. Instalar el CDT desde el sitio recomendado Usando el Update Manager y
obteniendo el plug in del sitio Callisto Discovery que aparece listado al
entrar a aadir componentes en el Update Manager (Otra opcion es ir a
http://www.eclipse.org/cdt/ )
3. Agregar \MinGW\bin (o el directorio correspondiente) al la variable PATH
del sistema.
Si el CDT esta bien instalado debe ser posible crear proyectos de C/C++,
compilarlos, ejecutarlos y depurarlos dentro del ambiente de Eclipse.
En el caso de Ruby, el interprete puede obtenerse de: http://www.ruby-
lang.org/en/downloads/
El RDT para eclipse se instala como el CDT y se obtiene de:
http://rubyeclipse.sourceforge.net/download.rdt.html
Posteriormente se tiene que especificar en Eclipse la ruta del interprete.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 15 -
Caractersticas de C++
Ahora comentaremos algunas caractersticas de C++que no tienen que ver
directamente con la programacin orientada a objetos.
Comentarios en C++
Los comentarios en C son:
/ * coment ar i o en C */
En C++los comentarios pueden ser adems de una sola lnea:
/ / est e es un coment ar i o en C++
Acabando el comentario al final de la lnea, lo que quiere decir que el
programador no se preocupa por cerrar el comentario.
Flujo de entrada/sali da
En C, la salida y entrada estndar estaba dada por printf y scanf principalmente
(o funciones similares) para el manejo de los tipos da datos simples y las cadenas.
En C++se proporcionan a travs de la librera i ost r eam, la cual debe ser
insertada a travs de un #i ncl ude. Las instrucciones son:
- cout Utiliza el flujo salida estndar.
Que se apoya del operador <<, el cual se conoce como operador
de insercin de flujo "colocar en"
- cin Utiliza el flujo de entrada estndar.
Que se apoya del operador >>, conocido como operador de
extraccin de flujo "obtener de"
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 16 -
Los operadores de insercin y de extraccin de flujo no requieren cadenas
de formato (%s, %f), ni especificadores de tipo. C++ reconoce de manera
automtica que tipos de datos son extrados o introducidos.
En el caso de el operador de extraccin (>>) no se requiere el operador de
direccin &.
De tal forma un cdigo de desplegado con printf y scanf de la forma (usando
el area de nombres estandar):
pr i nt f ( " Nmer o: " ) ;
scanf ( " %d" , &num) ;
pr i nt f ( " El val or l e do es: " %d\ n" , num) ;
Sera en C++de la siguiente manera:
cout << " Nmer o" ;
ci n >> num;
cout << " El val or l e do es: " << num<< ' \ n' ;
Funciones en l nea
Las funciones en lnea, se refiere a introducir un calificador inline a una
funcin de manera que le sugiera al compilador que genere una copia del cdigo
de la funcin en lugar de la llamada.
Ayuda a reducir el nmero de llamadas a funciones reduciendo el tiempo de
ejecucin en algunos casos, pero en contraparte puede aumentar el tamao del
programa.
A diferencia de las macros, las funciones inline si incluyen verificacin de
tipos y son reconocidas por el depurador.
Las funciones inline deben usarse slo para funciones chicas que se usen
frecuentemente.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 17 -
El compilador desecha las solicitudes inline para programas que incluyan un
ciclo, un switch o un goto. Tampoco se consideran si no tienen return (aunque no
regresen valores) o si contienen variables de tipo static. Y lgicamente no genera
una funcin inline para funciones recursivas.
Declaracin:
inline <decl ar aci n de l a f unci n>
Ejemplo:
inline float suma ( float a, float b) {
Ret ur n a+b;
}
inline int max( int a, int b) {
return ( a > b) ? a : b;
}
Nota: Las funciones inline tienen conflictos con los prototipos, as que
deben declararse completas sin prototipo en el archivo .h. Adems, si la funcin
hace uso de otra funcin en donde se expanda la funcin debe tener los include
correspondientes a esas funciones utilizadas.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 18 -
Decl araci ones de variables
Mientras que en C, las declaraciones deben ir en la funcin antes de
cualquier lnea ejecutable, en C++pueden ser introducidas en cualquier punto,
con la condicin lgica de que la declaracin est antes de la utilizacin de lo
declarado.
En algunos compiladores podia declararse una variable en la seccin de
inicializacin de la instruccin for, pero es incorrecto declarar una variable en la
expresin condicional del while, do-while, for, if o switch. El actual estandar de
C++no permite la declaracion de variables dentro del for.
Ejemplo:
#include <i ost r eam>
int mai n( ) {
int i =0;
for ( i =1; i <10; i ++) {
int j =10;
st d: : cout <<i <<" j : " <<j <<st d: : endl ;
}
st d: : cout <<" \ ni al sal i r del ci cl o: " <<i ;
return 0;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 19 -
O usando el area de nombres estandar:
#include <i ost r eam>
using namespace st d;
int mai n( ) {
int i =0;
for ( i =1; i <10; i ++) {
int j =10;
cout <<i <<" j : " <<j <<endl ;
}
cout <<" \ ni al sal i r del ci cl o: " <<i ;
return 0;
}
El alcance de las variables en C++es por bloques. Una variable es vista a
partir de su declaracin y hasta la llave } del nivel en que se declar. Lo cual
quiere decir que las instrucciones anteriores a su declaracin no pueden hacer uso
de la variable, ni despus de finalizado el bloque.
Operador de resol ucin de alcance
Se puede utilizar el operador de resolucin de alcance :: se refiere a una
variable (variable, funcin, tipo, enumerador u objeto), con un alcance de archivo
(variable global).
Esto le permite al identificador ser visible an si el identificador se
encuentra oculto.
Ejemplo:
float h;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 20 -
void g( int h) {
float a;
int b;
a=: : h; / / a se i ni ci al i za con l a var i abl e gl obal h
b=h; / / b se i ni ci al i za con l a var i abl e l ocal h
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 21 -
Valores por Defaul t
Las funciones en C++pueden tener valores por default. Estos valores son
los que toman los parmetros en caso de que en una llamada a la funcin no se
encuentren especificados.
Los valores por omisin deben encontrarse en los parmetros que estn ms
a la derecha. Del mismo modo, en la llamada se deben empezar a omitir los
valores de la extrema derecha.
Ejemplo:
#include <i ost r eam>
using namespace st d;
int punt o( int=5, int=4) ;
int mai n ( ) {
cout <<" val or 1: " <<punt o( ) <<' \ n' ;
cout <<" val or 2: " <<punt o( 1) <<' \ n' ;
cout <<" val or 3: " <<punt o( 1, 3) <<' \ n' ;
get char ( ) ;
return 0;
}
int punt o( int x, int y) {
if( y! =4)
return y;
if( x! =5)
return x;
return x+y;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 22 -
C++no permite la llamada omitiendo un valor antes de la extrema derecha
de los argumentos:
punt o( , 8) ;
Otro ejemplo de valores o argumentos por default:
#include <i ost r eam>
using namespace st d;
int b=1;
int f ( int) ;
int h( int x=f ( b) ) ; / / ar gument o def aul t f ( : : b)
int mai n ( ) {
b=5;
cout <<b<<endl ;
{
int b=3;
cout <<b<<endl ;
cout <<h( ) ; / / h( f ( : : b) )
}
return 0;
}
int h( int z) {
cout <<" Val or r eci bi do: " <<z<<endl ;
return z*z;
}
int f ( int y) {
return y;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 23 -
Parmetros por referencia
En C todos los pasos de parmetros son por valor, aunque se pueden enviar
parmetros "por referencia" al enviar por valor la direccin de un dato (variable,
estructura, objeto), de manera que se pueda accesar directamente el rea de
memoria del dato del que se recibi su direccin.
C++introduce parmetros por referencia reales. La manera en que se
definen es agregando el smbolo & de la misma manera que se coloca el *:
despus del tipo de dato en el prototipo y en la declaracin de la funcin.
Ejemplo:
/ / Compar ando par met r os por val or , por val or con
/ / apunt ador es ( " r ef er enci a" ) ,
/ / y paso por r ef er enci a r eal
#include <i ost r eam>
using namespace st d;
int por Val or ( int) ;
void por Apunt ador ( int *) ;
void por Ref er enci a( int &) ;
int mai n( ) {
int x=2;
cout << " x= " << x << " ant es de l l amada a por Val or \ n"
<< " Regr esado por l a f unci n: " << por Val or ( x) <<endl
<< " x= " << x << " despues de l a l l amada a
por Val or \ n\ n" ;
int y=3;
cout << " y= " << y << " ant es de l l amada a
por Apunt ador \ n" ;
por Apunt ador ( &y) ;
cout << " y= " << y << " despues de l a l l amada a
por Apunt ador \ n\ n" ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 24 -
int z=4;
cout << " z= " << z << " ant es de l l amada a por Ref er enci a
\ n" ;
por Ref er enci a( z) ;
cout << " z= " << z << " despues de l a l l amada a
por Ref er enci a\ n\ n" ;
return 0;
}
int por Val or ( int val or ) {
return val or *=val or ; / / par met r o no modi f i cado
}
void por Apunt ador ( int *p) {
*p *= *p; / / par met r o modi f i cado
}
void por Ref er enci a( int &r ) {
r *= r ; / / par met r o modi f i cado
}
Notar que no hay diferencia en el manejo de un parmetro por referencia y
uno por valor, lo que puede ocasionar ciertos errores de programacin.
Variables de referencia
Tambin puede declararse una variable por referencia que puede ser
utilizada como un seudnimo o alias. Ejemplo:
int max=1000, &sMax=max; / / decl ar o max y sMax es un al i as
de max
sMax++; / / i ncr ement o en uno max a t r avs de su al i as
Esta declaracin no reserva espacio para el dato, pues es como un apuntador
pero se maneja como una variable normal. No se permite reasignarle a la variable
por referencia otra variable.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 25 -
Ejemplo:
/ / var i abl e por r ef er enci a
#include <i ost r eam>
using namespace st d;
int mai n( ) {
int x=2, &y=x, z=8;
cout << " x= " <<x <<endl
<<" y= " <<y<<endl ;
y=10;
cout << " x= " <<x <<endl
<<" y= " <<y<<endl ;
/ / Reasi gnar no est a per mi t i do
/ * &y=&z;
cout << " z= " <<z <<endl
<<" y= " <<y<<endl ;
*/
y++;
cout << " z= " <<z <<endl
<<" y= " <<y<<endl ;
return 0;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 26 -
Asignaci n de memoria en C++
En el ANSI C, se utilizan malloc, calloc y free para asignar y liberar
dinmicamente memoria:
float *f ;
f = ( float *) mal l oc( sizeof( float) ) ;
. . .
f r ee( f ) ;
Se debe indicar el tamao a travs de sizeof y utilizar una mscara (cast)
para designar el tipo de dato apropiado.
En C++, existen dos operadores para asignacin y liberacin de memoria
dinmica: new y delete.
float *f ;
f = new float;
. . .
delete f ;
El operador new crea automticamente un rea de memoria del tamao
adecuado. Si no se pudo asignar le memoria se regresa un apuntador nulo (NULL
0). Ntese que en C++se trata de operadores que forman parte del lenguaje, no
de funciones de biblioteca.
El operador delete libera la memoria asignada previamente por new. No se
debe tratar de liberar memoria previamente liberada o no asignada con new.
Es posible hacer asignaciones de memoria con inicializacin:
int *max= new int ( 1000) ;
Tambin es posible crear arreglos dinmicamente:
char *cad;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 27 -
cad= new char [ 30] ;
. . .
delete [ ] cad;
Usar delete sin los corchetes para arreglos dinamicos puede no liberar
adecuadamente la memoria, sobre todo si son elementos de un tipo definido por el
usuario.
Ejemplo 1:
#include <i ost r eam>
using namespace st d;
int mai n( ) {
int *p, *q;
p= new int; / / asi gna memor i a
if( ! p) {
cout <<" No se pudo asi gnar memor i a\ n" ;
return 0;
}
*p=100;
cout <<endl << *p<<endl ;
q= new int ( 123) ; / / asi gna memor i a
cout <<endl << *q<<endl ;
delete p; / / l i ber a memor i a
/ / *p=20; Uso i ndebi do de p pues ya se l i ber o
/ / cout <<endl << *p<<endl ; l a memor i a
delete q;
return 0;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 28 -
Ejemplo 2:
#include <i ost r eam>
using namespace st d;
int mai n( ) {
float *ap, *p=new float ( 3) ;
const int MAX=5;
ap= new float [ MAX] ; / / asi gna memor i a
int i ;
for( i =0; i <MAX; i ++)
ap[ i ] =i * *p;
for( i =0; i <MAX; i ++)
cout <<ap[ i ] <<endl ;
delete p;
delete [ ] ap;
return 0;
}
Ejemplo 3:
#include <i ost r eam>
using namespace st d;
typedef struct {
int n1,
n2,
n3;
}cPr ueba;
int mai n( ) {
cPr ueba *pr 1, *pr 2;
pr 1= new cPr ueba;
pr 1- >n1=11;
pr 1- >n2=12;
pr 1- >n3=13;
pr 2= new cPr ueba( *pr 1) ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 29 -
delete pr 1;
cout << pr 2- >n1<<" " <<pr 2- >n2 <<" " <<pr 2- >n3<<endl ;
delete pr 2;
return 0;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 30 -
Plantill as
Cuando las operaciones son idnticas pero requieren de diferentes tipos de
datos, podemos usar lo que se conoce como templates o plantillas de funcin.
El trmino de plantilla es porque el cdigo sirve como base (o plantilla) a
diferentes tipos de datos. C++genera al compilar el cdigo objeto de las
funciones para cada tipo de dato involucrado en las llamadas
Las definiciones de plantilla se escriben con la palabra clave template, con una
lista de parmetros formales entre <>. Cada parmetro formal lleva la palabra
clave class.
Cada parmetro formal puede ser usado para sustituir a: tipos de datos bsicos,
estructurados o definidos por el usuario, tipos de los argumentos, tipo de regreso
de la funcin y para variables dentro de la funcin.
Ejemplo 1:
#include <i ost r eam>
using namespace st d;
template <class T>
T mayor ( T x, T y)
{
return ( x > y) ? x : y;
};
int mai n( ) {
int a=10, b=20, c=0;
float x=44. 1, y=22. 3, z=0 ;
c=mayor ( a, b) ;
z=mayor ( x, y) ;
cout <<c<<" " <<z<<endl ;
/ / z=mayor ( x, b) ; er r or no hay mayor ( f l oat , i nt )
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 31 -
/ / z=mayor ( a, y) ; " " " " " " " " ( i nt , f l oat )
return 0;
}
Consideraciones:
Cada parmetro formal debe aparecer en la lista de parmetros de la funcin al
menos una vez.
No puede repetirse en la definicin de la plantilla el nombre de un parmetro
formal.
Tener cuidado al manejar mas de un parmetro en los templates.
Ejemplo 2:
#include <i ost r eam>
using namespace st d;
template <class T>
void despl egaAr r ( T ar r [ ] , const int cont , T pr )
{
for( int i =0; i <cont ; i ++)
cout << ar r [ i ] << " " ;
cout <<endl ;
cout <<pr <<endl ;
}
int mai n( ) {
const int cont Ent =4, cont Fl ot =5, cont Car =10;
int ent [ ] ={1, 2, 3, 4};
float f l ot [ ] ={1. 1, 2. 2, 3. 3, 4. 4, 5. 5};
char car [ ] ={" Pl ant i l l a" };
cout << " Ar r egl o de f l ot ant es: \ n" ;
despl egaAr r ( f l ot , cont Fl ot , ( float) 3. 33) ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 32 -
cout << " Ar r egl o de car act er es: \ n" ;
despl egaAr r ( car , cont Car , ' Z' ) ;
cout << " Ar r egl o de ent er os: \ n" ;
despl egaAr r ( ent , cont Ent , 99) ;
return 0;
}
Ejemplo 3:
#include <i ost r eam>
using namespace st d;
template <class T, class TT>
T mayor ( T x, TT y)
{
return ( x > y) ? x : y;
};
int mai n( ) {
int a=10, b=20, c=0;
float x=44. 1, y=22. 3, z=0 ;
c=mayor ( a, b) ;
z=mayor ( x, y) ;
cout <<c<<" " <<z<<endl ;
/ / si n er r or al aument ar un par met r o f or mal .
z=mayor ( x, b) ;
cout <<z<<endl ;
z=mayor ( a, y) ; / / r egr esa ent er o pues a es ent er o ( t i po T es
ent er o par a
cout <<z<<endl ; / / est e l l amado.
z=mayor ( y, a) ;
cout <<z<<endl ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 33 -
c=mayor ( y, a) ; / / r egr esa f l ot ant e per o l a asi gnaci n l o
cor t a en ent er o.
cout <<c<<endl ;
return 0;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 34 -
Introduccin a la programacin orientada a objetos [2, 3]
Programaci n no estructurada
Comnmente, las personas empiezan a aprender a programar escribiendo
programas pequeos y sencillos consistentes en un solo programa principal.
Aqu "programa principal" se refiere a una secuencia de comandos o
instrucciones que modifican datos que son a su vez globales en el transcurso de
todo el programa.
Programaci n procedural
Con la programacin procedural se pueden combinar las secuencias de
instrucciones repetitivas en un solo lugar.
Una llamada de procedimiento se utiliza para invocar al procedimiento.
Despus de que la secuencia es procesada, el flujo de control procede
exactamente despus de la posicin donde la llamada fue hecha.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 35 -
Al introducir parmetros, as como procedimientos de procedimientos
(subprocedimientos) los programas ahora pueden ser escritos en forma ms
estructurada y con menos errores.
Por ejemplo, si un procedimiento ya es correcto, cada vez que es usado
produce resultados correctos. Por consecuencia, en caso de errores, se puede
reducir la bsqueda a aquellos lugares que todava no han sido revisados.
De este modo, un programa puede ser visto como una secuencia de llamadas
a procedimientos. El programa principal es responsable de pasar los datos a las
llamadas individuales, los datos son procesados por los procedimientos y, una vez
que el programa ha terminado, los datos resultantes son presentados.
As, el flujo de datos puede ser ilustrado como una grfica jerrquica, un
rbol, como se muestra en la figura para un programa sin subprocedimientos.
Programaci n modul ar
En la programacin modular, los procedimientos con una funcionalidad comn
son agrupados en mdulos separados.
Un programa por consiguiente, ya no consiste solamente de una seccin. Ahora
est dividido en varias secciones ms pequeas que interactan a travs de
llamadas a procedimientos y que integran el programa en su totalidad.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 36 -
Cada mdulo puede contener sus propios datos. Esto permite que cada mdulo
maneje un estado interno que es modificado por las llamadas a procedimientos de
ese mdulo.
Sin embargo, solamente hay un estado por mdulo y cada mdulo existe
cuando ms una vez en todo el programa.
Datos y Operaci ones separados
La separacin de datos y operaciones conduce usualmente a una estructura
basada en las operaciones en lugar de en los datos: Los Mdulos agrupan las
operaciones comunes en forma conjunta.
Al programar entonces se usan estas operaciones proveyndoles
explcitamente los datos sobre los cules deben operar.
La estructura de mdulo resultante est por lo tanto orientada a las
operaciones ms que sobre los datos. Se podra decir que las operaciones
definidas especifican los datos que sern usados.
En la programacin orientada a objetos, la estructura se organiza por
los datos. Se escogen las representaciones de datos que mejor se ajusten a tus
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 37 -
requerimientos. Por consecuencia, los programas se estructuran por los datos ms
que por las operaciones.
Los datos especifican las operaciones vlidas. Ahora, los mdulos agrupan
representaciones de datos en forma conjunta.
Programaci n orientada a obj etos
La programacin orientada a objetos resuelve algunos de los problemas que
se acaban de mencionar. De alguna forma se podra decir que obliga a prestar
atencin a los datos.
En contraste con las otras tcnicas, ahora tenemos una telaraa de objetos
interactuantes, cada uno de los cules manteniendo su propio estado.
Por ejemplo, en la programacin orientada a objetos deberamos tener tantos
objetos de pila como sea necesario. En lugar de llamar un procedimiento al que
le debemos proveer el manejador de la pila correcto, mandaramos un mensaje
directamente al objeto pila en cuestin.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 38 -
En trminos generales, cada objeto implementa su propio mdulo,
permitiendo por ejemplo que coexistan muchas pilas. Cada objeto es responsable
de inicializarse y destruirse en forma correcta.
No es sta solamente una manera ms elegante de tcnica de
programacin modular?
Tipos de Datos Abstractos
Algunos autores describen la programacin orientada a objetos como
programacin de tipos de datos abstractos y sus relaciones. Los tipos de datos
abstractos son como un concepto bsico de orientacin a objetos.
Los Problemas
La primera cosa con la que uno se enfrenta cuando se escriben programas es
el problema.
Tpicamente, uno se enfrenta a problemas "de la vida real" y nos queremos
facilitar la existencia por medio de un programa para manejar dichos problemas.
Sin embargo, los problemas de la vida real son nebulosos y la primera cosa
que se tiene que hacer es tratar de entender el problema para separar los detalles
esenciales de los no esenciales: tratando de obtener tu propia perspectiva
abstracta, o modelo, del problema. Este proceso de modelado se llama abstraccin
y se ilustra en la Figura:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 39 -
El modelo define una perspectiva abstracta del problema. Esto implica que
el modelo se enfoca solamente en aspectos relacionados con el problema y que
uno trata de definir propiedades del problema. Estas propiedades incluyen
los datos que son afectados
las operaciones que son identificadas
por el problema.
Para resumir, la abstraccin es la estructuracin de un problema nebuloso en
entidades bien definidas por medio de la definicin de sus datos y operaciones.
Consecuentemente, estas entidades combinan datos y operaciones. No estn
desacoplados unos de otras.
Tipos de Datos Abstractos y Orientacin a Objetos
Los TDAs permiten la creacin de instancias con propiedades bien definidas
y comportamiento bien definido. En orientacin a objetos, nos referimos a los
TDAs como clases. Por lo tanto, una clase define las propiedades de objetos en un
ambiente orientado a objetos.
Los TDAs definen la funcionalidad al poner especial nfasis en los datos
involucrados, su estructura, operaciones, as como en axiomas y precondiciones.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 40 -
Consecuentemente, la programacin orientada a objetos es "programacin con
TDAs: al combinar la funcionalidad de distintos TDAs para resolver un
problema. Por lo tanto, instancias de TDAs son creadas dinmicamente, usadas y
destrudas.
Conceptos de bsicos de objetos
La programacin tradicional separa los datos de las funciones, mientras que
la programacin orientada a objetos define un conjunto de objetos donde se
combina de forma modular los datos con las funciones.
Aspectos principales:
1) Objetos.
El objeto es la entidad bsica del modelo orientado a objetos.
El objeto integra una estructura de datos (atributos) y un comportamiento
(operaciones).
Se distinguen entre s por medio de su propia identidad, aunque internamente
los valores de sus atributos sean iguales.
2) Clasificacin.
Las clases describen posibles objetos, con una estructura y comportamiento
comn.
Los objetos que contienen los mismos atributos y operaciones pertenecen a la
misma clase.
La estructura de clases integra las operaciones con los atributos a los cuales se
aplican.
3) Instanciacin.
El proceso de crear objetos que pertenecen a una clase se denomina
instanciacin.
Pueden ser instanciados un nmero indefinido de objetos de cierta clase.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 41 -
4) Generalizacin.
En una jerarqua de clases, se comparten atributos y operaciones entre clases
basados en la generalizacin de clases.
La jerarqua de generalizacin se construye mediante la herencia.
Las clases ms generales se conocen como superclases.
Las clases ms especializadas se conocen como subclases. La herencia puede
ser simple o mltiple.
5) Abstraccin.
La abstraccin se concentra en lo primordial de una entidad y no en sus
propiedades secundarias.
Adems en lo que el objeto hace y no en cmo lo hace.
Se da nfasis a cuales son los objetos y no cmo son usados.
6) Encapsulacin.
Encapsulacin o encapsulamiento es la separacin de las propiedades externas
de un objeto de los detalles de implementacin internos del objeto.
Al separar la interfaz del objeto de su implementacin, se limita la complejidad
al mostrarse slo la informacin relevante.
Disminuye el impacto a cambios en la implementacin, ya que los cambios a
las propiedades internas del objeto no afectan su interaccin externa.
7) Modularidad.
El encapsulamiento de los objetos trae como consecuencia una gran
modularidad.
Cada mdulo se concentra en una sola clase de objetos.
Los mdulos tienden a ser pequeos y concisos.
La modularidad facilita encontrar y corregir problemas.
La complejidad del sistema se reduce facilitando su mantenimiento.
8) Extensibilidad.
La extensibilidad permite hacer cambios en el sistema sin afectar lo que ya
existe.
Nuevas clases pueden ser definidas sin tener que cambiar la interfaz del resto
del sistema.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 42 -
La definicin de los objetos existentes puede ser extendida sin necesidad de
cambios ms all del propio objeto.
9) Polimorfismo.
El polimorfismo es la caracterstica de definir las mismas operaciones con
diferente comportamiento en diferentes clases.
Se permite llamar una operacin sin preocuparse de cul implementacin es
requerida en que clase, siendo responsabilidad de la jerarqua de clases y no
del programador.
10) Reusabilidad de cdigo.
La orientacin a objetos apoya el reuso de cdigo en el sistema.
Los componentes orientados a objetos se pueden utilizar para estructurar
libreras resuables.
El reuso reduce el tamao del sistema durante la creacin y ejecucin.
Al corresponder varios objetos a una misma clase, se guardan los atributos y
operaciones una sola vez por clase, y no por cada objeto.
La herencia es uno de los factores ms importantes contribuyendo al
incremento en el reuso de cdigo dentro de un proyecto.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 43 -
Lenguajes de programacin orientada a obj etos
Simula I fue originalmente diseado para problemas de simulacin y fue el
primer lenguaje en el cual los datos y procedimientos estaban unificados en una
sola entidad. Su sucesor Simula , deriv definiciones formales a los conceptos de
objetos y clase.
Simula sirvi de base a una generacin de lenguajes de programacin
orientados a objetos. Es el caso de C++, Eiffel y Beta.
Ada (1983), se derivan de conceptos similares, e incorporan el concepto de
jerarqua de herencia. CLU -clusters- tambin incorpora herencia.
Smalltalk es descendiente directo de Simula, generaliza el concepto de
objeto como nica entidad manipulada en los programas. Existen tres versiones
principales: Smalltalk-72, introdujo el paso de mensajes para permitir la
comunicacin entre objetos. Smalltalk-76 que introdujo herencia. Smalltalk-80
se inspira en Lisp.
Lisp contribuy de forma importante a la evolucin de la programacin
orientada a objetos.
Flavors maneja herencia mltiple apoyada con facilidades para la
combinacin de mtodos heredados.
CLOS , es el estndar del sistema de objetos de Common Lisp.
Los programas de programacin orientada a objetos pierden eficiencia ante
los lenguajes imperativos, pues al ser interpretado estos en la arquitectura von
Neumann resulta en un excesivo manejo dinmico de la memoria por la constante
creacin de objetos, as como una fuerte carga por la divisin en mltiples
operaciones (mtodos) y su ocupacin. Sin embargo se gana mucho en
comprensin de cdigo y modelado de los problemas.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 44 -
Caractersticas de los principales LPOO
1
Ada 95 Eiffel Smalltalk C++ Java
Paquetes S No No No S
Herencia Simple Mltiple Simple Mltiple Simple
Control de tipos Fuerte Fuerte Sin tipos Fuerte Fuerte
Enlace Dinmico Dinmico Dinmico Dinmico Dinmico
Concurrencia S No No No S
Recoleccin de
basura
No S S No S
Afirmaciones No S No No Si
2
Persistencia No No No No No
Generecidad S S S S Si
3
Otra comparacin puede ser vista en la siguiente tabla, tomada de Wikipedia
4
:
Language
General
model of
execution
Influences Paradigm(s)
Typing
discipline
Introduced
Ada Compilation
Algol, Pascal,
C++(Ada 95),
Smalltalk (Ada 95),
J ava (Ada 2005)
concurrent,
distributed,
generic,
imperative,
object-
oriented
static,
strong,
safe,
nominative
1983
C++ Compilation
C, Simula, Algol
68
imperative,
object-
oriented,
static,
strong,
unsafe,
1985
1
Lenguajes de Programacin Orientada a Objetos
2
A partir de la version 5 (1.5) de Java
3
Idem
4
La tabla completa puede ser vista en:
http://en.wikipedia.org/wiki/Comparison_of_programming_languages
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 45 -
generic nominative
C#
J IT
compilation
Delphi, J ava, C++,
Ruby
imperative,
object-
oriented,
generic,
multi-
platform
static,
strong,
both safe
and unsafe
2000
Eiffel Compilation Ada, Simula
imperative,
object-
oriented,
generic
static,
strong,
safe,
nominative,
contracts
1985
Java
Interpretation
/ J IT
compilation
C++, Objective-C,
C#
[2]
imperative,
object-
oriented,
multi-
platform,
generic
static,
strong
1994
Object
Pascal
Compilation Pascal
imperative,
object-
oriented
static,
strong, safe
(but unsafe
allowed),
nominative
1985
Ruby Interpretation Smalltalk,Perl,Lisp
imperative,
object-
oriented,
functional,
aspect-
oriented
dynamic
(duck),
strong
1995
Smalltalk
J IT
compilation
Sketchpad, Simula
object-
oriented,
functional,
concurrent,
event-driven,
imperative,
declarative
dynamic,
strong,
safe, duck
1971
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 46 -
Introduccin a Java
Origen
J ava es un lenguaje de programacin orientada a objetos,
diseado dentro de Sun Microsystems por J ames Gosling.
Originalmente, se le asign el nombre de Oak y fue un lenguaje
pensado para usarse dentro de dispositivos electrodomsticos, que
tuvieran la capacidad de comunicarse entre s.
Posteriormente fue reorientado hacia Internet, aprovechando el auge que
estaba teniendo en ese momento la red, y lo rebautizaron con el nombre de J ava.
Es anunciado al pblico en mayo de 1995 enfocndolo como la solucin para el
desarrollo de aplicaciones en web. Sin embargo, se trata de un lenguaje de
propsito general que puede ser usado para la solucin de problemas diversos.
J ava es un intento serio de resolver simultneamente los problemas
ocasionados por la diversidad y crecimiento de arquitecturas
incompatibles, tanto entre mquinas diferentes como entre los diversos
sistemas operativos y sistemas de ventanas que funcionaban sobre una
misma mquina, aadiendo la dificultad de crear aplicaciones distribuidas
en una red como Internet.
El inters que gener J ava en la industria fue mucho, tal que nunca un
lenguaje de programacin haba sido adoptado tan rpido por la comunidad de
desarrolladores. Las principales razones por las que J ava es aceptado tan rpido:
Aprovecha el inicio del auge de la Internet, especficamente del World
Wide Web.
Es orientado a objetos, la cual si bien no es tan reciente, estaba en uno
de sus mejores momentos, todo mundo quera programar de acuerdo al
modelo de objetos.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 47 -
Se trataba de un lenguaje que eliminaba algunas de las principales
dificultades del lenguaje C/C++, el cul era uno de los lenguajes
dominantes. Se deca que la ventaja de J ava es que es sintcticamente
parecido a C++, sin serlo realmente.
J ava era resultado de una investigacin con fines comerciales, no era
un lenguaje acadmico como Pascal o creado por un pequeo grupo de
personas como C C++.
Aunado a esto, las caractersticas de diseo de J ava, lo hicieron muy
atractivo a los programadores.
Caractersticas de diseo
Es un lenguaje de programacin de alto nivel, de propsito general, y cuyas
caractersticas son [5]:
Simple y familiar.
Orientado a objetos.
Independiente de la plataforma
Portable
Robusto.
Seguro.
Multihilos.
Simple y familiar
Es simple, ya que tanto la estructura lxica como sintctica del lenguaje es
muy sencilla. Adems, elimina las caractersticas complejas e innecesarias de sus
predecesores.
Es familiar al incorporar las mejores caractersticas de lenguajes tales como:
C/C++, Modula, Beta, CLOS, Dylan, Mesa, Lisp, Smalltalk, Objective-C, y
Modula 3.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 48 -
Orientado a Objetos
Es realmente un lenguaje orientado a objetos, todo en J ava son objetos:
No es posible que existan funciones que no pertenezcan a una clase.
La excepcin son los tipos da datos primitivos, como nmeros, caracteres y
bolanos
5
.
Cumple con los 4 requerimientos de Wegner [6]:
OO =abstraccin +clasificacin +polimorfismo +herencia
Independiente de la plataforma
La independencia de la plataforma implica que un programa en J ava se
ejecute sin importar el sistema operativo que se este ejecutando en una mquina
en particular. Por ejemplo un programa en C++compilado para Windows, debe
ser al menos vuelto a compilar si se quiere ejecutar en Unix; adems,
posiblemente habr que ajustar el cdigo que tenga que ver con alguna
caracterstica particular de la plataforma, como la interfaz con el usuario.
J ava resuelve el problema de la distribucin binaria mediante un formato de
cdigo binario (bytecode) que es independiente del hardware y del sistema
operativo gracias a su mquina virtual.
Si el sistema de runtime o mquina virtual est disponible para una
plataforma especfica, entonces una aplicacin puede ejecutarse sin necesidad de
un trabajo de programacin adicional.
5
Los puristas objetaran que no es totalmente orientado a objetos. En un sentido estricto Smalltalk es un
lenguaje ms puro, ya que ah hasta los tipos de datos bsicos son considerados objetos.
Hardware
S.O.
Aplicacin
Runtime Java
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 49 -
Portable
Una razn por la que los programas en J ava son portables es precisamente
que el lenguaje es independiente de la plataforma.
Adems, la especificacin de sus tipos de datos primitivos y sus tamaos,
as como el comportamiento de los operadores aritmticos, son estndares en
todas las implementaciones de J ava. Por lo que por ejemplo, un entero es definido
de un tamao de 4 bytes, y este espacio ocupar en cualquier plataforma, por lo
que no tendr problemas en el manejo de los tipos de datos. En cambio, un entero
en C generalmente ocupa 2 bytes, pero en algunas plataformas el entero ocupa 4
bytes, lo que genera problemas a la hora de adaptar un programa de una
plataforma a otra.
Robusto
J ava se considera un lenguaje robusto y confiable, gracias a:
Validacin de tipos. Los objetos de tipos compatibles pueden ser asignados
a otros objetos sin necesidad de modificar sus tipos. Los objetos de tipos
potencialmente incompatibles requieren un modificador de tipo (cast).
Si la modificacin de tipo es claramente imposible, el compilador lo
rechaza y reporta un error en tiempo de compilacin. Si la modificacin
resulta legal, el compilador lo permite, pero inserta una validacin en
tiempo de ejecucin.
Cuando el programa se ejecuta se realiza la validacin cada vez que se
ejecuta una asignacin potencialmente invlida.
Control de acceso a variables y mtodos. Los miembros de una clase
pueden ser privados, pblicos o protegidos
6
.
6
Ms adelante en el curso se ahondar en el tema.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 50 -
En java una variable privada, es realmente privada. Tanto el
compilador como la mquina virtual de J ava, controlan el acceso a los
miembros de una clase, garantizando as su privacidad.
Validacin del apuntador Null. Todos los programas en J ava usan
apuntadores para referenciar a un objeto. Esto no genera inestabilidad pues
una validacin del apuntador a Null ocurre cada vez que un apuntador deja
de referencia a un objeto. C y C++por ejemplo, no tienen esta
consideracin sobre los apuntadores, por lo que es posible estar
referenciando a localidades invlidas de la memoria.
Limites de un arreglo. J ava verifica en tiempo de ejecucin que un
programa no use arreglos para tratar de acceder a reas de memoria que no
le pertenecen. De nuevo, C y C++no tiene esta verificacin, lo que permite
que un programa se salga del lmite mayor y menor de un arreglo.
Aritmtica de apuntadores. Aunque todos los objetos se manejan con
apuntadores, J ava elimina la mayor parte de los errores de manejo de
apuntadores porque no soporta la aritmtica de apuntadores:
o No soporta acceso directo a los apuntadores
o No permite operaciones sobre apuntadores.
Manejo de memoria. Muchos de los errores de la programacin se deben a
que el programa no libera la memoria que debera liberar, o se libera la
misma memoria ms de una vez.
J ava, hace recoleccin automtica de basura, liberando la memoria y
evitando la necesidad de que el programador se preocupe por liberar
memoria que ya no utilice.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 51 -
Diferencias entre Java y C++
Se compara mucho al lenguaje de J ava con C++, y esto es lgico debido a la
similitud en la sintaxis de ambos lenguajes, por lo que resulta necesario resaltar
las diferencias principales que existen entre estos. J ava a diferencia de C++:
No tiene aritmtica de apuntadores. J ava si tiene apuntadores, sin
embargo no permite la manipulacin directa de las direcciones de memoria.
No se proporcionan operadores para el manejo de los apuntadores pues no
se considera responsabilidad del programador.
No permite funciones con mbito global. Toda operacin debe estar
asociada a una clase, por lo que el mbito de la funcin esta limitado al
mbito de la clase.
Elimina la instruccin goto. La instruccin goto se considera obsoleta, ya
que es una herencia de la poca de la programacin no estructurada. Sin
embargo, esta definida como palabra reservada para restringir su uso.
Las cadenas no terminan con \0. Las cadenas en C y C++terminan con
\0 que corresponde al valor en ASCII 0, ya que en estos lenguajes no
existe la cadena como un tipo de dato estndar y se construye a partir de
arreglos de caracteres. En J ava una cadena es un objeto de la clase String y
no necesita ese carcter para indicar su finalizacin.
No maneja macros. Una macro es declarada en C y C++a travs de la
instruccin #define, la cual es tratada por el preprocesador.
No soporta un preprocesador. Una de las razones por las cuales no maneja
macros J ava es precisamente porque no tiene un preprocesador que prepare
el programa previo a la compilacin.
El tipo char contiene 16 bits. Un carcter en J ava utiliza 16 bits en lugar
de 8 para poder soportar UNICODE en lugar de ASCII, lo que permite la
representacin de mltiples smbolos.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 52 -
Java soporta mltiples hilos de ejecucin. Los mltiples hilos de
ejecucin o multihilos permiten un fcil manejo de programacin
concurrente. Otros lenguajes dependen de la plataforma para implementar
concurrencia.
Todas las condiciones en Java deben tener como resultado un tipo
boleano. Dado que en J ava los resultados de las expresiones son dados bajo
este tipo de dato. Mientras que en C y C++se considera a un valor de cero
como falso y no cero como verdadero.
Java no soporta el operador sizeof. Este operador permite en C y C++
obtener el tamao de una estructura de datos. En J ava esto no es necesario
ya que cada objeto sabe el espacio que ocupa en memoria.
No tiene herencia mltiple. J ava solo cuenta con herencia simple, con lo
que pierde ciertas capacidades de generalizacin que son subsanadas a
travs del uso de interfaces. El equipo de desarrollo de J ava explica que esto
simplifica el lenguaje y evita la ambigedad natural generada por la
herencia mltiple.
No tiene liberacin de memoria explcita (delete y free() ). En J ava no es
necesario liberar la memoria ocupada, ya que cuenta con un recolector de
basura
7
responsable de ir liberando cada determinado tiempo los recursos de
memoria que ya no se estn ocupando.
Adems:
No contiene estructuras y uniones (struct y union).
No contiene tipos de datos sin signo.
No permite alias (typedef).
No tiene conversin automtica de tipos compatibles.
7
Garbage Collector.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 53 -
Archi vos .j ava y .cl ass
En J ava el cdigo fuente se almacena en archivos con extensin .java,
mientras que el bytecode o cdigo compilado se almacena en archivos .class. El
compilador de J ava crea un archivo .class por cada declaracin de clase que
encuentra en el archivo .java.
Un archivo de cdigo fuente debe tener solo una clase principal, y esta debe
tener exactamente el mismo nombre que el del archivo .java. Por ejemplo, si
tengo una clase que se llama Alumno, el archivo de cdigo fuente se llamar
Alumno.java. Al compilar, el archivo resultante ser Alumno.class.
Programas generados con j ava
Existen dos tipos principales de programas en J ava
8
:
Por un lado estn las aplicaciones, las cuales son programas standalone,
escritos en J ava y ejecutados por un intrprete del cdigo de bytes desde la lnea
de comandos del sistema.
Por otra parte, los Applets, que son pequeas aplicaciones escritas en J ava,
las cuales siguen un conjunto de convenciones que les permiten ejecutarse dentro
de un navegador. Estos applets siempre estn incrustados en una pgina html.
En trminos del cdigo fuente las diferencias entre un applet y una
aplicacin son:
Una aplicacin debe definir una clase que contenga el mtodo main(),
que controla su ejecucin. Un applet no usa el mtodo main(); su
8
Se presenta la divisin clsica de los programas de Java, aunque existen algunas otras opciones no son
relevantes en este curso.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 54 -
ejecucin es controlado por varios mtodos definidos en la clase
applet.
Un applet, debe definir una clase derivada de la clase Applet.
El Java Devel opers Ki t
La herramienta bsica para empezar a desarrollar aplicaciones o applets en
J ava es el J DK (Java Development Kit) o Kit de Desarrollo J ava, que consiste,
bsicamente, en un compilador y un intrprete (J VM
9
) para la lnea de comandos.
No dispone de un entorno de desarrollo integrado (IDE), pero es suficiente para
aprender el lenguaje y desarrollar pequeas aplicaciones.
10
Los principales programas del Java Development Kit:
javac. Es el compilador en lnea del J DK.
java. Es la mquina virtual para aplicaciones de J ava.
appletviewer. Visor de applets de java.
Compilacin
Utilizando el J DK, los programas se compilan desde el smbolo del sistema
con el compilador javac.
Ejemplo:
C: \ Mi sPr ogr amas> j avac Mi Cl ase. j ava
9
Java Virtual Machine
10
Este kit de desarrollo es gratuito y puede obtenerse de la direccin proporcionada al final de este
documento. Aunque en este curso se usara Eclipse, el jdk debe estar instalado para poder usar Java en
Eclipse.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 55 -
Normalmente se compila como se ha mostrado en el ejemplo anterior. Sin
embargo, el compilador proporciona diversas opciones a travs de modificadores
que se agregan en la lnea de comandos.
Sintaxis:
j avac [ opci ones] <ar chi vo1. j ava>
donde opciones puede ser:
- cl asspat h <r ut a> Indica donde buscar los archivos de clasede J ava
- d <di r ect or i o> Indica el directorio destino para los archivos .class
- g Habilita la generacin de tablas de depuracin.
- nowar n Deshabilita los mensajes del compilador.
- O Optimiza el cdigo, generando en lnea los mtodos
estticos, finales y privados.
- ver bose Indica cul archivo fuente se esta compilando.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 56 -
Hol a Mundo
Para no ir en contra de la tradicin al comenzar a utilizar un lenguaje, los
primeros ejemplos sern precisamente dos programas muy simples que lo nico
que van a hacer es desplegar el mensaje Hola Mundo.
Hola mundo bsico en J ava
El primero es una aplicacin que va a ser interpretado posteriormente por la
mquina virtual:
public class Hol aMundo {
public static void mai n( St r i ng ar gs[ ] ) {
Syst em. out. pr i nt l n( " Hol a, Mundo! " ) ;
}
}
Para los que han programado en C C++, notarn ya ciertas similitudes. Lo
importante aqu es que una aplicacin siempre requiere de un mtodo main, este
tiene un solo argumento (String args[ ]), a travs del cual recibe informacin de
los argumentos de la lnea de comandos, pero la diferencia con los lenguajes
C/C++es que este mtodo depende de una clase, en este caso la clase
HolaMundo. Este programa es compilado en al jdk
11
:
%j avac Hol aMundo. j ava
con lo que, si el programa no manda errores, se obtendr el archivo
HolaMundo.class.
11
Se asume que el jdk se encuentra instalado y que el PATH tiene indicado el directorio bin del jdk para que
encuentre el programa javac. Tambin es recomendable aadir nuestro directorio de programas de java a una
variable de ambiente llamada CLASSPATH.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 57 -
En Eclipse, al grabar automticamente el programa se compilara (si la
opcion Build Automatically esta activada). De hecho, algunos errores se van
notificando, si los hay, conforme se va escribiendo el codigo en el editor.
Hola mundo bsico en C++
En C++no estamos obligados a usar clases, por lo que un Hola mundo en
C++- aunque no en objetos podra quedar de la siguiente forma:
#include <i ost r eam>
using namespace st d;
int mai n( ) {
cout << " Hol a Mundo! " << endl ;
return 0;
}
Hola mundo en un J ava Applet
Regresando a J ava, veamos ahora la contraparte de este programa, que es el
applet Hola, el cual difiere sustancialmente del programa pasado:
import j ava. appl et . Appl et ;
import j ava. awt . Gr aphi cs;
import j ava. awt . Col or ;
public class Hol a extends Appl et {
public void pai nt ( Gr aphi cs g) { / / J ava l l ama a pai nt
aut omt i cament e
g. set Col or ( Col or . red) ;
g. dr awSt r i ng( " Hol a, Mundo! " , 0, 50) ;
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 58 -
Este programa tiene diferentes requerimientos a una aplicacin. En principio
carece de un mtodo main, y en su lugar cuenta con un mtodo paint el cual es
llamado por el navegador que cargue la pgina que contenga al applet.
Otro aspecto interesante es el uso de la instruccin import. Las clases en
J ava estn organizadas en paquetes, y son similares a las libreras de C++para
agrupar funciones. Puede utilizarse opcionalmente la instruccin import, o hacer
referencia a toda la ruta completa cada vez que se usa una clase:
j ava. ut i l . Hasht abl e mi Tabl a = new j ava. ut i l . Hast abl e( ) ;
es equivalente a:
import j ava. ut i l . Hasht abl e; / / i mpor t ar est a cl ase
. . .
Hasht abl e mi Tabl e = new Hasht abl e( ) ;
Existen algunas clases que no necesitan ser importadas, como la clase
System, estas son las que se encuentran dentro del paquete java.lang, pues son
importadas automticamente para todo programa de J ava.
Tambin es posible importar todas las clases de un paquete mediante el uso
del *. Ejemplo:
import j ava. awt . *;
La compilacin del applet se realiza de la misma forma que con la
aplicacin. Una vez que se tiene el archivo de clase, en el jdk no es posible
todava ejecutar nuestro applet. Hay que preparar un archivo html para que haga
referencia al applet. La creacin del archivo html es no necesaria para ejecutar el
applet desde Eclipse.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 59 -
Archivo HTML
Anteriormente se mencion que un applet debe ser invocado desde una
pgina de html. Slo es necesario agregar la etiqueta <APPPLET>para indicar el
archivo de bytecode del applet.
Ejemplo de etiqueta en html:
<APPLET CODE=Hol a. cl ass WI DTH=250 HEI GHT=300></ APPLET>
donde es especificado el nombre de la clase y, el ancho y alto que va a
ocupar para desplegarse el applet dentro de la pgina html. La ubicacin del
applet depender de la ubicacin de la etiqueta dentro de la pgina.
Ejecucin
Para ejecutar una aplicacin usamos la mquina virtual proporcionada por el
jdk, proporcionando el nombre de la clase:
%j ava Hol aMundo
Para la ejecucin de un applet utilizamos el appletviewer, tambin
proporcionado por el jdk:
%appl et vi ewer hol a. ht ml
La ejecucin del applet desde Eclipse implica seleccionar la opcion de Run
as y posteriormente Java Applet del men o icono de ejecucin, o del men
contextual.
Un applet en realidad es construido para se ejecutado por un navegador. El
appletviewer es una versin reducida de un navegador que es utilizada para
probar los applets. Un vez que vean que su applet se ejecuta en el visor de applets
prubenlo en su navegador Firefox Explorer.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 60 -
Es recomendable que primero prueben los applets en el visor, ya que este
soporta la misma versin de J ava del jdk que tengan instalado. Dependiendo de su
configuraron, los navegadores no siempre soportan la ltima versin de J ava.
Hola mundo en Eclipse
Probar estos ejemplos en Eclipse debe crearse un proyecto en J ava. Como en J ava
no hay funciones independientes, los archivos que se aaden al proyecto son
archivos de clases. Al aadir una clase al proyecto aparece la siguiente ventana:
La informacin mnima necesaria es el nombre de la clase. La extensin del
archivo (.java) ser colocada por Eclipse.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 61 -
Fundamentos del Lenguaje Java
En esta seccin se hablara de cmo est constituido el lenguaje, sus
instrucciones, tipos de datos, etc. Antes de comenzar a hacer programacin
orientada a objetos.
Comentarios
Los comentarios en los programas fuente son muy importantes en cualquier
lenguaje. Sirven para aumentar la facilidad de comprensin del cdigo y para
recordar ciertas cosas sobre el mismo. Son porciones del programa fuente que el
compilador omite, y, por tanto, no ocuparn espacio en el archivo de clase.
Existen tres tipos de comentarios en J ava:
Si el comentario que se desea escribir es de una sola lnea, basta con poner
dos barras inclinadas //. Por ejemplo:
for ( i =0; i <20; i ++) / / coment ar i o de ci cl o
{
Syst em. out . pr i nt l n( Adi s) ;
}
No puede ponerse cdigo despus de un comentario introducido por // en la
misma lnea, ya que desde la aparicin de las dos barras inclinadas // hasta el final
de la lnea es considerado como comentario e ignorado por el compilador.
Si un comentario debe ocupar ms de una lnea, hay que anteponerle /* y al
final */. Por ejemplo:
/ * Est o es un
coment ar i o que
ocupa t r es l neas */
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 62 -
Existe otro tipo de comentario que sirve para generar documentacin
automticamente en formato HTML mediante la herramienta javadoc.
Puede ocupar varias lneas y se inicia con /** para terminar con */. Para
mas informacin ver: http://java.sun.com/j2se/javadoc/
Tipos de datos
En J ava existen dos tipos principales de datos:
1. Tipos de datos simples.
2. Referencias a objetos.
Los tipos de datos simples son aquellos que pueden utilizarse directamente
en un programa, sin necesidad del uso de clases. Estos tipos son:
byte
short
int
long
float
double
char
boolean
El segundo tipo est formado por todos los dems. Se les llama referencias
porque en realidad lo que se almacena en los mismos son punteros a reas de
memoria donde se encuentran almacenadas las estructuras de datos que los
soportan. Dentro de este grupo se encuentran las clases (objetos) y tambin se
incluyen las interfaces, los vectores y las cadenas o Strings.
Pueden realizarse conversiones entre los distintos tipos de datos (incluso
entre simples y referenciales), bien de forma implcita o de forma explcita.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 63 -
Tipos de datos simples
Los tipos de datos simples en J ava tienen las siguientes caractersticas:
TIPO Descripcin Formato long. Rango
byte byte C-2
12
1 byte - 128 127
short entero corto C-2 2
bytes
- 32.768 32.767
int entero C-2 4
bytes
- 2.147.483.648
2.147.483.647
long entero largo C-2 8
bytes
-9.223.372.036.854.775.808
9.223.372.036.854.775.807
float real en coma
flotante de
precisin
simple
IEEE
754
32
bits
3,4*10-38 3,4*1038
double real en coma
flotante de
precisin
doble
IEEE
754
64
bits
1,7*10-308 1,7*10308
char Carcter Unicode 2
bytes
0 65.535
boolean Lgico 1 bit true / false
No existen ms datos simples en J ava. Incluso stos que se enumeran
pueden ser remplazados por clases equivalentes (Integer, Double, Byte, etc.), con
la ventaja de que es posible tratarlos como si fueran objetos en lugar de datos
simples.
A diferencia de otros lenguajes de programacin como C, en J ava los tipos
de datos simples no dependen de la plataforma ni del sistema operativo. Un
12
C-2 =Complemento a dos.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 64 -
entero de tipo int siempre tendr 4 bytes, por lo que no tendremos resultados
inesperados al migrar un programa de un sistema operativo a otro.
Eso s, J ava no realiza una comprobacin de los rangos. Por ejemplo: si a
una variable de tipo short con el valor 32.767 se le suma 1, el resultado ser -
32.768 y no se producir ningn error de ejecucin.
Los valores que pueden asignarse a variables y que pueden ser utilizados en
expresiones directamente reciben el nombre de literales.
Referencias a objetos
El resto de tipos de datos que no son simples, son considerados referencias.
Estos tipos son bsicamente apuntadores a las instancias de las clases, en las que
se basa la programacin orientada a objetos.
Al declarar un objeto perteneciente a una determinada clase, se indica que
ese identificador de referencia tiene la capacidad de apuntar a un objeto del tipo al
que pertenece la variable. El momento en el que se realiza la reserva fsica del
espacio de memoria es cuando se instancia el objeto realizando la llamada a su
constructor, y no en el momento de la declaracin.
Existe un tipo referencial especial nominado por la palabra reservada null
que puede ser asignado a cualquier variable de cualquier clase y que indica que el
puntero no tiene referencia a ninguna zona de memoria (el objeto no est
inicializado).
Identifi cadores
Los identificadores son los nombres que se les da a las variables, clases,
interfaces, atributos y mtodos de un programa.
Existen algunas reglas bsicas para nombrar a los identificadores:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 65 -
1. J ava hace distincin entre maysculas y minsculas, por lo tanto, nombres o
identificadores como var1, Var1 y VAR1 son distintos.
2. Pueden estar formados por cualquiera de los caracteres del cdigo Unicode,
por lo tanto, se pueden declarar variables con el nombre: aoDeCreacin,
ram, etc.
3. El primer carcter no puede ser un dgito numrico y no pueden utilizarse
espacios en blanco ni smbolos coincidentes con operadores.
4. No puede ser una palabra reservada del lenguaje ni los valores lgicos true
o false.
5. No pueden ser iguales a otro identificador declarado en el mismo mbito.
6. Por convencin, los nombres de las variables y los mtodos deberan
empezar por una letra minscula y los de las clases por mayscula.
Adems, si el identificador est formado por varias palabras, la primera se
escribe en minsculas (excepto para las clases e interfaces) y el resto de palabras
se hace empezar por mayscula (por ejemplo: aoDeCreacin). Las constantes se
escriben en maysculas, por ejemplo MXIMO.
Esta ltima regla no es obligatoria, pero es conveniente ya que ayuda al
proceso de codificacin de un programa, as como a su legibilidad. Es ms
sencillo distinguir entre clases y mtodos, variables o constantes.
Variables
La declaracin de una variable se realiza de la misma forma que en C/C++.
Siempre contiene el nombre (identificador de la variable) y el tipo de dato al que
pertenece. El mbito de la variable depende de la localizacin en el programa
donde es declarada.
Ejemplo:
int x;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 66 -
Las variables pueden ser inicializadas en el momento de su declaracin,
siempre que el valor que se les asigne coincida con el tipo de dato de la variable.
Ejemplo:
int x = 0;
mbito de una variable.
El mbito de una variable es la porcin de programa donde dicha variable es
visible para el cdigo del programa y, por tanto, referenciable. El mbito de una
variable depende del lugar del programa donde es declarada, pudiendo pertenecer
a cuatro categoras distintas.
Variable local.
Atributo.
Parmetro de un mtodo.
Parmetro de un manejador de excepciones
13
.
Como puede observarse, no existen las variables globales. La utilizacin de
variables globales es considerada peligrosa, ya que podra ser modificada en
cualquier parte del programa y por cualquier procedimiento. A la hora de
utilizarlas hay que buscar dnde estn declaradas para conocerlas y dnde son
modificadas para evitar sorpresas en los valores que pueden contener.
Los mbitos de las variables u objetos en J ava siguen los criterios
clsicos, al igual que en la mayora de los lenguajes de programacin como
Pascal, C++, etc.
Si una variable que no es local no ha sido inicializada, tiene un valor
asignado por defecto. Este valor es, para las variables referencias a objetos, el
valor null. Para las variables de tipo numrico, el valor por defecto es cero, las
variables de tipo char, el valor \u0000 y las variables de tipo boolean, el valor
false.
13
Este se tocar en otra etapa del curso, al hablar de manejo de excepciones.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 67 -
Variables locales. Una variable local se declara dentro del cuerpo de un mtodo
de una clase y es visible nicamente dentro de dicho mtodo. Se puede declarar
en cualquier lugar del cuerpo, incluso despus de instrucciones ejecutables,
aunque es una buena costumbre declararlas justo al principio.
Ejemplo:
class Car act er {
char ch;
public Car act er ( char c) {
ch=c;
}
public void r epet i r ( int num) {
int i ;
for ( i =0; i <num; i ++)
Syst em. out. pr i nt l n( ch) ;
}
}
public class Ej 1 {
public static void mai n( St r i ng ar gument os[ ] ) {
Car act er car act er ;
car act er = new Car act er ( ' H' ) ;
car act er . r epet i r ( 20) ;
}
}
En este ejemplo existe una variable local: int i ; definida en el mtodo
repetir de la clase Caracter, por lo tanto, nicamente es visible dentro del mtodo
repetir. Tambin existe una variable local en el mtodo main. En este caso, la
variable local es un objeto: Car act er car act er ; que slo ser visible
dentro del mtodo en el que est declarada (main).
Es importante hacer notar que una declaracin como la anterior le indica al
compilador el tipo de la variable caracter pero no crea un objeto )la variable es
inicializada con el valor null). El operador que crea el objeto es new, que necesita
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 68 -
como nico parmetro el nombre del constructor, que ser el procedimiento que
asigna valor a ese objeto recin instanciado.
Cuando se pretende declarar mltiples variables del mismo tipo pueden
declararse, en forma de lista, separadas por comas:
Ejemplo:
int x, y, z; / / Decl ar a t r es var i abl es x, y, z de t i po ent er o.
Podran haberse inicializado en su declaracin de la forma:
int x=0, y=0, z=3;
No es necesario que se declaren al principio del mtodo. Puede hacerse en
cualquier lugar del mismo, incluso de la siguiente forma:
void r epet i r ( int num) {
for ( int i =0; i <num; i ++)
Syst em. out. pr i nt l n( ch) ;
}
Las variables locales pueden ser antecedidas por la palabra reservada final.
En ese caso, slo permiten que se les asigne un valor una nica vez
14
.
Ejemplo:
final int x=0;
No permitir que a x se le asigne ningn otro valor. Siempre contendr 0.
No es necesario que el valor se le asigne en el momento de la declaracin, podra
haberse asignado en cualquier otro lugar, pero una sola vez
15
.
14
final es utilizado para declarar algo similar a las constantes.
15
Esta posibilidad aparece por primera vez en la versin 1.1 del jdk.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 69 -
Ejemplo:
final int x;
. . .
x=y+2;
Despus de la asignacin x=y+2, no se permitir asignar ningn otro valor a
x.
Operadores
Los operadores son partes indispensables en la construccin de expresiones.
Existen muchas definiciones tcnicas para el trmino expresin. Puede decirse
que una expresin es una combinacin de operandos ligados mediante
operadores.
Los operandos pueden ser variables, constantes, funciones, literales, etc. y
los operadores se comentarn a continuacin.
Operadores aritmticos:
Operador Formato Descripcin
+ op1 +op2 Suma aritmtica de dos operandos
- op1 - op2 Resta aritmtica de dos operandos
-op1 Cambio de signo
* op1 * op2 Multiplicacin de dos operandos
/ op1 / op2 Divisin entera de dos operandos
% op1 % op2 Resto de la divisin entera ( o mdulo)
++ ++op1
op1++ Incremento unitario
-- -- op1
op1-- Decremento unitario
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 70 -
El operador - puede utilizarse en su versin unaria ( - op1 ) y la operacin
que realiza es la de invertir el signo del operando.
Como en C/C++, los operadores unarios ++y -- realizan un incremento y un
decremento respectivamente. Estos operadores admiten notacin prefija y
postfija.
++op1: En primer lugar realiza un incremento (en una unidad) de op1 y
despus ejecuta la instruccin en la cual est inmerso.
op1++: En primer lugar ejecuta la instruccin en la cual est inmerso y
despus realiza un incremento (en una unidad) de op1.
- - op1: En primer lugar realiza un decremento (en una unidad) de op1 y
despus ejecuta la instruccin en la cul est inmerso. Visin General y
elementos bsicos del lenguaje.
op1- - : En primer lugar ejecuta la instruccin en la cual est inmerso y
despus realiza un decremento (en una unidad) de op1.
La diferencia entre la notacin prefija y la postfija no tiene importancia en
expresiones en las que nicamente existe dicha operacin:
++cont ador ; / / es equi val ent e a: cont ador ++;
- - cont ador ; / / cont ador - - ;
La diferencia es apreciable en instrucciones en las cules estn incluidas
otras operaciones.
Ejemplo:
a = 1; a = 1;
b = 2 + a++; b = 2 + ++a;
En el primer caso, despus de las operaciones, b tendr el valor 3 y al valor
2. En el segundo caso, despus de las operaciones, b tendr el valor 4 y al valor 2.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 71 -
Operadores relacionales:
Operador Formato Descripcin
> op1 > op2
Devuelve true si op1 es mayor que
op2
< op1 < op2
Devuelve true si op1 es menor que
op2
>= op1 >= op2
Devuelve true si op1 es mayor o
igual que op2
<= op1<= op2
Devuelve true si op1 es menor o
igual que op2
== op1 == op2
Devuelve true si op1 es igual a op2
! = op1 ! = op2
Devuelve true si op1 es distinto de
op2
Los operadores relacionales actan sobre valores enteros, reales y
caracteres; y devuelven un valor del tipo boleano (true o false).
Ejemplo:
public class Rel aci onal {
public static void mai n( St r i ng ar g[ ] ) {
double op1, op2;
op1=1. 34;
op2=1. 35;
Syst em. out. pr i nt l n( " op1=" +op1+" op2=" +op2) ;
Syst em. out. pr i nt l n( " op1>op2 = " +( op1>op2) ) ;
Syst em. out. pr i nt l n( " op1<op2 = " +( op1<op2) ) ;
Syst em. out. pr i nt l n( " op1==op2 = " +( op1==op2) ) ;
Syst em. out. pr i nt l n( " op1! =op2 = " +( op1! =op2) ) ;
char op3, op4;
op3=' a' ; op4=' b' ;
Syst em. out. pr i nt l n( " ' a' >' b' = " +( op3>op4) ) ;
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 72 -
Operadores lgicos:
Operador Formato Descripcin
&& op1 && op2
Y lgico. Devuelve true si son ciertos op1 y
op2
| | op1 | | op2
O lgico. Devuelve true si son ciertos op1 o
op2
! ! op1
Negacin lgica. Devuelve true si es falso
op1.
Estos operadores actan sobre operadores o expresiones lgicas, es decir,
aquellos que se evalan a cierto o falso.
Ejemplo:
public class Bool {
public static void mai n ( St r i ng ar gument os[ ] ) {
boolean a=true;
boolean b=true;
boolean c=false;
boolean d=false;
Syst em. out. pr i nt l n( " t r ue Y t r ue = " + ( a && b) ) ;
Syst em. out. pr i nt l n( " t r ue Y f al se = " + ( a && c) ) ;
Syst em. out. pr i nt l n( " f al se Y f al se = " + ( c && d) ) ;
Syst em. out. pr i nt l n( " t r ue O t r ue = " + ( a | | b) ) ;
Syst em. out. pr i nt l n( " t r ue O f al se = " + ( a | | c) ) ;
Syst em. out. pr i nt l n( " f al se O f al se = " + ( c | | d) ) ;
Syst em. out. pr i nt l n( " NO t r ue = " + ! a) ;
Syst em. out. pr i nt l n( " NO f al se = " + ! c) ;
Syst em. out. pr i nt l n( " ( 3 > 4) Y t r ue = " + ( ( 3 >4) && a)
) ;
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 73 -
Operadores de bits:
Operador Formato Descripcin
>> op1 >> op2
Desplaza op1, op2 bits a la derecha
<< op1 << op2
Desplaza op1, op2 bits a la izquierda
>>> op1 >>> op2
Desplaza op1, op2 bits a la derecha (sin signo).
& op1 & op2
Realiza un Y (AND) a nivel de bits
| op1 | op2
Realiza un O (OR) a nivel de bits
^ op1 ^ op2
Realiza un O exclusivo (XOR) a nivel de bits
~ ~op1
Realiza el complemento de op1 a nivel de bits.
Los operadores de bits actan sobre valores enteros (byte, short, int y long)
o caracteres (char).
Ejemplo:
public class Bi t s {
public static void mai n ( St r i ng ar gument os[ ] ) {
byte a=12;
byte b=- 12;
byte c=6;
Syst em. out. pr i nt l n( " 12 >> 2 = " + ( a >> 2) ) ;
Syst em. out. pr i nt l n( " - 12 >> 2 = " + ( b >> 2) ) ;
Syst em. out. pr i nt l n( " - 12 >>> 2 = " + ( b >>> 2) ) ;
Syst em. out. pr i nt l n( " 12 << 2 = " + ( a << 2) ) ;
Syst em. out. pr i nt l n( " - 12 << 2 = " + ( b << 2) ) ;
Syst em. out. pr i nt l n( " 12 & 6 = " + ( a & c) ) ;
Syst em. out. pr i nt l n( " 12 | 6 = " + ( a | c) ) ;
Syst em. out. pr i nt l n( " 12 ^ 6 = " + ( a ^ c) ) ;
Syst em. out. pr i nt l n( " ~12 = " + ~a) ;
}
}
Los nmeros negativos se almacenan en Complemento a dos (c-2), lo que
significa que para almacenar el nmero negativo se toma el positivo en binario, se
cambian unos por ceros y viceversa, y despus se le suma 1 en binario.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 74 -
Operadores de asignacin:
El operador de asignacin es el smbolo igual ( =).
op1 = Expr esi n;
Asigna el resultado de evaluar la expresin de la derecha a op1.
Adems del operador de asignacin existen unas abreviaturas, como en
C/C++, cuando el operando que aparece a la izquierda del smbolo de asignacin
tambin aparece a la derecha del mismo:
Operador Formato Equivalencia
+= op1 += op2 op1 = op1 + op2
- = op1 - = op2 op1 = op1 - op2
*= op1 *= op2 op1 = op1 * op2
/ = op1 / = op2 op1 = op1 / op2
%= op1 %= op2 op1 = op1 %op2
&= op1 &= op2 op1 = op1 & op2
| = op1 | = op2 op1 = op1 | op2
^= op1 ^= op2 op1 = op1 ^ op2
>>= op1 >>= op2 op1 = op1 >> op2
<<= op1 <<= op2 op1 = op1 << op2
>>>= op1 >>>= op2 op1 = op1 >>> op2
Precedencia de operadores en J ava
La precedencia indica el orden en que es resuelta una expresin, la siguiente
lista muestra primero los operadores de mayor precedencia.
Operadores postfijos
[ ] . ( par nt esi s)
Operadores unarios
++expr - - expr - expr ~ !
Creacin o conversin de tipo
new ( t i po) expr
Multiplicacin y divisin
* / %
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 75 -
Suma y resta
+ -
Desplazamiento de bits
<< >> >>>
Relacionales
< > <= >=
Igualdad y desigualdad
== ! =
AND a nivel de bits
&
XOR a nivel de bits
^
OR a nivel de bits
|
AND lgico
&&
OR lgico
| |
Condicional terciaria
? :
Asignacin
= += - = *= / = %= ^= &= | = >>= <<=
>>>=
Valores li terales
A la hora de tratar con valores de los tipos de datos simples (y Strings) se
utiliza lo que se denomina literales. Los literales son elementos que sirven para
representar un valor en el cdigo fuente del programa.
En J ava existen literales para los siguientes tipos de datos:
Lgicos (boolean).
Carcter (char).
Enteros (byte, short, int y long).
Reales (double y float).
Cadenas de caracteres (String).
Literales lgicos
Son nicamente dos: las palabras reservadas true y false.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 76 -
Ejemplo:
boolean act i vado = false;
Literales de tipo entero
Son byte, short, int y long pueden expresarse en decimal (base 10), octal
(base 8) o hexadecimal (base 16). Adems, puede aadirse al final del mismo la
letra L para indicar que el entero es considerado como long (64 bits).
Literales de tipo real
Los literales de tipo real sirven para indicar valores float o double. A
diferencia de los literales de tipo entero, no pueden expresarse en octal o
hexadecimal.
Existen dos formatos de representacin: mediante su parte entera, el punto
decimal ( . ) y la parte fraccionaria; o mediante notacin exponencial o cientfica:
Ejemplos equivalentes:
3. 1415
0. 31415e1
. 31415e1
0. 031415E+2
. 031415e2
314. 15e- 2
31415E- 4
Al igual que los literales que representan enteros, se puede poner una letra
como sufijo. Esta letra puede ser una F o una D (mayscula o minscula
indistintamente).
F Trata el literal como de tipo float.
D Trata el literal como de tipo double.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 77 -
Ejemplo:
3. 1415F
. 031415d
Literales de tipo carcter
Los literales de tipo carcter se representan siempre entre comillas simples.
Entre las comillas simples puede aparecer:
Un smbolo (letra) siempre que el carcter est asociado a un cdigo
Unicode. Ejemplos: a , B , { , , .
Una secuencia de escape. Las secuencias de escape son combinaciones
del smbolo \ seguido de una letra, y sirven para representar caracteres que
no tienen una equivalencia en forma de smbolo.
Las posibles secuencias de escape son:
Secuencia de escape Significado
\ Comilla simple.
\ Comillas dobles.
\ \ Barra invertida.
\ b Backspace (Borrar hacia atrs).
\ n Cambio de lnea.
\ f Form feed.
\ r Retorno de carro.
\ t Tabulador.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 78 -
Literales de tipo String
Los Strings o cadenas de caracteres no forman parte de los tipos de datos
elementales en J ava, sino que son instanciados a partir de la clase
java.lang.String, pero aceptan su inicializacin a partir de literales de este tipo.
Un literal de tipo String va encerrado entre comillas dobles ( ) y debe estar
incluido completamente en una sola lnea del programa fuente (no puede dividirse
en varias lneas). Entre las comillas dobles puede incluirse cualquier carcter del
cdigo Unicode (o su cdigo precedido del carcter \ ) adems de las secuencias
de escape vistas anteriormente en los literales de tipo carcter. As, por ejemplo,
para incluir un cambio de lnea dentro de un literal de tipo String deber hacerse
mediante la secuencia de escape \n :
Ejemplo:
Syst em. out . pr i nt l n( " Pr i mer a l nea \ n Segunda l nea del
st r i ng\ n" ) ;
Syst em. out . pr i nt l n( " Hol \ u0061" ) ;
La visualizacin del String anterior mediante println() producira la siguiente
salida por pantalla:
Pr i mer a l nea
Segunda l nea del st r i ng
Hol a
La forma de incluir los caracteres: comillas dobles ( ) y barra invertida ( \ )
es mediante las secuencias de escape \ y \\ respectivamente (o mediante su
cdigo Unicode precedido de \ ).
Si la cadena es demasiado larga y debe dividirse en varias lneas en el
cdigo fuente, o simplemente concatenar varias cadenas, puede utilizarse el
operador de concatenacin de strings +.de la siguiente forma:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 79 -
Est e St r i ng es demasi ado l ar go par a est ar en una l nea +
del cdi go f uent e y se ha di vi di do en dos.
Estructuras de control
Las estructuras de control son construcciones definidas a partir de palabras
reservadas del lenguaje que permiten modificar el flujo de ejecucin de un
programa. De este modo, pueden crearse construcciones de decisin y ciclos de
repeticin de bloques de instrucciones.
Hay que sealar que, como en C/C++, un bloque de instrucciones se
encontrar encerrado mediante llaves {..} si existe ms de una instruccin.
Estructuras condicionales
Las estructuras condicionales o de decisin son construcciones que permiten
alterar el flujo secuencial de un programa, de forma que en funcin de una
condicin o el valor de una expresin, el mismo pueda ser desviado en una u otra
alternativa de cdigo.
Las estructuras condicionales disponibles en J ava son:
Estructura if-else.
Estructura switch.
if-else
Forma simple:
if ( <expr esi n>)
<Bl oque i nst r ucci ones>
El bloque de instrucciones se ejecuta si, y slo si, la expresin (que debe ser
lgica) se evala a verdadero, es decir, se cumple una determinada condicin.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 80 -
Ejemplo:
if ( cont == 0)
Syst em. out . pr i nt l n( " he l l egado a cer o" ) ;
La instruccin Syst em. out . pr i nt l n( he l l egado a cer o) ; slo se
ejecuta en el caso de que cont contenga el valor cero.
Forma bicondicional:
if ( <expr esi n>)
<Bl oque i nst r ucci ones 1>
else
<Bl oque i nst r ucci ones 2>
El bloque de instrucciones 1 se ejecuta si, y slo si, la expresin se evala
como verdadero. Y en caso contrario, si la expresin se evala como falso, se
ejecuta el bloque de instrucciones 2.
Ejemplo:
if ( cont == 0)
Syst em. out . pr i nt l n( " he l l egado a cer o" ) ;
else
Syst em. out . pr i nt l n( " no he l l egado a cer o" ) ;
En J ava, como en C/C++y a diferencia de otros lenguajes de programacin,
en el caso de que el bloque de instrucciones conste de una sola instruccin no
necesita ser encerrado en un bloque.
switch
Sintaxis:
switch ( <expr esi n>) {
case <val or 1>: <i nst r ucci ones1>;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 81 -
case <val or 2>: <i nst r ucci ones2>;
. . .
case <val or N>: <i nst r ucci onesN>;
}
En este caso, a diferencia del if, si <instrucciones1>, <instrucciones2>
<instruccionesN> estn formados por un bloque de instrucciones sencillas, no es
necesario encerrarlas mediante las llaves ( { } ).
En primer lugar se evala la expresin cuyo resultado puede ser un valor de
cualquier tipo. El programa comprueba el primer valor (valor1). En el caso de que
el valor resultado de la expresin coincida con valor1, se ejecutar el bloque
<instrucciones1>. Pero tambin se ejecutaran el bloque <instrucciones2>
<instruccionesN> hasta encontrarse con la palabra reservada break. Por lo que
comnmente se aade una instruccin break al final de cada caso del switch.
Ejemplo:
switch ( <expr esi n>) {
case <val or 1>: <i nst r ucci ones1>;
break;
case <val or 2>: <i nst r ucci ones2>;
break;
. . .
case <val or N>: <i nst r ucci onesN>;
}
Si el resultado de la expresin no coincide con <valor1>, evidentemente no
se ejecutaran <instrucciones1>, se comprobara la coincidencia con <valor2>y
as sucesivamente hasta encontrar un valor que coincida o llegar al final de la
construccin switch. En caso de que no exista ningn valor que coincida con el de
la expresin, no se ejecuta ninguna accin.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 82 -
Ejemplo:
public class Di aSemana {
public static void mai n( St r i ng ar gument os[ ] ) {
int di a;
if ( ar gument os. l engt h<1) {
Syst em. out. pr i nt l n( " Uso: Di aSemana num" ) ;
Syst em. out. pr i nt l n( " Donde num= n ent r e 1 y 7" ) ;
}
else {
di a=I nt eger . valueOf( ar gument os[ 0] ) . i nt Val ue( ) ;
switch ( di a) {
case 1: Syst em. out. pr i nt l n( " Lunes" ) ;
break;
case 2: Syst em. out. pr i nt l n( " Mar t es" ) ;
break;
case 3: Syst em. out. pr i nt l n( " Mi r col es" ) ;
break;
case 4: Syst em. out. pr i nt l n( " J ueves" ) ;
break;
case 5: Syst em. out. pr i nt l n( " Vi er nes" ) ;
break;
case 6: Syst em. out. pr i nt l n( " Sbado" ) ;
break;
case 7: Syst em. out. pr i nt l n( " Domi ngo" ) ;
}
}
}
}
Ntese que en el caso de que se introduzca un valor no comprendido entre 1 y 7,
no se realizar ninguna accin. Esto puede corregirse agregando la opcin por
omisin:
default: i nst r ucci onesPor Def ect o;
donde la palabra reservada default, sustituye a case <expr> para ejecutar el
conjunto de instrucciones definido en caso de que no coincida con ningn otro
caso.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 83 -
Ciclos.
Los ciclos o iteraciones son estructuras de repeticin. Bloques de
instrucciones que se repiten un nmero de veces mientras se cumpla una
condicin o hasta que se cumpla una condicin.
Existen tres construcciones para estas estructuras de repeticin:
Ciclo for.
Ciclo do-while.
Ciclo while.
Como regla general puede decirse que se utilizar el ciclo for cuando se
conozca de antemano el nmero exacto de veces que ha de repetirse un
determinado bloque de instrucciones. Se utilizar el ciclo do-while cuando no se
conoce exactamente el nmero de veces que se ejecutar el ciclo pero se sabe que
por lo menos se ha de ejecutar una. Se utilizar el ciclo while cuando es posible
que no deba ejecutarse ninguna vez. Con mayor o menor esfuerzo, puede
utilizarse cualquiera de ellas indistintamente.
Ciclo for.
Sintaxis:
for ( <i ni ci al i zaci n> ; <condi ci n> ; <i ncr ement o>)
<bl oque i nst r ucci ones>
La clusula inicializacin es una instruccin que se ejecuta una sola vez al
inicio del ciclo, normalmente para inicializar un contador.
La clusula condicin es una expresin lgica, que se evala al inicio de
cada nueva iteracin del ciclo. En el momento en que dicha expresin se
evale a falso, se dejar de ejecutar el ciclo y el control del programa pasar
a la siguiente instruccin (a continuacin del ciclo for).
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 84 -
La clusula incremento es una instruccin que se ejecuta en cada iteracin
del ciclo como si fuera la ltima instruccin dentro del bloque de
instrucciones. Generalmente se trata de una instruccin de incremento o
decremento de alguna variable.
Cualquiera de estas tres clusulas puede estar vaca, aunque siempre hay que
poner los puntos y coma ( ; ).
El siguiente programa muestra en pantalla la serie de Fibonacci hasta el
trmino que se indique al programa como argumento en la lnea de comandos.
Siempre se mostrarn, por lo menos, los dos primeros trminos
Ejemplo:
/ / si empr e se most r ar n, por l o menos, l os dos pr i mer os
/ / t r mi nos
public class Fi bonacci {
public static void mai n( St r i ng ar gument os[ ] ) {
int numTer m, v1=1, v2=1, aux, cont ;
if ( ar gument os. l engt h<1) {
Syst em. out. pr i nt l n( " Uso: Fi bonacci num" ) ;
Syst em. out. pr i nt l n( " Donde num= n de t r mi nos" ) ;
}
else {
numTer m=I nt eger . valueOf( ar gument os[ 0] ) . i nt Val ue( ) ;
Syst em. out. pr i nt ( " 1, 1" ) ;
for ( cont =2; cont <numTer m; cont ++) {
aux=v2;
v2+=v1;
v1=aux;
Syst em. out. pr i nt ( " , " +v2) ;
}
Syst em. out. pr i nt l n( ) ;
}
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 85 -
Ciclo do-while.
Sintaxis:
do
<bl oque i nst r ucci ones>
while ( <Expr esi n>) ;
En este tipo de ciclo, el bloque instrucciones se ejecuta siempre una vez por
lo menos, y el bloque de instrucciones se ejecutar mientras <Expr esi n> se
evale como verdadero. Por lo tanto, entre las instrucciones que se repiten deber
existir alguna que, en algn momento, haga que la expresin se evale como
falso, de lo contrario el ciclo sera infinito.
Ejemplo:
/ / El mi smo que ant es ( Fi bonacci ) .
class Fi bonacci 2 {
public static void mai n( St r i ng ar gument os[ ] ) {
int numTer m, v1=0, v2=1, aux, cont =1;
if ( ar gument os. l engt h<1) {
Syst em. out. pr i nt l n( " Uso: Fi bonacci num" ) ;
Syst em. out. pr i nt l n( " Donde num= n de t r mi nos" ) ;
}
else {
numTer m=I nt eger . valueOf( ar gument os[ 0] ) . i nt Val ue( ) ;
Syst em. out. pr i nt ( " 1" ) ;
do {
aux=v2;
v2+=v1;
v1=aux;
Syst em. out. pr i nt ( " , " +v2) ;
} while ( ++cont <numTer m) ;
Syst em. out. pr i nt l n( ) ;
}
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 86 -
En este caso nicamente se muestra el primer trmino de la serie antes de
iniciar el ciclo, ya que el segundo siempre se mostrar, porque el ciclo do-while
siempre se ejecuta una vez por lo menos.
Ciclo while.
Sintaxis:
while ( <Expr esi n>)
<bl oque i nst r ucci ones>
Al igual que en el ciclo do-while del apartado anterior, el bloque de
instrucciones se ejecuta mientras se cumple una condicin (mientras Expresin se
evale verdadero), pero en este caso, la condicin se comprueba antes de empezar
a ejecutar por primera vez el ciclo, por lo que si Expresin se evala como falso
en la primera iteracin, entonces el bloque de instrucciones no se ejecutar
ninguna vez.
Ejemplo:
/ / Fi bonacci :
class Fi bonacci 3 {
public static void mai n( St r i ng ar gument os[ ] ) {
int numTer m, v1=1, v2=1, aux, cont =2;
if ( ar gument os. l engt h<1) {
Syst em. out. pr i nt l n( " Uso: Fi bonacci num" ) ;
Syst em. out. pr i nt l n( " Donde num= n de t r mi nos" ) ;
}
else {
numTer m=I nt eger . valueOf( ar gument os[ 0] ) . i nt Val ue( ) ;
Syst em. out. pr i nt ( " 1, 1" ) ;
while ( cont ++<numTer m) {
aux=v2;
v2+=v1;
v1=aux;
Syst em. out. pr i nt ( " , " +v2) ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 87 -
}
Syst em. out. pr i nt l n( ) ;
}
}
}
Como puede comprobarse, las tres construcciones de ciclo (for, do-while y
while) pueden utilizarse indistintamente realizando unas pequeas variaciones en
el programa.
Saltos
En J ava existen dos formas de realizar un salto incondicional en el flujo
normal de un programa: las instrucciones break y continue.
break. La instruccin break sirve para abandonar una estructura de control, tanto
de las alternativas (if-else y switch) como de las repetitivas o ciclos (for, do-while
y while). En el momento que se ejecuta la instruccin break, el control del
programa sale de la estructura en la que se encuentra.
Ejemplo:
class Br eak {
public static void mai n( St r i ng ar gument os[ ] ) {
int i ;
for ( i =1; i <=4; i ++) {
if ( i ==3)
break;
Syst em. out. pr i nt l n( " I t er aci on: " +i ) ;
}
}
}
Aunque el ciclo, en principio indica que se ejecute 4 veces, en la tercera
iteracin, i contiene el valor 3, se cumple la condicin de i==3 y por lo tanto se
ejecuta el break y se sale del ciclo for.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 88 -
continue. La instruccin continue sirve para transferir el control del programa
desde la instruccin continue directamente a la cabecera del ciclo (for, do-while o
while) donde se encuentra.
Ejemplo:
public class Cont i nue {
public static void mai n( St r i ng ar gument os[ ] ) {
int i ;
for ( i =1; i <=4; i ++) {
if ( i ==3)
continue;
Syst em. out. pr i nt l n( " I t er eaci n: " +i ) ;
}
}
}
Puede comprobarse la diferencia con respecto al resultado del ejemplo del
apartado anterior. En este caso no se abandona el ciclo, sino que se transfiere el
control a la cabecera del ciclo donde se contina con la siguiente iteracin.
Tanto el salto break como en el salto continue, pueden ser evitados
mediante distintas construcciones pero en ocasiones esto puede empeorar la
legibilidad del cdigo. De todas formas existen programadores que no aceptan
este tipo de saltos y no los utilizan en ningn caso; la razn es que - se dice - que
atenta contra las normas de las estructuras de control.
Arreglos
Para manejar colecciones de objetos del mismo tipo estructurados en una
sola variable se utilizan los arreglos.
En J ava, los arreglos son en realidad objetos y por lo tanto se puede llamar a
sus mtodos. Existen dos formas equivalentes de declarar arreglos en J ava:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 89 -
t i po nombr eDel Ar r egl o[ ] ;
t i po[ ] nombr eDel Ar r egl o;
Ejemplo:
int ar r egl o1[ ] , ar r egl o2[ ] , ent er o; / / ent er o no es un ar r egl o
int[ ] ot r oAr r egl o;
Tambin pueden utilizarse arreglos de ms de una dimensin:
Ejemplo:
int mat r i z[ ] [ ] ;
int [ ] [ ] ot r aMat r i z;
Los arreglos, al igual que las dems variables pueden ser inicializados en el
momento de su declaracin. En este caso, no es necesario especificar el nmero
de elementos mximo reservado. Se reserva el espacio justo para almacenar los
elementos aadidos en la declaracin.
Ejemplo:
St r i ng D as[ ] ={" Lunes" , " Mar t es" , " Mi r col es" , " J ueves" ,
" Vi er nes" , " Sbado" , " Domi ngo" };
Una simple declaracin de un vector no reserva espacio en memoria, a
excepcin del caso anterior, en el que sus elementos obtienen la memoria
necesaria para ser almacenados. Para reservar la memoria hay que llamar
explcitamente a new de la siguiente forma:
new t i poEl ement o[ <numEl ement os> ] ;
Ejemplo:
int mat r i z[ ] [ ] ;
mat r i z = new int[ 4] [ 7] ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 90 -
Tambin se puede indicar el nmero de elementos durante su declaracin:
Ejemplo:
int vect or [ ] = new int[ 5] ;
Para hacer referencia a los elementos particulares del arreglo, se utiliza el
identificador del arreglo junto con el ndice del elemento entre corchetes. El
ndice del primer elemento es el cero y el del ltimo, el nmero de elementos
menos uno.
Ejemplo:
j = vect or [ 0] ; vect or [ 4] = mat r i z[ 2] [ 3] ;
El intento de acceder a un elemento fuera del rango del arreglo, a diferencia
de lo que ocurre en C, provoca una excepcin (error) que, de no ser manejado por
el programa, ser la mquina virtual quien aborte la operacin.
Para obtener el nmero de elementos de un arreglo en tiempo de ejecucin
se accede al atributo de la clase llamado length. No olvidemos que los arreglos en
J ava son tratados como un objeto.
Ejemplo:
class Ar r ay1 {
public static void mai n ( St r i ng ar gument os[ ] ) {
St r i ng col or es[ ] = {" Roj o" , " Ver de" , " Azul " ,
" Amar i l l o" , " Negr o" };
int i ;
for ( i =0; i <col or es. l engt h; i ++)
Syst em. out. pr i nt l n( col or es[ i ] ) ;
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 91 -
Usando J ava 5.0 (jdk 1.5) podemos simplificar el recorrido del arreglo:
public class Meses {
public static void mai n( St r i ng[ ] ar gs) {
St r i ng meses[ ] =
{" Ener o" , " Febr er o" , " Mar zo" , " Abr i l " , " Mayo" ,
" J uni o" , " J ul i o" , " Agost o" , " Sept i embr e" , " Oct ubr e" ,
" Novi embr e" , " Di ci embr e" };
/ / f or ( i nt i = 0; i < meses. l engt h; i ++ )
/ / Syst em. out . pr i nt l n( " mes: " + meses[ i ] ) ;
/ / si nt axi s par a r ecor r er el ar r egl o y asi gnar
/ / el si gui ent e el ement o a l a var i abl e mes en cada
ci cl o
/ / i nst r ucci on " f or each" a par t i r de ver si on 5. 0 ( 1. 5
del j dk)
for( St r i ng mes: meses)
Syst em. out. pr i nt l n( " mes: " + mes) ;
}
}
Con Eclipse, aparte de contar al menos con el jdk 1.5, la opcin de compilacin
debe estar ajustada para que revise que el cdigo sea compatible con esa versin:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 92 -
Enumeraci ones
J ava desde la versin 5 incluye el manejo de enumeraciones. Las enumeraciones
sirven para agrupar un conjunto de elementos dentro de un tipo definido. Antes,
una manera simple de definir un conjunto de elementos como si fuera una
enumeracin era, por ejemplo:
public static final int TEMPO_PRI MAVERA = 0;
public static final int TEMPO_VERANO = 1;
public static final int TEMPO_OTOO = 2;
public static final int TEMPO_I NVI ERNO = 3;
Lo cual puede ser problemtico pues no es realmente un tipo de dato, sino un
conjunto de constantes enteras. Tampoco tienen un espacio de nombres definido
por lo que tienen que definirse nombre. La impresin de estos datos, puesto que
son enteros, despliega solo el valor numrico a menos que sea interpretado
explcitamente por cdigo adicional en el programa.
El manejo de enumeraciones en J ava tiene la sintaxis de C, C++y C#:
enum <nombr eEnum> { <elem 1>, <elem 2>, , <elem n> }
Por lo que para el cdigo anterior, la enumeracin sera:
enum Tempor ada { PRIMAVERA, VERANO, OTOO, INVIERNO }
La sintaxis completa de enum es ms compleja, ya que una enumeracin en J ava
es realmente una clase, por lo que puede tener mtodos en su definicin. Tambin
es posible declarar la enumeracin como pblica, en cuyo caso debera ser
declarada en su propio archivo.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 93 -
Ejemplo:
enum Tempor ada { PRIMAVERA, VERANO, OTOO, INVIERNO }
public class EnumEj {
public static void mai n( St r i ng[ ] ar gs) {
Tempor ada t em;
t em=Tempor ada. PRIMAVERA;
Syst em. out. pr i nt l n( " Tempor ada: " + t em) ;
Syst em. out. pr i nt l n( " \ nLi st ado de t empor adas: " ) ;
for( Tempor ada t : Tempor ada. values( ) )
Syst em. out. pr i nt l n( " Tempor ada: " + t ) ;
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 94 -
Introduccin a Ruby
Ruby es un lenguaje definido para ser dinmico, reflectivo y orientado a objetos.
Combina una sintaxis inspirada en Perl y similar a las caractersitcas orientadas a
objetos de Smalltalk. Tambin comparte ciertas caractersticas con Phyton, Lisp,
Dylan, y CLU.
Ruby fue creado por Yukihiro Matsumoto con la idea de
crear un lenguaje que balanceara la programacin funcional
con la programacin imperativa.
El lenguaje fue liberado desde un inicio como open source
(1995) y en los ltimos aos ha crecido su aceptacin
masivamente.
Matsumoto dice haber puesto nfasis en crear un lenguaje
productivo y divertido, siguiendo los principios de buen
dise de interfaz con el usuario. Remarka que el diseo de
sistemas necesita tambin- enfatizar las necesidades
humanas, en lugar de las de la computadora.
Ruby es actualmente un lenguaje interpretado aunque se pretende que a partir de
la versin 1.9 sea semi-compilado y ejecutado por una mquina virtual, de
manera similar a J ava.
Caractersticas
Ruby es principalmente un lenguaje orientado a objetos, pero tambin
es descrito como un lenguaje multiparadigma: permite programacin
procedural, con orientacin a objetos y declaraciones funcionales.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 95 -
Un resumen de sus caractersticas puede verse enseguida:
Orientado a objetos
4 niveles de alcance de variables: global, clase, instancia y local
Manejo de exepciones
Expresiones regulares nativas al nivel del lenguaje (perl-like)
Sobrecarga de operadores
Recolector automtico de basura
Biblioteca dinmica compartida en la mayora de las plataformas
Soporta introspeccin, reflexin y metaprogramacin
Soporta continuations y generators
Comparado con C
Similitudes
Puedes programar proceduralmente si lo deseas, pero an sera orientado a
objetos internamente.
La mayora de los operadores son los mismos. Pero no cuenta con ++o --.
Se pueden tener constantes, aunque no hay una instruccin const.
Las cadenas van entre comillas y son mutables.
Se cuenta con un depurador en lnea.
Diferencias
Los objetos tienen un tipo fuerte y las variables no tienen tipo.
No cuenta con macros o preprocesador.
No tiene enmascaramiento.
No tiene apuntadores, ni aritmtica de apuntadores.
No tiene tupedef, sizeof, ni enumeraciones.
No archivos de encabezados.
No maneja #define. Pero puedas usar constantes.
Es interpretado en tiempo de ejecucin, por lo que no hay cdigo compilado
o byt-code de ningn tipo.
Cuenta con recolector de basura.
Los argumentos son pasados por referencia, no por valor.
No usa ; obligatoriamente para finalizar instrucciones
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 96 -
Condiciones para if y while van sin parntesis.
Parntesis para llamadas a mtodos son frecuentemente opcionales.
Usualmente no se usan llaves. Usualmente se finalizan las instrucciones de
multiples lneas con una palabra clave.
No hay declaraciones de variables. Asignas nombre conforme los necesitas.
Slo falso y nulo evaluan como falso. Cualquier otro valor es verdadero
(incluyendo 0 cero-)
No hay tipo char.
Cadenas no terminan con un valor nulo.
Los arreglos automticamente se agrandan conforme vas necesitando ms
elementos.
Comparado con C++
Similitudes
Public, protected y private realizan actividades similares.
Puedes poner tu cdigo en mdulos, similar a espacios de nombre en C++.
Excepciones trabajan de forma similar.
Diferencias
No hay referencias explcitas. En Ruby cada variable es un nombre
automticamente desreferenciado para un objeto.
El constructor es llamado initialize en lugar de usar el nombre de la clase.
Todos los mtodos son siempre virtuales.
Nombres de atributos de clase siempre empiezan con @@.
No es possible acceder directamente variables miembros. Todos los
atributos deben ser accedidos a mediante mtodos.
Se usa self en lugar de this.
Algunos mtodos terminan con ? o !. Es parte del nombre del mtodo.
No hay herencia multiple.
Existen algunas convenciones forzadas (e.g.; nombre de clases empiezan
con mayscula, variables inician con minuscula.)
Solo dos tipos de clases contenedoras: Array y Hash.
No hay conversiones de tipos automticas.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 97 -
Multihilos son implementados en el interprete (green threads). No son hilos
nativos.
Existe una biblioteca para pruebas de unidad como parte estndar del
lenguaje.
Comparado con J ava
Similitudes
La memoria es manejada automticamente mediante un recolector de
basura.
Los objetos son fuertemente tipados.
Hay mtodos pblicos, privados y protegidos.
Tiene herramientas de documentacin embebidas (la de Ruby se llama
RDoc). La documentacin generada por rdoc se ve muy similar a la
generada por javadoc.
Diferencias
No necesitas compilar tu cdigo fuente. Directamente lo ejecutas.
Hay distintos conjuntos de herramientas para interfaz grfica
Se usa la palabra clave end despus de definir clases, en vez de tener que
poner llaves encerrando el cdigo.
Tienes require en vez de import.
Todas las variables de instancia son privadas. Desde afuera, todo se accede
usando mtodos.
Los parntesis en las llamadas a los mtodos usualmente son opcionales y a
menudo son omitidos.
Todo es un objeto, incluyendo los nmeros como 2 y 3,14159.
No hay validacin esttica de tipos de datos.
Los nombres de variables son slo etiquetas. No tienen un tipo de dato
asociado.
No hay declaracin de tipo de datos. Simplemente se asigna a nuevos
nombres de variable a medida que se necesita (por ejemplo a =[1,2,3] en
vez de int[] a ={1,2,3};).
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 98 -
No hay transformacin de tipos (casting). Simplemente se llama a los
mtodos. Tus pruebas unitarias deberan avisarte antes de que ejecutes el
cdigo si habr una excepcin.
Es foo = Foo.new("hola") en vez de Foo foo = new Foo("hola").
El constructor siempre se llama initialize en vez del nombre de la clase.
Tienes mixins en vez de interfaces.
Se tiende a favorecer el uso de YAML en vez de XML.
Es nil en vez de null.
Herramientas
Existen dos herramientas bsicas en Ruby:
ruby. Es el interprete del lenguaje. Puede recibir expresiones del lenguaje
como parmetros o archivos con programas:
irb (o fxri en Windows). Este es Ruby interactivo (Interactive RuBy) que
permite recibir expresiones del lenguaje e irlas interpretando linea por linea,
como cualquier lenguaje interpretado.
Adems:
ri. Documentacin de clases estndar de ruby.
Tambin es posible integrar al interprete al IDE de Eclipse. Para esto se debe
agregar el plugin llamado Ruby Development Tools (RDT) aparte de tener
instalado el interprete en la computadora. El plugin puede ser encontrado en:
http://rubyeclipse.sourceforge.net/. Tiene que agregarse, como cualquier otro
plugin en la herramienta, mediante la opcin de actualizacin del software en el
menu de ayuda de Eclipse.
El plugin debe configurarse indicando la ubicacin del intrprete:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 99 -
Ruby: Fundamentos del lenguaje
Convenciones lxi cas
Espacios en blanco
Mientras una expresin del tipo a +b es interpretada como a+b, donde a es
una variable. El resultado puede ser diferente en casos ambiguos. Por ejemplo, si
a es el nombre de una funcin, entonces una expresin:
a +b
es interpretada como:
a (+b)
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 100 -
Final de instrucciones
Ruby interpreta ; y el espacio en blanco como el final de una instruccin.
Debido a esto, Ruby interpreta los smbolos +, - y \ como contianuacin de
una instruccin.
Comentarios
Comentarios en Ruby son representados con #
#Este es un comentario
Comentarios de ms de una lnea usan =begin y =end, los cuales deben estar al
comienzo de una lnea:
=begin
Este es un comentatio
=end
Identificadores
Cualquier nombre de constante, variables y mtodos usado como identificador es
distinguido por Ruby si usa minsculas o maysculas.
Literales
Enteros
Los nmeros enteros son instancias de la clase Fixnum o Bignum.
123 # deci mal
0377 # oct al
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 101 -
0xf f # hexadeci mal
0b1011 # bi nar y
?a # cdi go par a ' a'
12345678901234567890 # Bi gnum: ent er o de l ongi t ud
i nf i ni t a
Flotantes
Los nmeros de punto flotante son instancias de la clase Float.
123. 4
1. 0e6 # not aci n ci ent f i ca
4e+20 # exponenci al
Cadenas
Una cadena es un arreglo de bytes y una instancia de la clase String:
una cadena #permite sustitucin y notacin con \
otra cadena #no permite sustitucin y solo \ \ \.
Concatenacin.
Cadenas adyacentes son concatenadas :
una cadena #es igual a una cadena
Variables
En Ruby existen 5 tipos de variables, usando caracteres especiales para
diferenciar entre los distintos tipos de variables, lo que ayuda a identificar el tipo
de variable visualmente:
Variable global
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 102 -
Variable de instancia
Variable de clase
Variable local
Constante
y adems:
Pseudo-variable
Variable global
Visibles a travs de todo el programa y deben iniciar con el smbolo $, por
ejemplo:
$soyGlobal
Una variable global no inicializada tiene el valor de nil. Existen adems
variables globales predefinidas que contienen informacin sobre el programa en
ejecucin.
Variable de instancia
Las variables de instancia pertenecen a un objeto y son lo que tambin es
conocido en objetos como atributos. Estas son visibles dentro de un objeto en
particular y deben comenzar con @, por ejemplo:
@soyVariableDeInstancia
Al igual que las variables globales, estas tienen el valor de nil si no han sido
inicializadas.
Variable de clase
Las variables de clase son visibles, como su nombre lo dice, en la clase y
para todos los objetos de la misma. Comienzan con @@, por ejemplo:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 103 -
@@variableDeClase
Estas variables deben ser inicializadas antes de que puedan ser usadas en los
mtodos. El uso de una variable de clase no inicializada produce un error.
Ademas, estas clases son compartidas por descendientes de las clases donde
fueron definidas.
Variable local
Son vlidas dentro del ambito local definido y deben empezar con una
minscula o con el smbolo _. El mbito puede ser el que defina una clase,
mdulo, definicin, do end.
Constante
Deben empezar con una letra mayscula y pueden ser definidas dentro de
una clase o mdulo y sern visibles dentro de ese mbito. Una constante
definida fuera de un clase o mdulo ser vista globalmente. Es posible reasignar
un valor a una constante, pero esto producir una advertencia (pero no un error).
Pseudo-variable
Pseudo-variables tienen la apariencia de variables locales pero su
comportamiento es el de constantes. Ejemplo de estas vriables son self, true,
false, nil.
Operadores
Asignacin
La asignacin funcion con el operador =. Asignar variables locales tambin sirve
como declaracin de la variable. La viariable existe hasta el final del alcance
donde la variable es declarada.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 104 -
Tambin se cuenta con asignacin abreviada como en los lenguajes C/C++y
J ava:
+= -= *= /= %= **= <<= >>= &= |= ^= &&= ||=
Asignacin paralela
destino[, destino...][, *destino] =expr[, expr...][, *expr]
Identificadores destino recibenla asignacin de la correspondiente expresin en el
lado derecho. Si el ltimo destino (lado izquierdo) tiene como prefijo un *, el
resto de los valores en el lado derecho se asigna en ese destino como un arreglo.
Si el * esta en el ltimo elemento del lado derecho, el conjunto de elementos son
expandidos antes de su asignacin.
Operadores lgicos
&& and. Regresa true si ambos operandos son verdaderos. Si el operando
izquierdo es falso, regresa ese valor, en caso contrario regresa el valor del
operando derecho.
|| or. Regresa true si cualquiera de los operandos es verdadero. Si el valor del
opreando izquierdo es true, regresa el valor de ese operando, de otro modo
regresa el valor del operando derecho.
Un aspecto interesante aqu es que los operadores and y or tienen una precedencia
muy baja, de hecho tienen la menor de las precedencias entre los operadores.
Operador ternario
El operador ternario ?: es el operador condicional similar al de C/C++y J ava.
a? b : c
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 105 -
Operador defined?
Este es un operador que puede determinar si una expressin esta definida.
Regresa una descripcin de la expresin, o nulo si la expresin no esta definida.
defined? variable
Por ejemplo:
defined? a
defined? $_
Puede ser usado para verificar una llamada a un mtodo, opcionalmente
incluyendo sus argumentos.
Prioridad de operadores
A continuacin se presenta los operadores ms comunes de Ruby en orden de
precedencia, de mayor a menor:
::
[]
**
+(unario) -(unario)
* / %
+-
<<>>
&
| ^
>>=<<=
<=>== !=
&&
||
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 106 -
?:
=(y operadores abreviados como +=, -=, etc.)
not
and or
Operadores que no pueden ser redefinidos
Los siguientes operadores no pueden ser redefinidos :
...
!
not
&&
and
||
or
::
=
+=, -=, (y el resto de las asignaciones abreviadas)
? :
Arreglos
Un arreglo en Ruby es una clase contenedora que contiene una coleccin de
objetos. Cualquier tipo de objetos pueden ser almacenados en un arreglo,
inclusive pudiendo contener elementos de distinto tipo en un mismo arreglo. Otra
caracterstica es que el arreglo aumenta de tamao conforme se aaden elementos.
Un arreglo es representado con sus elementos entre corchetes [ ] :
[ ] Arreglo vaco
[1, 2, 3] Arreglo de 3 elementos
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 107 -
Los arreglos pueden ser asignados:
ar1=[]
ar2=[1, 2, 3] #=>[1, 2, 3]
Un arreglo puede aadir fcilmente un elemento mediante el operador <<. Ruby
dinmicamente ajusta el tamao del arreglo al aadir o remover los elementos:
ar3= ar2 <<otro #=>[1, 2, 3, "otro"]
El operador <<modifica el operando izquierdo, por lo que la modificacin de un
arreglo puede hacerse directamente como:
ar3<<"otro mas" #=>[1, 2, 3, "otro", "otro mas"]
De hecho en la penltima expresin ar3 en realidad est recibiendo la referencia
de ar2 al cual se le aadi la cadena otro.
Como en C++y J ava, en Ruby el ndice de un arreglo comienza con cero.
a =[1, 2, 3, [4, 5, 6]] #=>[1, 2, 3, [4, 5, 6]]
a[0] #=>1
El mtodo size puede ser utilizado para conocer el nmero de elementos del
arreglo:
a.size #=>4
a[3] #=>[4, 5, 6]
a[3].size #=>3
a[3][0] #=>4
El tamao del arreglo es validado:
a[5] #=>nil
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 108 -
Es posible hacer uso de valores negativos como ndices, y estos se tomaran de la
ltima posicin (-1) hasta la posicin negativa del tamao del arreglo (tambin
posicin 0:
a[-1] #=>[4, 5, 6]
a[a.size*-1] #=>1
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 109 -
Probando Ruby
Porque no empezar a probar ruby siguiendo el tutorial el lnea? ste se encuentra
disponible en : http://tryruby.hobix.com/
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 110 -
Estructuras de control
Condicional if. Se ejecuta si la condicin es verdadera.
Sintaxis:
i f condi ci onal [ t hen]
i nst r ucci ones
[ el si f condi ci onal [ t hen]
i nst r ucci ones] . . .
[ el se
i nst r ucci ones]
end
El if puede ser usado como un modificador de una declaracin:
code i f condi ci onal
Ejemplos:
i f x < 5 t hen
decl ar aci on1
end
i f x < 5 t hen
decl ar aci on1
el se
decl ar aci on2
end
decl ar aci on1 i f y == 3
x = i f a>0 t hen b el se c end
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 111 -
Condicional unless. Ejecuta cdigo si la condicin es falsa, en caso contrario
ejecuta otro bloque de instrucciones.
Sintaxis:
unl ess condi ci onal [ t hen]
i nst r ucci ones
[ el se
i nst r ucci ones]
end
El unless puede ser usado como un modificador de una declaracin:
i nst r ucci ones i f condi ci onal
Ejemplos:
unl ess x >= 5 t hen
decl ar aci on1
end
unl ess x < 5 t hen
decl ar aci on1
el se
decl ar aci on2
end
decl ar aci on1 unl ess y ! = 3
x = unl ess a<=0 t hen c el se b end
Case. Compara la expresin especificada en case con la expresin especificada en
when y ejecuta el cdigo correspondiente. La clausula else se ejecuta en el caso
de que ningn segmento when sea ejecutado.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 112 -
Sintaxis:
case expr esi n
[ when expr esi n[ , expr esi n. . . ] [ t hen]
i nst r ucci ones] . . .
[ el se
i nst r ucci ones]
end
Ejemplo:
case " Una cadena. "
when " al gun val or "
put s " opci on 1"
when " ot r o val or "
put s " opci on 2"
when / char /
put s " opci on 3"
el se
put s " opci on 4"
end
Ciclo while. Se ejecuta el conjunto de instrucciones mientras la condicin es
verdadera. La condicin puede ser separada del conjunto de instrucciones
mediante la palabra reservada do, una lnea nueva, el smbolo \, o un ;.
Sintaxis:
whi l e condi ci onal [ do]
i nst r ucci ones
end
El while puede ser usado como un modificador de una declaracin:
i nst r ucci ones whi l e condi ci onal
:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 113 -
begi n
i nst r ucci ones
end whi l e condi ci onal
Ejecuta instrucciones mientras la condicin es verdadera. En el caso del entre las
clausulas begin y end, este se ejecuta una vez antes de evaluar la condicin.
Ciclo until. El ciclo until se ejecuta el conjunto de instrucciones mientras la
condicin es falsa (hasta que la condicin se cumpla). Puede ser separada del
cdigo por la palabra reservada do, un salto de lnea o un ;. De igual forma que
el while, until puede ser usado como modificador de una declaracin.
Sintaxis:
unt i l condi ci onal [ do]
i nst r ucci ones
end
:
i nst r ucci ones unt i l condi ci onal
:
begi n
i nst r ucci ones
end unt i l condi ci onal
Ciclo for. Ejecuta el conjunto de instrucciones por cada elemento en la
expresin. La expresin en el for puede ir separada por la palabra reservada do,
un salto de lnea, o un ;.
Sintaxis:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 114 -
f or var i abl e[ , var i abl e. . . ] i n expr esi on [ do]
i nst r ucci ones
end
Instrucciones break, next, redo.
break. Termina un ciclo while o until. Tambin finaliza un mtodo con un bloque
asociado si es usado dentro del bloque, con el mtodo regresando el valor de nulo.
next. Salta al punto en que se evala la condicin de un ciclo. Tambin termina la
ejecucin de un bloque si es llamado dentro de ste.
redo. Salta al punto inmediatamente posterior a la evaluacin del ciclo.
Instrucciones BEGIN y END.
BEGIN. Permite declarar un conjunto de instrucciones a ejecutarse antes de que el
programa se ejecute.
BEGI N {
i nst r ucci ones
}
END. Permite declarar un conjunto de instrucciones a ejecutarse antes de finalizar
la ejecucin del interprete.
END {
i nst r ucci ones
}
Algunos ejemplos:
# Ci cl o 1 ( whi l e)
i =0
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 115 -
whi l e i < l i st . si ze do
pr i nt " #{l i st [ i ] } "
i += 1
end
# Ci cl o 2 ( unt i l )
i =0
unt i l i == l i st . si ze do
pr i nt " #{l i st [ i ] } "
i += 1
end
# Ci cl o 3 ( f or )
f or x i n l i st do
pr i nt " #{x} "
end
# Ci cl o 4 ( l oop)
i =0
n=l i st . si ze- 1
l oop do
pr i nt " #{l i st [ i ] } "
i += 1
br eak i f i > n
end
# Ci cl o 6 ( l oop)
i =0
n=l i st . si ze- 1
l oop do
pr i nt " #{l i st [ i ] } "
i += 1
br eak unl ess i <= n
end
# Ci cl o 7 ( f or )
n=l i st . si ze- 1
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 116 -
f or
i i n 0. . n do
pr i nt " #{l i st [ i ] } "
end
---
car = "Pat r i ot "
manuf act ur er = case car
when "Focus": " For d"
when "Navi gat or ": " Li ncol n"
when "Camr y": " Toyot a"
when "Ci vi c": " Honda"
when "Pat r i ot ": " J eep"
when "J et t a": " VW"
when "Ceyene" : "Por sche"
when "Out back": " Subar u"
when "520i " : "BMW"
when "Tundr a" : "Ni ssan"
el se "Desconoci do"
end
put s " El " + car + " es f abr i cado por " + manuf act ur er
- -
cal i f = 70
r esul t = case scor e
when 0. . 59: " Repr obado"
when 61. . 70: "Apr obadoapenas"
when 71. . 80: "Apr obado"
when 81. . 100: " Excel ent e"
el se "Resul t ado i nvl i do"
end
put s r esul t
- -
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 117 -
f or j i n 1. . 5 do
f or i i n 1. . 5 do
pr i nt i , " "
end
put s
end
- -
f or i i n 1. . 8 do
put s i
end
- -
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 118 -
Entrada y Salida bsica en Ruby
Ruby proporciona instrucciones bsicas de entrada y salida. Para Desplegar en la
consola, las instrucciones bsicas son puts, print y printf:
puts. Despliega en la consola y aade un enter al final.
print. Despliega en la consola pero no aade el enter o salto de lnea al final.
printf. Permite formatear la salida de variables de forma similas a C y Java 5.
Ejemplo:
put s " put s f unci ona"
put s " con sal t os de l i nea. "
pr i nt "pr i nt f unci ona"
pr i nt " si n sal t os de l i nea. "
pr i nt f ( " \ n\ npr i nt f f or mat ea numer os como %7. 2f , y cadenas como
%s. " , 3. 14156, " est a")
La manera ms simple de leer una cadena en Ruby es ocupando la funcin gets:
pr i nt I nt r oduce t u nombr e:
nom= get s
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 119 -
Abstraccin de datos: Clases y objetos
Clases
Se mencionaba anteriormente que la base de la programacin orientada a
objetos es la abstraccin de los datos o los TDAs. La abstraccin de los datos se
da realmente a travs de las clases y objetos.
Def. Clase. Se puede decir que una clase es la implementacin real de un
TDA, proporcionando entonces la estructura de datos necesaria y sus operaciones.
Los datos son llamados atributos y las operaciones se conocen como mtodos.
[3]
La unin de los atributos y los mtodos dan forma al comportamiento
(comportamiento comn) de un grupo de objetos. La clase es entonces como la
definicin de un esquema dentro del cual encajan un conjunto de objetos.
El comportamiento debe ser descrito en trminos de responsabilidades [7].
Resolviendo el problema bajo esos trminos permite una mayor independencia
entre los objetos, al elevar el nivel de abstraccin.
En Programacin Estructurada el programa opera sobre estructuras de datos.
En contraste en Programacin Orientada a Objetos, el programa solicita a las
estructuras de datos que ejecuten un servicio.
Ejemplos de clases:
automvil,
persona,
libro,
revista,
reloj,
silla,
...
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 120 -
Obj etos e i nstanci as
Una de las caractersticas ms importantes de los lenguajes orientados a
objetos es la instanciacin. Esta es la capacidad que tienen los nuevos tipos de
datos, para nuestro caso en particular las clases de ser "instanciadas" en cualquier
momento.
El instanciar una clase produce un objeto o instancia de la clase requerida.
Todos los objetos son instancia de una clase [7].
Def. Objeto. Un objeto es una instancia de una clase. Puede ser identificado
en forma nica por su nombre y define un estado, el cul es representado por los
valores de sus atributos en un momento en particular [3].
El estado de un objeto cambia de acuerdo a los mtodos que le son
aplicados. Nos referimos a esta posible secuencia de cambios de estado como el
comportamiento del objeto:
Def. Comportamiento. El comportamiento de un objeto es definido por un
conjunto de mtodos que le pueden ser aplicados [3].
Instanciacin
Los objetos pueden ser creados de la misma forma que una estructura de
datos:
1. Estticamente. En tiempo de compilacin se le asigna un rea de memoria.
2. Dinmicamente. Se le asigna un rea de memoria en tiempo de ejecucin y su
existencia es temporal. Es necesario liberar espacio cuando el objeto ya no es
til; para esto puede ser que el lenguaje proporcione mecanismos de
recoleccin de basura.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 121 -
En J ava, los objetos slo existen de manera dinmica, adems de que
incluye un recolector de basura para no dejar como responsabilidad del usuario la
eliminacin de los objetos de la memoria.
Clases en C++
Una clase entonces, permite encapsular la informacin a travs de atributos
y mtodos que utilizan la informacin, ocultando la informacin y la
implementacin del comportamiento de las clases.
La definicin de una clase define nuevos TDAs y la definicin en C++
consiste de la palabra reservada class, seguida del nombre de la clase y
finalmente el cuerpo de la clase encerrado entre llaves y finalizando con ;.
El cuerpo de la clase contiene la declaracin de los atributos de la clase
(variables) y la declaracin de los mtodos (funciones). Tanto los atributos como
los mtodos pertenecen exclusivamente a la clase y slo pueden ser usados a
travs de un objeto de esa clase.
Sintaxis:
class <nombr e_cl ase> {
<cuer po de l a cl ase>
};
Ejemplo:
class cEj empl o1 {
int x;
float y;
void f un( int a, float b) {
x=a;
y=b;
}
};
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 122 -
Miembros de una cl ase en C++
Una clase est formada por un conjunto de miembros que pueden ser datos,
funciones, clases anidadas, enumeraciones, tipos de dato, etc. Por el momento nos
vamos a centrar en los datos y las funciones (atributos y mtodos).
Es importante sealar que un miembro no puede ser declarado ms de una
vez.
16
Tampoco es posible aadir miembros despus de la declaracin de la clase.
Ejemplo:
class cEj empl o2{
int i ;
int i ; / / er r or
int j ;
int f unc( int, int) ;
};
Atributos miembro
Todos los atributos que forman parte de una clase deben ser declarados
dentro de la misma.
Mtodos miembro
Los mtodos al igual que los atributos, deber ser definidos en la clase, pero
el cuerpo de la funcin puede ir dentro o fuera de la clase. Si un mtodo se
declara completo dentro de la clase, se considera como inline.
La declaracin dentro de la clase no cambia con respecto a la declaracin de
una funcin, salvo que se hace dentro de la clase. Veamos un ejemplo parecido al
16
Aunque existe el concepto de sobrecarga que se ver ms adelante
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 123 -
inicial de esta seccin, pero ahora con el cuerpo de un mtodo fuera del cuerpo de
la clase.
Ejemplo:
/ / cdi go en ej empl o3. h
class cEj empl o3 {
public:
int x;
float y;
int f unX( int a) {
x=a;
return x;
}
float f unY( float) ;
};
Podemos ver que en la definicin de la clase se incluye un mtodo en lnea y
un prototipo de otro mtodo.
Para definir un mtodo miembro de una clase fuera de la misma, se debe
escribir antes del nombre del mtodo, el nombre de la clase con la que el mtodo
esta asociado. Para esto se ocupa el operador de resolucin de alcance ::.
Continuacin del ejemplo:
float cEj empl o3: : f unY( float b) {
y=b;
return y;
}
Reiteramos que al declarar los mtodos fuera de la clase no puede
mencionarse la declaracin de un mtodo que no est contemplado dentro de la
clase. Si esto fuera vlido, cualquier mtodo podra ganar acceso a la clase con
slo declarar una funcin adicional.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 124 -
Ejemplo:
/ / er r or en decl ar aci n de un mt odo
class x{
public:
int a;
f ( ) ;
};
int x: : g( ) { / / er r or , el met odo debe ser f ( )
return a*=3. 1234;
}
La declaracin de una funcin miembro es considerada dentro del mbito de
su clase. Lo cual significa que puede usar nombres de miembros de la clase
directamente sin usar el operador de acceso de miembro de la clase.
Recordar que por convencin en la programacin orientada a objetos las
funciones son llamadas mtodos y la invocacin o llamada se conoce como
mensaje.
Un vistazo al acceso a miembros
Otra de las ventajas de la POO es la posibilidad de encapsular datos,
ocultndolos de otros objetos si es necesario. Para esto existen principalmente dos
calificadores que definen a los datos como pblicos o privados.
Miembros pblicos. Se utiliza cuando queremos dar a usuarios de una clase ) el
acceso a miembros de esa clase, los miembros deben ser declarados pblicos.
Sintaxis:
public:
<def i ni ci n de mi embr os>
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 125 -
Miembros privados. Si queremos ocultar ciertos miembros de una clase de los
usuarios de la misma, debemos declarar a los miembros como privados. De esta
forma nadie ms que los miembros de la clase pueden usar a los miembros
privados. Por omisin los miembros se consideran privados. En una estructura se
consideran pblicos por omisin.
Sintaxis:
private:
<def i ni ci n de mi embr os>
Normalmente, los atributos de la clase deben ser privados; as como los
mtodos que no sean necesarios externamente o que puedan conducir a un estado
inconsistente del objeto.
17
En el caso de los atributos, estos al ser privados deberan de contar con
mtodos de modificacin y de consulta pudiendo incluir alguna validacin.
Es una buena costumbre de programacin accesar a los atributos solamente
a travs de las funciones de modificacin, sobre todo si es necesario algn tipo de
verificacin sobre el valor del atributo.
Ejemplo:
/ / cdi go en ej empl o3. h
class cFecha {
private:
int di a;
int mes;
int an;
public:
char set Di a( int) ; / / poner d a
int get Di a( ) ; / / devuel ve d a
char set Mes( int) ;
17
Un estado inconsistente sera ocasionado por una modificacin indebida de los datos, por ejemplo una modificacin sin
validacin.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 126 -
int get Mes( ) ;
char set An( int) ;
int get An( ) ;
};
Obj etos de cl ase en C++
Ya se ha visto como definir una clase, declarando sus atributos y sus
operaciones, mismas que pueden ir dentro de la definicin de la clase (inline) o
fuera. Ahora vamos a ver como es posible crear objetos o instancias de esa clase.
Hay que recordar que una de las caractersticas de los objetos es que cada
uno guarda un estado particular de acuerdo al valor de sus atributos
18
.
Lo ms importante de los lenguajes orientados a objetos es precisamente el
objeto, el cual es una identidad lgica que contiene datos y cdigo que manipula
esos datos.
En C++, un objeto es una variable de un tipo definido por el usuario [8].
Un ejemplo completo:
#include <i ost r eam>
using namespace st d;
class cEj empl o3 {
public:
int i ;
int j ;
};
int mai n( ) {
cEj empl o3 e1;
cEj empl o3 e2;
18
A diferencia de la programacin modular, donde cada mdulo tiene un solo estado.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 127 -
e1. i =10;
e1. j =20;
e2. i =100;
e2. j =20;
cout <<e1. i <<endl ;
cout <<e2. i <<endl ;
return 0;
}
Otro ejemplo, una cola:
class cCol a{
private:
int q[ 10] ;
int sl oc, r l oc;
public:
void i ni ( ) { / / f unci n en l nea
sl oc=r l oc=- 1;
}
char set ( int) ;
int get ( ) ;
};
#include <i ost r eam>
#include " cCol a. h"
using namespace st d;
char cCol a: : set ( int val ) {
if( sl oc>=10) {
cout <<" l a col a est a l l ena" ;
return 0;
}
sl oc++;
q[ sl oc] =val ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 128 -
return 1;
}
int cCol a: : get ( ) {
if( r l oc==sl oc)
cout <<" l a col a est a vaci a" ;
else {
r l oc++;
return q[ r l oc] ;
}
}
/ / col a def i ni da en un ar r egl o
#include <i ost r eam>
#include " cCol a. h"
using namespace st d;
int mai n( ) {
cCol a a, b, *pCol a= new cCol a; / / *pCol a=NULL y despu s
asi gnar l e
a. i ni ( ) ;
b. i ni ( ) ;
pCol a- >i ni ( ) ;
a. set ( 1) ;
b. set ( 2) ;
pCol a- >set ( 3) ;
a. set ( 11) ;
b. set ( 22) ;
pCol a- >set ( 33) ;
cout <<a. get ( ) <<endl ;
cout <<a. get ( ) <<endl ;
cout <<b. get ( ) <<endl ;
cout <<b. get ( ) <<endl ;
cout <<pCol a- >get ( ) <<endl ;
cout <<pCol a- >get ( ) <<endl ;
delete pCol a;
return 0;
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 129 -
Nota: tomar en cuenta las instrucciones siguientes para el precompilador en
el manejo de mltiples archivos.
#ifndef CCOLA_H
#define CCOLA_H
<definicin de la clase>
#endif
Clases en Java
La definicin en J ava, de manera similar a C++, consiste de la palabra
reservada class, seguida del nombre de la clase y finalmente el cuerpo de la clase
encerrado entre llaves.
Sintaxis:
class <nombr e_cl ase> {
<cuer po de l a cl ase>
}
Ejemplo
19
:
public class cEj empl o1 {
int x;
float y;
void f un( int a, float b) {
x=a;
y=b;
}
}
19
Algunos ejemplos como este no son programas completos, sino simples ejemplos de clases. Podrn ser
compilados pero no ejecutados directamente. Para que un programa corra debe contener o ser una clase
derivada de applet, o tener un mtodo main.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 130 -
Miembros de una cl ase en Java
Los miembros en J ava son esencialmente los atributos y los mtodos de la
clase.
Ejemplo:
class cEj empl o2{
int i ;
int i ; / / er r or
int j ;
int f unc( int, int) {}
}
Atributos miembro
Todos los atributos que forman parte de una clase deben ser declarados
dentro de la misma.
La sintaxis mnima es la siguiente:
tipo nombr eAt r i but o;
Los atributos pueden ser inicializados desde su lugar de declaracin:
tipo nombr eAt r i but o = valor;
, en el caso de variables de objetos:
tipo nombr eAt r i but o = new Clase();
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 131 -
Mtodos miembro
Un mtodo es una operacin que pertenece a una clase. No es posible
declarar mtodos fuera de la clase. Adems, en J ava no existe el concepto de
mtodo prototipo como en C++.
Sin embargo, igual que en C++, la declaracin de una funcin mtodo
miembro es considerada dentro del mbito de su clase.
La sintaxis bsica para declarar a un mtodo:
tipoRetorno nombr eMt odo ( [ <par met r os>] ) {
<i nst r ucci ones>
}
Un aspecto importante a considerar es que el paso de parmetros en J ava es
realizado exclusivamente por valor. Datos bsicos y objetos son pasados por
valor. Pero los objetos no son pasados realmente, se pasan las referencias a los
objetos (i.e., una copia de la referencia al objeto).
Un vistazo al acceso a miembros
Si bien en J ava existen tambin los miembros pblicos y privados, estos
tienen una sintaxis diferente a C++. En J ava se define el acceso a cada miembro
de manera unitaria, al contrario de la definicin de acceso por grupos de
miembros de C++.
Miembros pblicos.
Sintaxis:
public <def i ni ci n de mi embr o>
Miembros privados.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 132 -
Sintaxis:
private <def i ni ci n de mi embr os>
Recordatorio: Es una buena costumbre de programacin acceder a los atributos
solamente a travs de las funciones de modificacin, sobre todo si es necesario
algn tipo de verificacin sobre el valor del atributo. Estos mtodos de acceso y
modificacin comnmente tienen el prefijo get y set, respectivamente.
Ejemplo:
class Fecha {
private int di a;
private int mes, an;
public boolean set Di a( int d) {} / / poner d a
public int get Di a( ) {} / / devuel ve d a
public boolean set Mes( int m) {}
public int get Mes( ) {}
public boolean set An( int a) {}
public int get An( ) {}
}
Obj etos de cl ase en Java
En J ava todos los objetos son creados dinmicamente, por lo que se necesita
reservar la memoria de estos en el momento en que se van a ocupar. El operador
de J ava est basado tambin en el de C++y es new.
20
Asignacin de memoria al objeto
20
La instruccin new, ya haba sido usada para reservar memoria a un arreglo, ya que estos son considerados
objetos.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 133 -
El operador new crea automticamente un rea de memoria del tamao
adecuado, y regresa la referencia del rea de memoria. Esta referencia debe de
recibirla un identificador de la misma clase de la que se haya reservado la
memoria.
Sintaxis:
i dent i f i cador = new Cl ase( ) ;
en el momento de declarar a la variable de objeto:
Cl ase i dent i f i cador = new Cl ase( ) ;
El concepto de new va asociado de la nocin de constructor, pero esta se
ver ms adelante, por el momento basta con adoptar esta sintaxis para poder
completar ejemplos de instanciacin.
Un ejemplo completo:
public class Ej empl o3 {
public int i , j ;
public static void mai n( St r i ng ar gv[ ] ) {
Ej empl o3 e3= new Ej empl o3( ) ;
Ej empl o3 e1= new Ej empl o3( ) ;
e1. i =10;
e1. j =20;
e3. i =100;
e3. j =20;
Syst em. out. pr i nt l n( e1. i ) ;
Syst em. out. pr i nt l n( e3. i ) ;
}
}
Otro ejemplo, una estructura de cola:
class Col a{
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 134 -
private int q[ ] ;
private int sl oc, r l oc;
public void i ni ( ) {
sl oc=r l oc=- 1;
q=new int[ 10] ;
}
public boolean set ( int val ) {
if( sl oc>=10) {
Syst em. out. pr i nt l n( " l a col a est a l l ena" ) ;
return false;
}
sl oc++;
q[ sl oc] =val ;
return true;
}
public int get ( ) {
if( r l oc==sl oc) {
Syst em. out. pr i nt l n( " l a col a est a vaci a" ) ;
return - 1;
}
else {
r l oc++;
return q[ r l oc] ;
}
}
}
public class Pr uebaCol a {
public static void mai n( St r i ng ar gv[ ] ) {
Col a a= new Col a( ) ; / / new cr ea r eal ment e el obj et o
Col a b= new Col a( ) ; / / r eser vando l a memor i a
Col a pCol a= new Col a( ) ;
/ / I ni ci al i zaci on de l os obj et os
a. i ni ( ) ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 135 -
b. i ni ( ) ;
pCol a. i ni ( ) ;
a. set ( 1) ;
b. set ( 2) ;
pCol a. set ( 3) ;
a. set ( 11) ;
b. set ( 22) ;
pCol a. set ( 33) ;
Syst em. out. pr i nt l n( a. get ( ) ) ;
Syst em. out. pr i nt l n( a. get ( ) ) ;
Syst em. out. pr i nt l n( b. get ( ) ) ;
Syst em. out. pr i nt l n( b. get ( ) ) ;
Syst em. out. pr i nt l n( pCol a. get ( ) ) ;
Syst em. out. pr i nt l n( pCol a. get ( ) ) ;
}
}
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 136 -
Clases en Ruby
La definicin en Ruby, de manera similar a J ava y C++, consiste de la
palabra reservada class, seguida del nombre de la clase y finalmente el cuerpo de
la clase [9].
Sintaxis:
class <nombr e_cl ase>
<cuer po de l a cl ase>
end
Si la clase es contenida en un archivo la convencin es que el nombre del archivo
coincida con el nombre de la clase pero iniciando en minsculas. Una clase
Prueba estar idealmente en un archivo prueba.rb (en Windows se usa .rbw)
Ejemplo
21
:
class Ej empl o01
def f un a, b
x=a
y=b
end
end
Miembros de una cl ase en Ruby
Los miembros en Ruby son esencialmente los atributos y los mtodos de la
clase.
21
Algunos ejemplos como este no son programas completos, sino simples ejemplos de clases. Ruby es un
lenguaje interpretado. No existe un mtodo principal que inicie la ejecucin. El interprete recibe una lista de
instrucciones y ste comienza ejecutando de la lnea inicial hasta la ltima lnea.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 137 -
Mtodos miembro
Un mtodo es una operacin que pertenece a una clase. Los mtodos son
muy importantes en Ruby. En Ruby no existen funciones, pues todo el cdigo es
representad en mtodos (asociados a objetos). Aunque Ruby permite definir
cdigo como funciones en otros lenguajes, en realidad ese cdigo es un mtodo
asociado (por omisin) a un objeto.
La sintaxis bsica para declarar a un mtodo:
def nombr eMt odo [ ( <par met r os> ) ]
<i nst r ucci ones>
end
Un aspecto importante a considerar es que la lista de parmetros, al igual que el
uso de variables, no requiere definir el tipo de dato, pues este se determina en el
momento de la llamada al mtodo.
Es posible aadir los smbolos ! o ? al final del nombre de un mtodo. ! indica
que el mtodo requiere ms atencin que la variante con el mismo nombre sin el
!. El smbolo ? indicara que el mtodo retorna un resultado boleano.
En Ruby es posible que un mtodo definido para una clase quede indefinido:
undef nombr eMt odo [ ( <par met r os> ) ]
Por ejemplo:
class Foo
def f oo
end
end
. . .
undef f oo
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 138 -
Un vistazo al acceso a mtodos
Si bien en Ruby existen tambin los miembros pblicos y privados, estos
son usados para proveer acceso a los mtodos, puesto que los atributos son
privados.
Mtodos pblicos. Accesibles donde la clase es visible.
Sintaxis:
public <l i st a de mt odos>
Mtodos privados. Accesibles solo por instancias de la clase.
Sintaxis:
private <l i st a de mt odos>
La lista de mtodos pblicos o privados debe hacer referencia a mtodos
previamente definidos. Esto puede ser la lista de mtodos despus de ser
definidos, o definirse el mtodo en ese momento. En Ruby, los mtodos son
pblicos por omisin [10].
Ejemplo:
class A
private
def met odo_pr i vado
# codigo
end
end
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 139 -
Atributos miembro
Todos los atributos que forman parte de una clase deben ser declarados
dentro de la misma. En Ruby los atributos son llamasoa variables de instancia, y
no requieren ser declarados fuera de los mtodos. Podemos usar variables de
instancia conforme se necesiten. Una variable de instancia debe llevar como
prefijo el smbolo @, por ejemplo:
@var i abl eI nst anci a
Ejemplo:
class I nst Test
def set _f oo( n)
@f oo = n
end
def set _bar ( n)
@bar = n
end
end
El detalle es que en Ruby las variables de instancia no son accesibles
externamente. Para poder accederlas debemos crear mtodos de acceso como en
el ejemplo pasado, o definir explcitamente el acceso a los atributos, lo que genera
mtodos con el nombre del atributo ( pero sin el @ ). Existen 3 tipos de acceso a
los atributos:
attr_accesor. Genera acceso de lectura y escritura a la variable de instancia.
attr_reader. Genera acceso de lectura sobre la variable de instancia.
attr_writer. Proporciona acceso de escritura sobre la variable de instancia.
Ejemplo:
class Usuar i o
attr_accessor :nombre
attr_accessor :apellidos
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 140 -
attr_reader :login
attr_writer :password
. . .
def muest r a
@nombr e+ +@apel l i dos
end
end
Obj etos de cl ase en Ruby
En Ruby todos los nmeros, arreglos, cadenas y dems entidades son
objetos, lo que permite aplicar mtodos definidos para esos objetos directamente
a las literales:
10. succ # 11
" hol a" . upcase # "HOLA"
[ 2, 1, 5, 3, 4] . sor t # [1,2,3,4,5]
obj et o. met odo
Esto implicara que cada objeto en Ruby es un objeto de alguna clase. De
hecho es posible preguntarle a un objeto a que clase pertenece:
" hol a" . class
Asignacin de memoria al objeto
En Ruby, un objeto es instanciado mediante la ejecucin del mtodo new, el
crea automticamente un rea de memoria del tamao adecuado, y regresa la
referencia del rea de memoria. El objeto instanciado tpicamente es asignado a
una variable.
Sintaxis:
i dent i f i cador = Cl ase. new
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 141 -
Un ejemplo completo:
class Ej empl o3
@i # no es necesario
@j # especificar los atributos
def unMet odo x, y
@i =x
@j =y
put s " El val or de i es " + @i . t o_s
put s " El val or de j es " + @j . t o_s
end
end
require " Ej empl o3"
# load "Ejemplo3.rb"
obj 1 = Ej empl o3. new
obj 2 = Ej empl o3. new
obj 1. unMet odo 10, 20
obj 2. unMet odo 100, 20
Otro ejemplo, una estructura de cola:
class Col a
@q=[ ]
@sl oc= @r l oc=- 1
def i ni
@sl oc= @r l oc=- 1
@q=[ ]
end
def set val
if @sl oc>1000
put s " La col a est a l l ena"
return false
end
@sl oc+=1
@q[ @sl oc] =val
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 142 -
return true
end
def get
if @r l oc == @sl oc then
put s " La col a est a vaci a"
return false
else
@r l oc+=1
return @q[ @r l oc]
end
end
end
require " Col a"
a = Col a. new
b = Col a. new
a. i ni
b. i ni
a. set 1
b. set 2
a. set 11
b. set ( 22)
put s a. get
put s a. get
put s b. get
put s b. get ( )
a. get
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 143 -
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 144 -
Alcance de Cl ase en C++
El nombre de un miembro de una clase es local a la clase. Las funciones no
miembros se definen en un alcance de archivo.
Dentro de la clase los miembros pueden ser accesados directamente por
todos los mtodos miembros. Fuera del alcance la clase, los miembros de la clase
se pueden utilizar seguidos del operador de seleccin de miembro de punto .
del operador de seleccin de miembro de flecha , posteriormente al nombre
de un objeto de clase.
Ejemplo:
class cMi Cl ase{
public:
int ot r aFunci on( ) ;
};
int mai n ( ) {
cMi Cl ase cM;
cM. ot r aFunci on( ) ;
return 0;
}
Alcance de Cl ase en Java
El nombre de un miembro de una clase es local a la clase.
Dentro de la clase, los miembros pueden ser accesados directamente por
todos los mtodos miembros. Fuera del alcance la clase, los miembros de la clase
se pueden utilizar seguidos del operador de seleccin de miembro de punto . ,
posteriormente al nombre de un objeto de clase.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 145 -
Ejemplo:
class Mi Cl ase{
public void ot r aFunci on( ) {
Syst em. out. pr i nt l n( " Met odo de l a cl ase Mi Cl ase" ) ;
}
}
public class Al cance {
public static void mai n ( St r i ng ar gv[ ] ) {
Mi Cl ase cM= new Mi Cl ase( ) ;
cM. ot r aFunci on( ) ;
}
}
Alcance de Cl ase en Ruby
Los atributos son privados y accesibles nicamente mediante mtodos
definidos por el programador o mediante los modificadores de accesoa los
atributos. El nombre del mtodo de una clase es local a la clase.
Dentro de la clase, los miembros pueden ser accesados directamente por
todos los mtodos miembros. Fuera del alcance la clase, nicamente los mtodos
de la clase se pueden utilizar, seguidos del operador de seleccin de miembro de
punto . , posteriormente al nombre de un objeto de clase.
Ejemplo:
class Mi Cl ase
public
def ot r aFunci on
put s " Met odo de l a cl ase Mi Cl ase"
end
end
def mi Mai n
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 146 -
cM= Mi Cl ase. new
cM. ot r aFunci on
end
mi Mai n
Usando l a pal abra reservada this en C++ y Java
Cuando en algun punto dentro del cdigo de algunos de los mtodos se
quiere hacer referencia al objeto ligado en ese momento con la ejecucin del
mtodo, podemos hacerlo usando la palabra reservada this.
Una razn para usarlo es querer tener acceso a algn atributo posiblemente
oculto por un parmetro del mismo nombre.
Tambin puede ser usado para regresar el objeto a travs del mtodo, sin
necesidad de realizar una copia en un objeto temporal.
La sintaxis es la misma en C++y en J ava, con la nica diferencia del
manejo del operador de indireccin * si, por ejemplo, se quiere regresar una
copia y no la referencia del objeto.
Ejemplo en C++:
Fecha Fecha: : get Fecha( ) {
return *this;
}
Ejemplo en J ava:
class Fecha {
private int di a;
private int mes, an;
public Fecha get Fecha( ) {
return this;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 147 -
}
}
Usando l a pal abra reservada self en Ruby
En Ruby, para hacer referencia en un mtodo al objeto donde es ejecutado el
mtodo (el mismo que recibe el mensaje) se usa la palabra reservada self, en lugar
de this.
Ejemplo:
class Sel f Ej empl o
@x=0
@y=0
def get Sel f Ej empl o
return self
end
attr_accessor :x, :y
end
#cdigo de prueba
obj 1= Sel f Ej empl o. new
obj 1. x=10
put s obj 1. x
obj 1. y=" YY"
put s obj 1. y
obj 2=obj 1. get Sel f Ej empl o
put s obj 2. x
obj 1. y=123
put s obj 1. y # despliega 123
put s obj 2. y # despliega 123
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 148 -
Sobrecarga de operaciones
Es posible tener el mismo nombre para una operacin con la condicin de
que tenga parmetros diferentes. La diferencia debe de ser al menos en el tipo de
datos.
Si se tienen dos o ms operaciones con el mismo nombre y diferentes
parmetros se dice que dichas operaciones estn sobrecargadas.
El compilador sabe que operacin ejecutar a travs de la firma de la
operacin, que es una combinacin del nombre de la operacin y el nmero y tipo
de los parmetros.
El tipo de regreso de la operacin puede ser igual o diferente.
La sobrecarga
22
de operaciones sirve para hacer un cdigo ms legible y
modular. La idea es utilizar el mismo nombre para operaciones relacionadas. Si
no tienen nada que ver entonces es mejor utilizar un nombre distinto. A
contianuacin ejemplos de sobrecarga en C++y J ava.
Ejemplo en C++:
class Mi Cl ase{
int x;
public:
void modi f i ca( ) {
x++;
}
void modi f i ca( int y) {
x=y*y;
}
}
22
Tambin conocida como homonimia.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 149 -
Ejemplo 2 en C++:
/ / f uer a de POO
#include <i ost r eam>
using namespace st d;
int cuadrado( int i ) {
return i *i ;
}
double cuadrado( double d) {
return d*d;
}
int mai n( ) {
cout <<" 10 el evado al cuadr ado: " <<cuadrado( 10) <<endl ;
cout <<" 10. 5 el evado al cuadr ado: " <<cuadrado( 10. 5) <<endl ;
return 0;
}
Ejemplo en J ava:
class Mi Cl ase{
int x;
public void modifica( ) {
x++;
}
public void modifica( int y) {
x=y*y;
}
}
Ruby no soporta sobrecarga de operaciones. En Ruby la firma de un mtodo
es su nombre. Si dos mtodos son definidos con el mismo nombre, la ltima
implementacin definida es la que es esperada.
Ejemplo en Ruby:
class Mi Cl ase
attr_reader :x
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 150 -
def modi f i ca
@x+=1
end
def modi f i ca y
@x=y*y
end
end
#prueba
mc=Mi Cl ase. new
put s mc. x
# mc.modifica -- Error pues se ha redefinido el mtodo
mc. modi f i ca 10
put s mc. x
Constructores y destructores en C++
Con el manejo de los tipos de datos primitivos, el compilador se encarga de
reservar la memoria y de liberarla cuando estos datos salen de su mbito.
En la programacin orientada a objetos, se trata de proporcionar
mecanismos similares, aunque con mayor funcionalidad. Cuando un objeto es
creado es llamado un mtodo conocido como constructor, y al salir se llama a otro
conocido como destructor. Si no se proporcionan estos mtodos se asume la
accin ms simple.
Constructor
Un constructor es un mtodo con el mismo nombre de la clase. Este mtodo
no puede tener un tipo de dato y si puede permitir la homonimia o sobrecarga.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 151 -
Ejemplo:
class Col a{
private:
int q[ 100] ;
int sl oc, r l oc;
public:
Col a( ) ; / / const r uct or
void put ( int) ;
int get ( ) ;
};
/ / i mpl ement aci n del const r uct or
Col a: : Col a ( ) {
sl oc=r l oc=0;
cout <<" Col a i ni ci al i zada \ n" ;
}
Un constructor si puede ser llamado desde un mtodo de la clase.
Constructor de Copia
Es til agregar a todas las clases un constructor de copia que reciba como
parmetro un objeto de la clase y copie sus datos al nuevo objeto.
C++proporciona un constructor de copia por omisin, sin embargo es una
copia a nivel de miembro y puede no realizar una copia exacta de lo que
queremos. Por ejemplo en casos de apuntadores a memoria dinmica, se tendra
una copia de la direccin y no de la informacin referenciada.
Sintaxis:
<nombr e cl ase>( const <nombr e cl ase> &<obj et o>) ;
Ejemplo:
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 152 -
/ / ej empl o de const r uct or de copi a
#include <i ost r eam>
#include <t i me. h>
#include <st dl i b. h>
using namespace st d;
class Ar r {
private:
int a[ 10] ;
public:
Ar r ( int x=0) {
for( int i =0; i <10; i ++) {
if ( x==0)
x=r and( ) ;
a[ i ] =x;
}
}
Ar r ( const Arr &copia) { / / const r uct or de copi a
for( int i =0; i <10; i ++)
a[ i ] =copi a. a[ i ] ;
}
char set ( int, int) ;
int get ( int) const ;
int get ( int) ;
};
char Ar r : : set ( int pos, int val ) {
if( pos>=0 && pos<10) {
a[ pos] =val ;
return 1;
}
return 0;
}
int Ar r : : get ( int pos) const {
if( pos>=0 && pos<10)
return a[ pos] ;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 153 -
/ / a[ 9] =0; er r or en un met odo const ant e
return 0;
}
int Ar r : : get ( int pos) { / / no es necesar i o sobr ecar gar
if( pos>=0 && pos<10) / / si el met odo no modi f i ca
return a[ pos] ;
return 0;
}
int mai n( ) {
Ar r a( 5) , b;
sr and( t i me( NULL) ) ;
a. set ( 0, 1) ;
a. set ( 1, 11) ;
cout <<a. get ( 0) <<endl ;
cout <<a. get ( 1) <<endl ;
b. set ( 0, 2) ;
b. set ( 1, 22) ;
cout <<b. get ( 0) <<endl ;
cout <<b. get ( 1) <<endl ;
Ar r d( a) ;
cout <<d. get ( 0) <<endl ;
cout <<d. get ( 1) <<endl ;
return 0;
}
Destructor
La contraparte del constructor es el destructor. Este se ejecuta momentos
antes de que el objeto sea destruido, ya sea porque salen de su mbito o por medio
de una instruccin delete. El uso ms comn para un destructor es liberar la
memoria asignada dinmicamente, aunque puede ser utilizado para otras
operaciones de finalizacin, como cerrar archivos, una conexin a red, etc.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 154 -
El destructor tiene al igual que el constructor el nombre de la clase pero con
una tilde como prefijo (~).
El destructor tampoco regresa valores ni tiene parmetros.
Ejemplo:
class Col a{
private:
int q[ 100] ;
int sl oc, r l oc;
public:
Col a( ) ; / / const r uct or
~Col a( ) ; / / dest r uct or
void put ( int) ;
int get ( ) ;
};
Col a: : ~Col a( ) {
cout <<" col a dest r ui da\ n" ;
}
Ejemplo completo de Cola con constructor y destructor:
/ / col a def i ni da en un ar r egl o
/ / i ncl uye const r uct or es y dest r uct or es de ej empl o
#include <i ost r eam>
#include <st r i ng. h>
#include <st di o. h>
using namespace st d;
class Col a{
private:
int q[ 10] , sl oc, r l oc;
char *nom;
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 155 -
public:
Col a( char *cad=NULL) { / / f unci on en l i nea
if( cad) { / / cadena! =NULL
nom=new char[ st r l en( cad) +1] ;
st r cpy( nom, cad) ;
}else
nom=NULL;
sl oc=r l oc=- 1;
}
~Col a( ) {
if( nom) { / / nom! =NULL
cout <<" Col a : " <<nom<<" dest r ui da\ n" ;
delete [ ] nom;
}
}
char set ( int) ;
int get ( ) ;
};
char Col a: : set ( int val ) {
if( sl oc>=10) {
cout <<" l a col a est a l l ena" ;
return 0;
}
sl oc++;
q[ sl oc] =val ;
return 1;
}
int Col a: : get ( ) {
if( r l oc==sl oc)
cout <<" l a col a est a vaci a" ;
else {
r l oc++;
return q[ r l oc] ;
}
return 0;
}
int mai n( ) {
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 156 -
Col a a( " Col a a" ) , b( " Col a b" ) ,
*pCol a= new Col a( " Col a di nami ca pCol a" ) ;
a. set ( 1) ;
b. set ( 2) ;
pCol a- >set ( 3) ;
a. set ( 11) ;
b. set ( 22) ;
pCol a- >set ( 33) ;
cout <<a. get ( ) <<endl ;
cout <<a. get ( ) <<endl ;
cout <<b. get ( ) <<endl ;
cout <<b. get ( ) <<endl ;
cout <<pCol a- >get ( ) <<endl ;
cout <<pCol a- >get ( ) <<endl ;
delete pCol a;
}
Constructores y fi nal izadores en Java
En J ava, cuando un objeto es creado es llamada un mtodo conocido como
constructor, y al salir se llama a otro conocido como finalizador
23
. Si no se
proporcionan estos mtodos se asume la accin ms simple.
Constructor
Un constructor es un mtodo con el mismo nombre de la clase. Este mtodo
no puede tener un tipo de dato de retorno y si puede permitir la homonimia o
sobrecarga, y la modificacin de acceso al mismo.
Ejemplo:
public class Col a{
private int q[ ] ;
23
En C++no existe el concepto de finalizador, sino el de destructor, porque su tarea primordial es liberar la
memoria ocupada por el objeto, cosa que no es necesario realizar en Java.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 157 -
private int sl oc, r l oc;
public void put ( int) { . . . }
public int get ( ) { . . . }
/ / i mpl ement aci n del const r uct or
public Cola ( ) {
sl oc=r l oc=0;
q= new int[ 100] ;
Syst em. out. pr i nt l n( " Col a i ni ci al i zada " ) ;
}
}
El constructor se ejecuta en el momento de asignarle la memoria a un
objeto, y es la razn de usar los parntesis junto al nombre de la clase al usar la
instruccin new:
Fecha f = new Fecha( 10, 4, 2007) ;
Si no se especifica un constructor, J ava incluye uno predeterminado, que
asigna memoria para el objeto e inicializa las variables de instancia a valores
predeterminados. Este constructor se omite si el usuario especifica uno o ms por
parte del programador.
Finalizador
La contraparte del constructor en J ava es el mtodo finalize o finalizador.
Este se ejecuta momentos antes de que el objeto sea destruido por el recolector de
basura. El uso ms comn para un finalizador es liberar los recursos utilizados
por el objeto, como una conexin de red o cerrar algn archivo abierto.
No es muy comn utilizar un mtodo finalizador, ms que para asegurar
situaciones como las mencionadas antes. El mtodo ira en trminos generales
como se muestra a continuacin
24
:
24
No se ha mencionado el modificador protected. Este concepto se explicar una vez que se haya visto el
manejo de herencia.
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 158 -
protected void f i nal i ze( ) {
<i nst r ucci ones>
}
El finalizador puede ser llamado como un mtodo normal, inclusive puede ser
sobrecargado, pero un finalizador con parmetros no puede ser ejecutado
automticamente por la mquina virtual de J ava. Se recomiendo evitar el definir
un finalizador con parmetros.
Inicial izadores en Ruby
En Ruby, el mtodo que podemos usar para inicializar un objeto es llamado
initialize. No es llamado consturctor porque, en Ruby, son internamente dos
procesos separados. El mtodo initialize no es un constructor y es definido
automticamente como privado.
La explicacin para esto es que las clases en Ruby son instancias de la clase
Class. Por cada clase definida, un objeto de tipo Class es creado y asignado a una
constante del nombre especificado en la declaracin de la clase. Cuando el
mtodo new es llamado (NombreClase.new) para crear un objeto, se ejecuta por
default el mtodo new de Class, el cual ejecuta al mtodo allocate para asignar la
memoria del objeto, y por ltimo, el mtodo initialize del nuevo objeto es
ejecutado.
Sintaxis
class Nombr eCl ase
def i ni t i al i ze [ ( l i st a de par met r os) ]
<cdi go>
end
...
end
Programacin Orientada a Objetos
con C++, J ava y Ruby
Carlos Alberto Fernndez y Fernndez
- 159 -