Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PID_00249622
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00249622 Objeto y clase
Índice
Introducción............................................................................................... 5
Objetivos....................................................................................................... 6
2. Clase....................................................................................................... 10
2.1. Analogía con la programación estructurada ............................... 10
2.1.1. Módulo ........................................................................... 10
2.1.2. Tupla .............................................................................. 10
2.2. Miembros de una clase ............................................................... 11
2.2.1. Atributos ........................................................................ 12
2.2.2. Métodos ......................................................................... 12
2.3. Constructor y destructor ............................................................. 13
2.3.1. Constructor .................................................................... 13
2.3.2. Destructor ...................................................................... 14
2.4. Representación de una clase en UML ......................................... 15
2.5. Implementación de una clase ..................................................... 16
3. Objeto.................................................................................................... 18
3.1. Instancia ...................................................................................... 18
3.2. Estado y comportamiento ........................................................... 18
3.3. Mensaje ........................................................................................ 20
3.4. Viendo el mundo de otra forma ................................................. 21
Resumen....................................................................................................... 23
Bibliografía................................................................................................. 25
© FUOC • PID_00249622 5 Objeto y clase
Introducción
Este módulo tiene como objetivo principal explicar los elementos básicos de la
programación orientada a objetos (POO). Concretamente, veremos qué es una
clase y cuáles son los miembros de una clase –los atributos y métodos–, qué
es un objeto, qué significa instanciar, qué son el estado y el comportamiento
de un objeto, y qué es un mensaje.
Objetivos
2. Conocer y entender las partes que componen una clase, es decir, los atri-
butos y los métodos.
4. Saber los conceptos relacionados con un objeto, como son: instancia, es-
tado, comportamiento y mensaje.
Entidad
Un objeto en POO representa alguna entidad de la vida real, es decir,
alguno de los objetos únicos que pertenecen al problema con el que nos Los objetos del mundo real se
les suele llamar entidades para
estamos enfrentando, y con el que podemos interactuar. diferenciarlos de su homólogo
en el mundo de la programa-
ción orientada a objetos, lla-
Cada objeto, de igual modo que la entidad de la vida real a la que repre- mado objeto.
senta, tiene un estado (es decir, unos atributos con unos valores concre-
tos) y un comportamiento (es decir, tiene funcionalidades o sabe hacer
unas acciones concretas).
Clase
Podemos definir informalmente una clase como una plantilla (o esque-
leto o plano) a partir de la cual se crean los objetos. También podéis entender una
clase como la abstracción de
un objeto o como la definición
de un objeto.
Por ejemplo, en el mundo hay millones de televisores de la misma marca y modelo. Cada
uno de esos televisores ha sido montado a partir de un mismo plano/esqueleto/planti-
lla y, consecuentemente, todos ellos tienen los mismos componentes, conexiones y fun-
cionalidades. Ese plano/esqueleto/plantilla es, en términos de programación orientada
a objetos, una clase.
© FUOC • PID_00249622 8 Objeto y clase
En este punto tiene que quedar claro que, cuando hablamos de objeto, hace- Relación clase-objeto
mos referencia a una estructura que hay en un momento determinado de la
Muchos lenguajes de progra-
ejecución del programa, mientras que cuando hablamos de clase hacemos re- mación permiten conocer la
ferencia a una estructura que representa a un conjunto de objetos. Esto impli- clase a la que pertenece un ob-
jeto en tiempo de ejecución
ca que: del programa.
Así pues, si tenemos la clase Persona, en ella están representadas las propieda-
des que caracterizan a una persona (entidad del mundo real), mientras que los
diferentes objetos (por ejemplo, Elena, Marina y David) representan a personas
concretas.
Lo mismo ocurre con la clase Televisor y con los objetos miTelevisor, tuTelevisor,
elTelevisorDelVecino, etc. Por un lado, la clase Televisor representa el concepto
abstracto de televisor (es decir, las características y acciones comunes de los
televisores), mientras que los tres objetos declarados –miTelevisor, tuTelevisor y
elTelevisorDelVecino– son televisores concretos.
Finalmente, veamos dos ejemplos que deberían servir para acabar de entender
qué es un objeto y una clase, así como la relación entre los dos.
Ejemplo 1
Si estamos en una reunión familiar, cada persona de la familia es única y se puede inter-
actuar con ella. Es decir, cada persona de esa reunión es un objeto. Así pues, Marina, su
madre Elena y su padre David son, cada uno de ellos, objetos. Es más, si el bisabuelo y
el abuelo paternos de Marina se llaman ambos Manuel, cada uno de ellos es un objeto
diferente, puesto que si bien se llaman igual, no son la misma persona (es decir, el mismo
objeto). El bisabuelo y el abuelo, así como el resto de integrantes de la familia, son ele-
mentos con los que se puede interactuar de manera individual. Eso sí, todas los miembros
de la familia son del mismo tipo Persona (que es la clase a la que pertenecen).
Ejemplo 2
Ved también
Cuando vamos a una tienda de electrodomésticos a comprar un televisor, lo más probable
es que nos encontremos no con una tele, sino con más de una. Cada uno de esos televi- Para acabar de entender la re-
sores es un objeto, aunque pertenezcan a la misma marca y al mismo modelo. Pensemos lación entre los conceptos cla-
se y objeto, se recomienda ver
que dos televisores del mismo modelo, aunque aparentemente parezcan idénticos, no
el vídeo «Clase, objeto, atribu-
tienen por qué ser iguales. Simplemente hay que pensar que uno puede estar encendido to y método» que encontraréis
–porque está en el aparador– y el otro apagado porque está dentro del embalaje. Es de- en el aula de la asignatura.
cir, tienen estados diferentes. Es más, aunque ambos estén apagados y, por consiguiente,
tengan el mismo estado, ¡puedes tocarlos y ver que son dos objetos diferentes! Eso sí,
ambos televisores pertenecen a la clase Televisor.
© FUOC • PID_00249622 9 Objeto y clase
2. Clase
Para entender mejor qué es una clase desde un punto de vista más próximo a
la implementación, haremos dos analogías con dos conceptos que ya conocéis
de la asignatura anterior de programación: el módulo y la tupla.
2.1.1. Módulo
De esta manera, podemos imaginar que tenemos un módulo Moto que contie-
ne la variable velocidad y dos funciones que permiten modificar y consultar el
valor de la variable velocidad, respectivamente. Así, si tengo el objeto m1 del
tipo Moto, puedo acceder a su variable velocidad y a sus funciones de modifi-
cación y consulta.
2.1.2. Tupla
tipo
coordenadas = tupla
x, y: real;
ftupla
ftipo
var
punto1, punto2: coordenadas;
fvar
© FUOC • PID_00249622 11 Objeto y clase
Gracias a las tuplas podemos tener tipos personalizados más complejos y abs-
tractos que incluyen otros tipos, ya sean básicos, de tipo tabla o incluso de
tipo tupla. Las tuplas nos permiten hacer operaciones como:
Pues bien, si las tuplas solo pueden tener variables en su definición, una clase
puede tener funciones además de variables. Así pues, inventándonos un pseu-
docódigo para definir las clases tendríamos:
tipo
rectangulo = clase
x, y, alto, ancho: real;
area: funcion():real
retorna alto*ancho;
ffuncion
fclase
ftipo
var
rect1, rect2: rectangulo;
fvar
De esta forma tenemos una clase llamada rectángulo que nos permite crear
objetos de tipo rectángulo. De hecho, en el ejemplo anterior hemos creado dos
objetos, rect1 y rect2. Ahora podríamos hacer operaciones como las siguientes:
rect1.x = 5;
rect1.y = 10;
escribeReal(rect1.area());//devolverá el valor 50, resultado de 5*10
Como hemos visto, una clase está formada por unas variables y unas funcio-
nes. Estrictamente hablando en términos de POO, a las variables se les llama
atributos y a las funciones se les llama métodos. A su vez, al binomio formado
por los atributos y los métodos se le denomina miembros�de�una�clase. Así
pues, tanto un atributo como un método son miembros de la clase.
© FUOC • PID_00249622 12 Objeto y clase
2.2.1. Atributos
Los atributos, también llamados campos, son variables que codifican el estado Clase sin atributos
de un objeto.
Una clase puede no tener atri-
butos.
Si tenemos la clase Persona con los atributos nombre y edad –de tipo cadena de
caracteres y entero, respectivamente–, cada objeto que se defina del tipo Persona
Tipos de los atributos
tendrá estos dos atributos.
Un atributo puede ser de tipo
básico (entero, carácter, etc.)
El estado de cada objeto Persona dependerá de los valores que se les asigne a o de un tipo de clase concreta.
estos dos atributos, tal como se ve en la figura siguiente. Por ejemplo, de tipo Persona.
El tipo de los atributos se defi-
ne como cualquier otra varia-
ble.
Estado de un objeto
Aunque dos objetos compartan el mismo estado –es decir, mismos valores para
todos sus atributos–, estos dos objetos son diferentes. Solo hay que pensar que
puede haber dos personas llamadas David de edad 32 años en el mundo y,
obviamente, son personas (u objetos) diferentes.
2.2.2. Métodos
nombreMetodo(param1:tipo,...,paramN:tipo):tipoRetorno
hablar(texto:tabla[30] de caracteres):void
andar(velocidad:entero):void
© FUOC • PID_00249622 13 Objeto y clase
Dicho de otro modo, la firma del método se diferencia en la parte de los argu-
mentos. Un ejemplo de sobrecarga del método hablar podría ser:
hablar(texto:tabla[30] de caracteres):void
hablar(texto:tabla[30] de caracteres, velocidad:entero):void
El compilador decide qué método (cuál de los dos hablar) invocar comparando
los argumentos de la llamada con los de la firma.
Las clases tienen dos tipos de métodos especiales llamados constructor y destruc- Ved también
tor que no se consideran miembros de una clase, como tales. No son miembros
El concepto de herencia se es-
de la clase porque ni el constructor ni el destructor se heredan. tudia en el módulo «Asocia-
ción y herencia».
2.3.1. Constructor
1) Normalmente, el nombre del constructor es el mismo que el de la clase. Nombre del constructor
diferente a la clase
4) En general suele ser público, pero algunos lenguajes permiten que sea pri- Ved también
vado.
El concepto de público se estu-
dia en el módulo «Encapsula-
Hay lenguajes que permiten crear más de un constructor, por ejemplo C++, C# ción y extensión» de esta asig-
natura.
y Java, entre otros. En estos casos, al constructor sin parámetros/argumentos
se le suele llamar constructor�por�defecto�o�predeterminado, mientras que
aquellos que tienen parámetros se les llama constructores�con�argumentos.
Como se puede apreciar, decir «constructor por defecto» y «con argumentos»
es lo mismo que decir que se hace una sobrecarga del constructor. Debido a
la sobrecarga, la única limitación cuando se quiere (y se puede) crear más de
un constructor es que no pueden declararse varios constructores con el mismo
número y el mismo tipo de argumentos.
En los lenguajes en los que solo se puede codificar un constructor –por ejem-
plo, PHP5 y Python–, a este se le llama simplemente constructor.
Por último, hay que resaltar que, en muchos lenguajes, no es obligatorio que
una clase tenga un constructor por defecto. Puede interesarnos que todos sus
constructores sean con argumentos.
2.3.2. Destructor
4) No recibe parámetros.
Para definir una clase de una manera formal y gráfica, se suele utilizar el dia- Independencia del
grama�de�clases del lenguaje UML (Unified Modeling Language). lenguaje
Diagrama de clases
adaptado al lenguaje de
programación
2) La parte central define los atributos de la clase –nombre y edad– y el tipo al String
que pertenecen. Para cada atributo hay que indicar el tipo que debería ser con
El tipo cadena de caracteres se
independencia de si el lenguaje de programación lo soporta o no. Por ejemplo, define en muchos lenguajes,
podríamos decir que un atributo debería ser del tipo Date para indicar que debe como en Java, mediante una
clase llamada String.
ser una fecha. En Java existe el tipo Date (es una clase), pero en PHP no. Así
pues, en PHP deberíamos o bien hacer que ese atributo fuera del tipo permitido
© FUOC • PID_00249622 16 Objeto y clase
por PHP que mejor modele las características de una fecha (por ejemplo, un
String) o bien hacer varios atributos tipo int, es decir, uno para el día, otro para
el mes y otro para el año.
3) La parte de abajo define los métodos de la clase indicando su firma, es decir, Void en los diagramas de
los parámetros que recibe y su tipo, así como el tipo de valor que devuelve. En clases
caso de no devolver nada, no se indica ningún tipo de devolución. En los diagramas de clases, al-
gunas personas sí indican ex-
plícitamente con la palabra
También podemos observar que se definen los constructores (en este caso el void como valor de retorno
que un método no devuelve
por defecto y dos con argumentos) así como el destructor (en los lenguajes en nada.
que es posible implementar un destructor).
En este punto, cabe destacar que el diagrama de clases UML que hemos repre-
sentado para la clase Persona no es completo, lo acabaremos de completar en el
módulo «Encapsulación y extensión». Este diagrama solo define lo que hemos
visto hasta ahora.
Setter’s y getter’s
En las clases se suelen crear métodos para asignar y consultar los valores de sus atributos.
Al método que asigna el valor se le llama setter (por eso su nombre es set + el nombre del
atributo) y al que consulta se le llama getter (de ahí que su nombre sea get + el nombre
del atributo). En el ejemplo anterior, el método setter del atributo nombre es setNombre y
el método getter del mismo atributo es getNombre.
A falta de un pequeño detalle, hemos visto cómo representar una clase utili-
zando el lenguaje gráfico UML. Incluso hemos visto un pseudocódigo de una
clase basándonos en el concepto de tupla.
class Persona{
String nombre;
int edad;
Ved también
No aparece el método destructor porque en Java no existe como tal y, en este caso, no
es necesario crear el método finalize.
3. Objeto
3.1. Instancia
Como ya hemos comentado, los objetos son ejemplares de una clase. Así pues,
a la hora de crear un objeto, debemos seguir los siguientes pasos:
1) Declarar el objeto.
Persona persona1;
Como hemos leído en la definición formal de objeto, todo objeto en la POO Ved también
tiene un estado y un comportamiento. Esto es así porque los objetos (o enti-
La definición formal de objeto
dades) de la vida real comparten estas dos características. está disponible en el subapar-
tado 1.1 de este módulo.
© FUOC • PID_00249622 19 Objeto y clase
Veamos varios ejemplos para entender mejor estos dos conceptos y ver cómo
cualquier entidad (u objeto) de la vida real tiene un estado y un comporta-
miento:
• Incluso una factura tiene un estado (cobrada o no, importe total, paga
y señal abonada, etc.) y un comportamiento (cambiar de no cobrada a
cobrada y viceversa, modificar el valor del importe total, etc.).
Así pues, si un televisor concreto (el objeto) tiene el atributo canal actual igual
a 5, ese televisor está en un estado diferente a si tuviera el canal actual igual
al número 6.
© FUOC • PID_00249622 20 Objeto y clase
Si nos fijamos en los ejemplos anteriores, nos daremos cuenta de que hay dos
tipos de métodos:
1) Aquellos que hacen acciones que realiza la entidad real (por ejemplo, ladrar
en el caso del perro, calcular el área de un rectángulo, la acción de encenderse
de un televisor, etc.).
2) Aquellos que operan directamente sobre los atributos del objeto. Por un
lado, están los métodos que modifican el valor de los atributos del objeto (por
ejemplo, modificar el número de teléfono de un contacto o el canal actual de
un televisor) y que, por consiguiente, cambian el estado del objeto. Por otro
lado, están los métodos que consultan el valor de los atributos del objeto (por
ejemplo, consultar el número de teléfono de un contacto o el canal actual de
un televisor). Estos métodos de modificación y consulta son llamados setter
y getter, respectivamente.
3.3. Mensaje
Cuando los objetos quieren interactuar entre ellos utilizan mensajes. Un men-
saje es la manera que existe de acceder a los atributos y métodos de un objeto.
La forma de un mensaje, en la mayoría de lenguajes, sigue la siguiente sintaxis:
variable_del_objeto.miembro
//Instanciamos dos objetos del tipo "Persona" con dos constructores con argumentos diferentes
Persona persona1 = new Persona("David",32);
Persona persona2 = new Persona("Marina");
Ved también
Ved también
El ejemplo anterior es correcto, pero no es la práctica más habitual. ¿Por
qué? Como ya comentamos en el módulo «Introducción al paradigma El concepto de encapsulación
lo veremos en el módulo «En-
de la programación orientada a objetos», una de las razones que moti- capsulación y extensión».
varon un cambio respecto al paradigma de la programación estructura-
da fue ocultar los datos (es decir, los atributos) y obligar a los progra-
madores a usar funciones para consultar y modificar sus valores (es de-
cir, usar los métodos getter y setter). En otras palabras, se veía necesario
crear algún mecanismo para controlar el acceso a los datos. Es decir, no
deberíamos acceder –ya sea para consultar o modificar– a los atributos
de la siguiente manera:
persona1.nombre = "Elena";
int edadAux = persona2.edad;
persona1.setNombre("Elena");
int edadAux = persona2.getEdad();
Da igual dónde estés, aparta la mirada de esta página y mira a tu alrededor, ¡pero vuelve,
que tienes que seguir leyendo! ¿Qué ves? Quizás respondas: cosas. Bueno, no está mal,
pero intentemos usar una palabra más rica. Digamos: entidades. No está mal, pero ¿qué
tal si buscamos una palabra que no sea ni tan vulgar ni tan culta y que, además, haya
aparecido en estos apuntes? ¿Qué tal si decimos que lo que ves a tu alrededor son objetos?
A partir de este momento, ya no mirarás el mundo que te rodea de igual manera. Ahora
deberías estar viendo objetos –incluidos los seres vivos– que interactúan entre ellos.
Pongamos que estás en el despacho donde estudias o, mejor, en el sofá del comedor (el es-
tudio no es incompatible con la comodidad). Seguramente verás objetos muy diferentes,
unos más simples y otros más complejos. Por ejemplo, la lámpara que tienes al lado segu-
ramente solo tiene dos estados (encendido y apagado) y dos comportamientos (encender
y apagar). Otros, en cambio, como el televisor, tienen más estados y comportamientos.
Es más, un objeto puede ser tan complejo que puede incluso estar formado/compuesto
por otros objetos. Sin ir más lejos, un televisor tiene un mando a distancia, que es otro
objeto. O, si no lo ves claro, un coche tiene un volante, cuatro ruedas, etc. y cada uno de
ellos es un objeto (cada rueda es un objeto independiente). O, para verlo aún más claro,
© FUOC • PID_00249622 22 Objeto y clase
un teléfono inteligente es un objeto que dentro tiene una lista de apps, donde cada app
es un objeto.
Quizás en este momento has levantado la mirada y te has dado cuenta de que, en tu
despacho, hay una lámpara en el techo además de la lámpara fluorescente que hay en-
cima de tu mesa. ¡Ostras, dos objetos «lámpara»! Hum Mmmm..., tienen características
y comportamientos similares. ¡Ambos objetos son del tipo Lámpara! O mejor, ¡ambos
objetos son de la clase Lámpara!
Resumen
En este módulo hemos prestado especial atención, como no podía ser de otra
manera, a los conceptos de objeto y clase, así como a la relación que hay entre
ellos.
Bibliografía
Booch, G.; Jacobson, I.; Rumbaugh, J. (1999). El lenguaje de modelado unificado UML.
Madrid: Addison-Wesley Iberoamericana.
Rumbaugh, J.; Blaha, M.; Premernali, W.; Eddy, F.; Lorensen, W. (1996). Modelado
y diseño orientado a objetos. Madrid: Prentice Hall.