You are on page 1of 9

Introducción a la Programación Orientada a

Objetos
A. PROGRAMACIÓN ORIENTADA A OBJETOS *

B. ATRIBUTOS *

C. MÉTODOS *

D. ENCAPSULADO Y OCULTACIÓN DE OBJETOS *

E. HERENCIA *

F. POLIMORFISMO *

G. SOBREESCRIBIR *

H. DESTRUCCIÓN DE OBJETOS *

I. POR QUÉ SE DISEÑÓ JAVA *

A. PROGRAMACIÓN ORIENTADA A OBJETOS

La programación orientada a objetos es un paradigma para crear programas que


sobreviven a los cambios inevitables que acompañan al envejecimiento de cualquier
sistema. Se pueden extraer partes de un sistema antiguo con facilidad, puesto que se
entiende la función de cada objeto y se tienen interfaces limpias y fiables entre los
mismos.

Java incorpora el uso de la orientación a objetos como uno de los pilares básicos del
lenguaje. El elemento básico no es la función sino un ente denominado objeto. Un
objeto es la representación de un programa en un concepto y contiene toda la
información necesaria para abstraerlo: datos que describen sus atributos y operaciones
que pueden realizarse sobre los mismos.

La programación orientada a objetos trata de amoldarse al modo de pensar del hombre y


no al de la máquina.

Una clase no es más que un modelo o plantilla para la creación de objetos. Antes de
poder utilizar un objeto se debe indicar que tipo de objeto es, es decir, la clase.

Esto es un ejemplo de código en Java:

