Logo DIE

Clases y Objetos

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


La programación orientada a objetos se basa en el hecho de que se debe dividir el programa en modelos de objetos físicos o simulados. Si se escribe un programa en un lenguaje orientado a objetos, se está creando un modelo de alguna parte del mundo, es decir, se expresa un programa como un conjunto de objetos que colaboran entre ellos para realizar tareas.

Un objeto es, por tanto, la representación en un programa de un concepto y contiene toda la información necesaria para abstraerlo: datos que describen sus atributos y operaciones que pueden realizarse sobre los mismos.

Los objetos pueden agruparse en categorías y una clase describe, de un modo abstracto, todos los objetos de un tipo o categoría determinada.





Aplicar los elementos básicos de la programación orientada a objetos en un lenguaje de programación para la solución de problemas.

Objeto


La idea fundamental de la programación orientada a objetos y de los lenguajes que implementan este paradigma de programación es combinar (encapsular) en una sola unidad tanto los datos como las funciones que operan (manipulan) sobre los datos. Esta unidad de programación se denomina objeto.

Entonces, un objeto es una encapsulación genérica de datos y de los procedimientos para manipularlos. En otras palabras, un objeto no es más que un conjunto de atributos (variables o datos) y métodos o funciones relacionados entre sí.

Diagrama de bloques

Figura 1. Conceptualización de un objeto en POO


El objeto es el centro de la programación orientada a objetos. Un objeto es algo que se visualiza, se utiliza y que juega un papel o un rol en el dominio del problema del programa. La estructura interna y el comportamiento de un objeto, en consecuencia, no son prioritarios durante el modelado del problema.



Clase

En el mundo real existen varios objetos de un mismo tipo o de una misma clase, por lo que una clase equivale a la generalización de un tipo específico de objetos. Una clase es una plantilla que define las variables y los métodos que son comunes para todos los objetos de un cierto tipo.

Una clase es la implementación de un tipo abstracto de datos y describe no sólo los atributos (datos) de un objeto sino también sus operaciones (comportamiento).

En Java para definir una clase se utiliza la palabra reservada class seguida del nombre de la clase.

class NombreDeLaClase

En UML una clase se representa de manera gráfica con tres rectángulos dispuestos de manera vertical, uno debajo de otro. En el primero se anota el nombre de la clase, en el segundo los atributos y en el tercero las operaciones, es decir:

Clase en UML

Figura 2. Diagrama de clase en UML



Ejemplar o instancia

Una vez definida la clase, se pueden crear objetos a partir de ésta, a dicho proceso se le conoce como crear ejemplares de una clase o instanciar una clase. En este momento el sistema reserva suficiente memoria para el objeto con todos sus atributos.

Una instancia es un elemento de una clase, es decir, un objeto. Cada uno de los objetos o instancias tiene su propia copia de las variables definidas en la clase de la cual son instanciados y comparten la misma implementación de los métodos. Sin embargo, cada objeto asigna valores a sus atributos y es totalmente independiente de los demás.

En Java para crear una instancia se utiliza el operador new seguido del nombre de la clase y un par de paréntesis.

new NombreDeLaClase( );

Mensajes

Los objetos de un programa interactúan y se comunican entre ellos por medio de mensajes.

La acción de un objeto ante un mensaje puede ser el envío de otros mensajes, el cambio de su estado o la ejecución de cualquier otra tarea que se requiera que haga el objeto.

Cuando un objeto A quiere que otro objeto B ejecute uno de sus métodos, el objeto A manda un mensaje al objeto B.

Diagrama de bloques

Figura 3. Mensajes entre objetos



En ocasiones, el objeto que recibe el mensaje necesita más información para saber exactamente lo que tiene que hacer. Esta información se pasa junto con el mensaje en forma de parámetro.

En Java para que un objeto ejecute algún método se utiliza el operador punto ( . ):

objeto.nombreDelMetodo( parametros );





Métodos


Los métodos especifican el comportamiento de los objetos de la clase. Cuando se declara un método se debe especificar cuál es el tipo del parámetro que devolverá void en caso de que no devuelva nada.

Al declarar un método también se debe especificar el tipo y nombre de cada uno de los parámetros o argumentos que reciba el método entre paréntesis. Si un método no tiene parámetros, éste queda vacío (no es necesario escribir void). Los parámetros de los métodos son variables locales a los métodos y existen sólo en el interior de éstos.

Dentro de un método, los argumentos pueden tener el mismo nombre que los atributos de la clase; de ser así, los argumentos “ocultan” a los atributos. Para acceder a los atributos en caso de ocultación se referencian a partir del objeto actual this.

En Java se declara un método de la siguiente manera:

tipoDato nombreDelMetodo( tipoDato parametro1, tipoDato parametro2, …)

Ejemplo

Se crea una clase Punto para representar un punto en el espacio de 2D, cuyos atributos sean las coordenadas (x, y).

Se crea una clase de PruebaPunto para crear objetos de la clase Punto. Dentro de la clase PruebaPunto se tiene un método main y se crean dos objetos de la clase Punto.
Ejemplo:

La clase contiene un método que imprime los valores de las coordenadas del punto.

Una vez creadas se da valor a sus atributos y se manda ejecutar el método imprimePunto.
Ejemplo:



Sobrecarga de métodos (overload)

La sobrecarga de métodos se refiere a la posibilidad de que dos o más métodos utilicen el mismo nombre en una clase; para ello, los métodos sólo deben variar los argumentos y, opcionalmente, también pueden tener diferentes valores de retorno. Los métodos sobrecargados hacen más cómoda la implementación de un objeto y, por ende, la utilización de los métodos de éste.

Los métodos sobrecargados tienen las siguientes características:

Deben tener el mismo nombre

Deben cambiar la lista de argumentos

Pueden cambiar el valor de retorno

Pueden cambiar el nivel de acceso



Java permite métodos sobrecargados (overloaded); es decir, métodos distintos que tienen el mismo nombre, pero que se diferencian por el número o tipo de argumentos.

Por ejemplo:

public void imprimePunto( )
public void imprimePunto(int x, int y)
public void imprimePunto(float r, float th)

Al llamar a un método sobrecargado, Java sigue algunas reglas para determinar el método concreto que debe llamar:

Ejemplo:

Diagrama de bloques

Diagrama de bloques



Métodos de clase (estáticos)

Hay métodos que no requieren un objeto para ser invocados, se pueden ejecutar a través de la clase. A estos métodos se les llama métodos de clase o estáticos. Estos métodos pueden recibir argumentos y tener un valor de retorno, pero no pueden utilizar la referencia this.

La clase java.lang.Math posee sólo métodos estáticos:

sin( ), cos( ), exp( ), pow( ), etc.

En Java, los métodos y variables de clase se crean anteponiendo a su declaración la palabra static. Para llamarlos se suele utilizar el nombre de la clase, en vez del nombre de un objeto de la clase.

Ejemplo:

Declaración de la variable PI como estática.

public class Circulo {
        static float PI = 3.14159f;
        private float radio;
        …
}

En otra clase se puede usar el método o variable, utilizando al nombre de la clase:

System.out.println(Circulo.PI);

Los atributos static tendrán el mismo valor para todos los objetos. Es decir, si se modifica el valor de un atributo static, el cambio afectará a todos los objetos. Lo anterior sucede porque de una variable estática no hay copias, por tanto, todos los objetos trabajan con la misma variable.

Constructores


Un constructor es un método que tiene el mismo nombre que la clase y cuyo propósito es inicializar los atributos de un nuevo objeto. Se ejecuta automáticamente cuando se crea un objeto o instancia de la clase.

Dependiendo del número y tipo de los argumentos proporcionados se llama al constructor correspondiente.

Si no se ha escrito un constructor en la clase, el compilador proporciona un constructor por defecto, el cual no tiene parámetros e inicializa los atributos a su valor por defecto.

Las reglas para los constructores son:

Diagrama de bloques



Cuando se define un objeto se transfieren los valores de los parámetros al constructor utilizando una sintaxis similar a una llamada a un método.

Ejemplo:

Para la clase Punto se declara un constructor que recibe los valores de las coordenadas (x, y) y dichos valores son asignados a los atributos correspondientes (x, y).