Public class EntradaAgenda {

public String nombre;

public String apellidos;


public String direccion;

public String poblacion;

public String provincia;

public String codigoPostal;

public String prefijo;

public String telefono;

public void muestraEntrada ( ) {

System.out.println("Nombre: " + nombre


+ " " + apellidos);

System.out.println ("Dirección: " +


direccion + " "+poblacion);

System.out.println (" " + provincia + "


" + codigoPostal);

System.out.println ("Telefono: (" +


prefijo + ") " + telefono);

Para crear un objeto de la clase que se acaba de definir se utilizaría new del modo
siguiente:

EntradaAgenda unaEntrada;

UnaEntrada = new EntradaAgenda ( );

La primera sentencia indica al compilador que se va a usar un objeto de la clase


EntradaAgenda, pero aún no se ha creado dicho objeto, sólo la referencia al mismo. La
segunda sentencia crea el nuevo objeto asociándolo a ese nombre. New se emplea para
crear objetos representantes de la clase que se le indica a continuación del new.

B. ATRIBUTOS

Los atributos son datos específicos de una clase. En la definición de clase se indica
cuales son los atributos y conque nombre se va a designar a cada uno de ellos. El que
una declaración de atributo sea pública significa que el elemento definido pueda
utilizarse libremente desde cualquier otro punto del programa.

En el caso de una clase su carácter público es necesario para poder crear objetos de esa
clase en otros puntos del programa (new). Para acceder a un atributo hay que indicarle el
nombre del objeto al que pertenece:

unaEntrada.nombre = "Juan Pablo"

unaEntrada.apellidos = "de Frutos Martínez"

C. MÉTODOS

Son los métodos de una clase son funciones propias de la misma, formando parte de su
definición. Cada instancia de la clase contiene los métodos y atributos particulares de la
misma. Los métodos de una clase operan sobre los atributos particulares. La llamada de
un método es similar a la consulta de atributo: nombre de objeto.método:

unaEntrada.muestraDatos ( );

Los paréntesis son obligatorios para la definición de los métodos aunque no se emplee
ningún argumento. Una de las consecuencias de que Java sea un lenguaje orientado a
objetos es que todo el código que se escriba ha de estar incluido dentro de una clase.

La creación de un objeto mediante new involucra la invocación de un método especial


de la clase denominado constructor, encargado de realizar las funciones de
inicialización necesarias para la correcta creación del objeto. El compilador de Java
introduce un constructor de forma implícita si el programador no proporciona un
constructor propio.

Los lenguajes orientados a objetos, proporcionan mecanismos que refuerzan el modelo


orientado a objetos. Los mecanismos fundamentales se llaman encapsulado, herencia y
polimorfismo. 

D. ENCAPSULADO Y OCULTACIÓN DE OBJETOS

Hay que tener presente que todos los programas en su nivel más simple constan de dos
cosas: código y datos. Para tener una idea sobre lo que es el encapsulado, se puede
pensar en un envoltorio protector alrededor del código y los datos que se manipulan. El
envoltorio, que como se ve protege el código y define el comportamiento, también
protege los datos para evitar que otro código acceda a ellos de manera arbitraria. El
poder del código encapsulado viene dado por el conocimiento tan extensivo de acceso al
mismo y puede ser utilizado de este modo independientemente de los detalles de
implementación.

En Java, la base del encapsulado es la clase. Se crea una clase que representa una
abstracción para un conjunto de objetos que comparten la misma estructura y
comportamiento. Un objeto es una estancia única de una clase que mantiene la
estructura y comportamiento de la misma. A estos objetos se les llama instancia de una
clase. El comportamiento e interfaz de una clase se definen mediante métodos que
operan sobre los datos de una instancia. Un método es un mensaje para realizar alguna
acción en un objeto.

A la hora de llevar a cabo el encapsulado existen métodos para ocultar la complejidad


de la implementación dentro de una clase. Cada método o variable se puede marcar
como público o privado. La interfaz pública representa todo lo que los usuarios externos
de la clase necesitan conocer o pueden conocer. Los métodos y datos privados no
pueden ser accedidos. Es aconsejable ocultar la mayoría de las variables de una
instancia. Esto ayuda a proteger el objeto frente a la manipulación de los datos por
métodos ajenos a la clase.

La clase es lo que agrupa los atributos generales de un objeto y los métodos para operar
en él. Una instancia es un caso concreto de la clase de un objeto.

Un programa escrito en Java es un conjunto de clases interrelacionadas, cada una de las


cuales contienen métodos (funciones) y atributos (datos) propios. Los elementos
contenidos en una clase son responsabilidad única y exclusiva de ésta y no pueden ser
modificados por ninguna otra. Sin embargo, una de las características principales es que
las clases están interrelacionadas, pues son todas partes de un mismo problema y
cooperan entre sí para lograr la solución. Para conseguir esta relación sin comprometer
la privacidad de sus componentes se crea una interfaz que define los únicos caminos, a
través de los cuales puede establecer una comunicación con el resto de las clases. La
interfaz será por lo tanto un conjunto de métodos que deberán ser accesibles
públicamente para que otras clases puedan utilizarlos.

Para limitar el acceso a las variables internas de una clase, se añade el término private
antes de su declaración. Así se limita el acceso desde el exterior. Cuando una variable
tiene la característica private, será invisible incluso para las clases que hereden de ésta.
Si se quiere mantener la integridad, pero que a la vez esos atributos puedan ser
heredados, se utilizará el modificador protected en vez de private.

public class EntradaAgenda {

protected String nombre;

. . .

public class EntradaAmigo extends EntradaAgenda {

private String apodo;

. . .

Así nombre podrá ser heredado en la clase EntradaAmigo, pero continua siendo
inaccesible para el resto de las clases.
Para tener la certeza de que todo funciona del modo adecuado, evitar la modificación de
los datos es algo necesario y la manera de conseguirlo es haciendo invisibles los datos al
exterior.

Como beneficios del encapsulado se obtienen los siguientes:

Las clases se pueden desarrollar de manera independiente: la implementación que se


haga de cada una de ellas no influye en el resto de las implementaciones.

Una vez escrita una clase y se comprueba que su funcionamiento es correcto, se tendrá
la certeza de que siempre lo será.  

E. HERENCIA

El mecanismo de herencia permite definir nuevas clases partiendo de otras ya


existentes, de este modo se consigue reflejar todos los niveles de generalización que se
deseen.

// EntradaAmigo.java

// Subclase de EntradaAgenda, para entradas de amigos

import java.util.Date;

public class EntradaAmigo extends EntradaAgenda {

public String apodo; // Apodo o apelativo


cariñoso

public Date nacimiento; // Fecha de nacimiento

public boolean casado; // true si está casado

public String nombrePareja; // Nombre del cónyuge


o del novio/a

//Nuevo método, devuelve el nombre de la pareja

public String dame Pareja ( ) {

return nombrePareja;

// Sobrescribe EntradaAgenda.dameNombre ( )

// Aquí devuelve el apodo en lugar del nombre


public String dameNombre ( ) {

return apodo;

// Sobrescribe EntradaAgenda.muestraEntrada ( )

public void muestraEntrada ( ) {

super.muestraEntrada ( ); //Llama al de
su padre

if (casado) System.out.println
("Conyuge: " + nombrePareja);

else System.out.println (Novio/a: " +


nombrePareja);

System.out.println ("Fecha de
nacimiento: " +

nacimiento.getDay ( ) +" del " +


(nacimiento.getMonth ( ) + 1) + " del "
+ nacimiento.getYear ( ) );

// EntradaContacto.java

// Subclase de EntradaAgenda, para entradas de contactos

// profesionales

public class EntradaContacto extends EntradaAgenda {

public String nombreEmpresa;

public String cargo;

public String numeroFax;

// Sobrescribe EntradaAgenda.muestra Entrada ( )

public void muestraEntrada ( ) {


System.out.println (cargo + " en " +
nombre Empresa);

Super.muestraEntrada ( ) ; // Lama al
de su padre

El término extends indica que una clase deriva de otra heredando todas sus propiedades.
A una clase derivada de otra se le denomina subclase, mientras que la clase de la cual
procede recibe el nombre de superclase. En todo lenguaje orientado a objetos existe una
jerarquía de clases relacionadas en base a términos de herencia. En Java el punto más
alto de la jerarquía es la clase object de la cual derivan en último término todas las
demás clases. Object proporciona una serie de capacidades básicas que son comunes a
todas las clases. Si en la definición de la nueva clase no aparece el término extends Java
considera que tal clase deriva directamente de object.

Una clase hereda de cada uno de sus antecesores en la jerarquía de la clase. Java no
admite herencia múltiple, sino que es un lenguaje de herencia única. La herencia
interactúa con el encapsulado. Si una clase dada encapsula algunos atributos, cualquier
subclase tendrá esos mismos atributos más los que ésta necesita.

Sun ha definido un conjunto de clases de propósito general que pueden ser utilizadas
por el programador para realizar aplicaciones o como base para el desarrollo de nuevas
clases especializadas. La clase Date y la clase System son una de esas clases estándar.

Las clases que conforman una biblioteca estándar están organizadas en paquetes
(packages) que agrupan un conjunto de clases cuya finalidad es similar. Antes de poder
utilizar una clase es preciso indicar el paquete donde se encuentra.

import java.util.Date;

La definición de métodos con el mismo nombre que los ya existentes en la superclase


dota al método de una funcionalidad diferente. Esta técnica se denomina method
overriding, lo cual se puede traducir como sobreescritura de métodos.

La herencia permite abordar la resolución de un problema de forma ordenada, partiendo


de aspectos generales para descomponerlos en elementos cada vez más particulares La
herencia es la base para introducir nuevas funciones a programas ya existentes sin
alterar su comportamiento anterior.  

En este lenguaje el concepto de programa es diferente al tradicional, no se trata de un


conjunto de instrucciones en código máquina sino de un conjunto de clases. Para
ejecutar un programa basta con indicarle al intérprete cual es la clase donde va a
comenzar y el mismo se encargará de buscar y utilizar la de definición de cada una de
las clases que vaya necesitando para proseguir la ejecución. Algunas de las ventajas que
se consiguen con este intérprete son las siguientes:
 Java permite una auténtica reutilización del código. Una vez definida una clase
no hay que preocuparse de tener que incluirla explícitamente en todos los
programas que la necesiten. Para usarla únicamente se debe saber como
funciona, hacer referencia a ella en nuestro programa y asegurarnos que su
código compilado (class) reside en un lugar conocido por el intérprete. No es
necesario efectuar ningún proceso del enlazado de todos los ficheros compilados
para obtener un ejecutable como sucede en todos los lenguajes no interpretados.
 La búsqueda de clases no tiene porque restringirse a la máquina local donde se
ejecuta el programa. Cuando se utiliza un navegador para ejecutar un applet que
reside en cualquier punto de Internet, las clases necesarias pueden cargarse
desde el ordenador remoto de donde procede el applet. Esto permite utilizar una
clase sin más que conocer su funcionamiento y la dirección de Internet donde
puede encontrarla el intérprete. 

F. POLIMORFISMO

Polimorfismo significa un objeto y muchas formas, es decir, permite que un método


tenga múltiples implementaciones en base al tipo de objeto que se le pasa en la llamada.
A esto se le conoce como sobrecarga del método. Los métodos que actúan sobre los
objetos requieren información en forma de parámetros. Java es un lenguaje fuertemente
equipado, es decir, los tipos deben ser exactamente iguales porque en caso contrario no
se entiende el mensaje.

G. SOBREESCRIBIR

La sobrecarga de un método es una manera que tiene una clase de tratar con tipos
diferentes de una manera uniforme. Es estática porque el implementador de la clase
necesita conocer todos los tipos que se van a encontrar antes de escribir los métodos. La
utilización de subclases permite construir niveles de polimorfismo en tiempo de
ejecución más dinámico. Si se declara una subclase se puede sobre escribir un método
concreto para que se comporte de manera diferente al de la superclase.

H. DESTRUCCIÓN DE OBJETOS

Los objetos no se destruyen nunca. Java dispone de un mecanismo conocido como


recogida de basura que permite eliminar automáticamente la memoria de los objetos
que ya no se utiliza. Se basa en detectar de forma automática el momento en el que ya
no existen referencias a un objeto determinado, lo que indica que se ha dejado de
utilizar. De este modo el programador no debe preocuparse de introducir el código para
destruir el objeto en un momento preciso y es imposible desarrollar programas que
realicen una liberación errónea de memoria.

Java aprovecha la capacidad multithread del lenguaje, de modo que esta operación se
ejecutará mayoritariamente en los tiempos muertos del programa (generalmente
esperando alguna respuesta por parte del usuario).

La recogida de basura únicamente elimina objetos de la memoria, pero no libera los


recursos que dichos objetos puedan estar utilizando como los descriptores de ficheros, o
sockets de comunicaciones. Java dispone de un método especial para ello denominado
finalize ( ). El método finalize está definido en la clase object El programador no debe
preocuparse de determinar el momento exacto en que debe invocar este método, puesto
que el recolector de basura realiza automáticamente la invocación una vez que ha
determinado que un objeto ha dejado de utilizarse y puede destruirse. En cualquier caso,
para asegurarse de que los recursos se liberan adecuadamente, basta incluir en el método
finalize de la clase el código adecuado.

You might also like