Diagrama de bloques

Cuando se declara implícitamente un constructor, Java deja de agregar el constructor por defecto (el constructor sin parámetros), por lo que no se pueden crear objetos con los parámetros por defecto. En este caso la clase de prueba ahora marcará un error.

Diagrama de bloques
Diagrama de bloques

Para solucionar el error de la figura existen dos alternativas

Cambiar la creación de objetos en la clase prueba, enviando los valores (x, y) desde el momento de su creación.



Diagrama de bloques


Agregar un constructor por defecto (sin parámetros) en la clase Punto para inicializar los atributos a un valor por defecto (que se desee) o bien puede estar sin implementación.



Diagrama de bloques



En este último caso, dado que se cuenta con dos constructores distintos (diferenciados por el número y tipo de parámetros) se tendrían disponibles las dos formas de crear instancias, ya sea con los valores por defecto o pasándolos como parámetros.

Diagrama de bloques

Destrucción de objetos (liberación de memoria)


Los objetos se asignan dinámicamente en la memoria, por tanto, cuando los objetos se destruyen es necesario verificar que la memoria ocupada por ellos ha quedado liberada.

El procedimiento es distinto según el tipo de lenguaje utilizado:

Diagrama de bloques



En Java y C# se hace de modo automático utilizando una técnica conocida como garbage collection (recolección de basura).

Un objeto que no es apuntado por alguna referencia es inalcanzable y, por tanto, se entiende que ese objeto ya no se necesita y la memoria ocupada por éste puede ser recuperada (liberada), entonces el sistema se ocupa automáticamente de liberar la memoria utilizando el garbage collector.

Durante la ejecución de un programa, no se sabe exactamente cuándo se va a activar el garbage collector, si no falta memoria es posible que no se llegue a activar en ningún momento. Por lo cual no es conveniente confiar en él para la realización de otras tareas más críticas.



Java no soporta destructores, pero existe el método finalize( ) que es lo más aproximado a un destructor para liberar todos los recursos de un objeto. Las tareas dentro de este método serán realizadas cuando el objeto se destruya y se active el garbage collector.





ícono

Actividad 1. Creación de un sistema de administración de alumnos y profesores

Un objeto representa la materialización de una clase y es la base de todo programa dentro de la programación orientada a objetos, el cual contiene los datos fundamentales y los métodos para la manipulación de éstos.

Una clase equivale a la abstracción de un tipo específico de objetos, es decir, es una plantilla o molde que define las variables (atributos) y las funcionalidades (métodos) que son comunes para todos los objetos que se creen a partir de esa clase.

ícono

Actividad 2. Uso de colecciones en la creación de un sistema de administración de alumnos y profesores

Una colección es un objeto que almacena un conjunto de referencias a objetos, es parecido a un arreglo de objetos. Sin embargo, a diferencia de los arreglos, las colecciones son dinámicas, en el sentido de que no tienen un tamaño fijo y permiten añadir y eliminar objetos en tiempo de ejecución.

ícono

Autoevaluación. Creación de clases y objetos en lenguaje de programación Java

La programación orientada a objetos se basa en el hecho de que se debe dividir el programa, no en tareas, sino en modelos de objetos físicos o simulados. Si se escribe un programa en un lenguaje orientado a objetos, se está creando un modelo de alguna parte del mundo; es decir, se expresa un programa como un conjunto de objetos que colaboran entre ellos para realizar tareas.


Fuentes de información

Joyanes, L. (2008). Fundamentos de programación. Algoritmos, estructuras de datos y objetos (4.ª ed.). México: McGraw-Hill.

Martin, A. (2008). Programador Certificado Java (2.ª ed.). México: Alfaomega.

Sierra, K. y Bates, B. (2008). Sun Certified Programmer for Java 6 Study Guide. Estados Unidos de América: McGraw-Hill.


Cómo citar


Solano, J. A. (2020). Clases y objetos. Unidades de Apoyo para el Aprendizaje. CUAIEED/Facultad de Ingeniería-UNAM. Consultado el (fecha) de (vínculo)