Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 10

JAVA Y LA ORIENTACIÓN A OBJETOS.

    Java, como anteriormente hemos comentado es un lenguaje orientado a


objetos. Profundicemos en los aspectos teóricos de la programación orientada a
objetos.

Dos Paradigmas.

    Todos los programas están formados por código y datos, al mismo tiempo un
determinado programa puede estar organizado en base a su código o a sus datos.
Así, nos encontramos con dos posibles paradigmas:

    • Modelo orientado a proceso: el programa consiste en una serie de pasos


lineales; el código actúa sobre los datos. Este es el caso de algunos lenguajes
basados en procedimientos, como el lenguaje C.

    • Modelo orientado a objetos: el programa se organiza en torno a sus datos


(objetos) y la comunicación entre los objetos se produce mediante un conjunto de
interfaces bien definidas (métodos). Un programa orientado a objetos se puede
interpretar como datos que controlan el acceso al código. Con este enfoque se
pueden conseguir algunas ventajas de organización.

Abstracción.

    La abstracción es un concepto clave de la programación orientada a objetos.


Consiste en una manera de gestionar la complejidad, de forma que consideremos
los objetos como entes bien definidos con un comportamiento propio único, sin
considerar los detalles internos de estos objetos. Por ejemplo, abstraemos el
objeto "coche" cuando lo consideramos con un fin determinado (por ejemplo,
para hacer un viaje), sin tener en cuenta que un coche se compone de cientos de
piezas y posee unos mecanismos internos complejos.

    Una forma de gestionar la abstracción es utilizando clasificaciones jerárquicas;


esto permite dividir en niveles la semántica de los sistemas complejos, tratando
así con partes más manejables. De esta forma, los datos de los programas
algorítmicos tradicionales se transforman mediante la abstracción en objetos.
Cada objeto tiene un comportamiento propio, y los objetos se comunican entre sí
por medio de mensajes: es decir, un objeto solicita un servicio de otro enviándole
un mensaje. Ésta es la esencia de la programación orientada a objetos.
Principios de la Programación Orientada a Objetos.

    Los principios básicos de la programación orientada a objetos son tres:

    • Encapsulado 
    • Herencia 
    • Polimorfismo.

Encapsulado.

    El encapsulado es el mecanismo que permite juntar el código y los datos que
manipula éste, para mantenerlos alejados de posibles interferencias o usos
indebidos. Es como un envoltorio protector que evita que otro código que está
fuera pueda acceder arbitrariamente al código o a los datos. De esta forma, el
acceso al código y a los datos se realiza de forma controlada a través de una
interfaz bien definida.

    El poder del código encapsulado es que todo el mundo conoce cómo acceder a
él y pueden utilizarlo independientemente de los detalles de implementación; y
esto sin temor a efectos laterales inesperados.

    Con el encapsulado se consigue al ocultar información. Se ocultan todos los


secretos de un objeto que no contribuyen a sus características esenciales,
típicamente la estructura de un objeto se encuentra oculta y sólo son los métodos
los que pueden acceder a esa estructura interna (es lo único visible al exterior).

    En Java, la base del encapsulado es la clase. Una clase define la estructura y el
comportamiento (datos y código) que serán compartidos por un conjunto de
objetos. Cada objeto de una clase dada contiene la estructura y el
comportamiento definidos por la clase; a los objetos se les llama
también instancias de una clase. Una clase es una construcción lógica, mientras
que un objeto tiene realidad física.

    Cuando se crea una clase, hay que especificar el código y los datos que la
constituyen. Estos elementos son los miembros de la clase. Los datos definidos
por la clase son las variables miembro o variables de instancia. El código que
opera sobre esos datos se llama método miembro, o simplemente método. La
palabra equivalente a método en C/C++ sería función. En un programa Java
escrito correctamente, los métodos definen cómo se pueden utilizar las variables
miembro. De esta manera, el comportamiento y la interfaz de una clase se
definen mediante métodos que operan sobre sus datos de instancia.
    Como el propósito de una clase es encapsular la complejidad, debería haber
mecanismos para ocultar la complejidad de la implementación dentro de la clase.
Por esto, cada variable o método de una clase puede marcarse como público o
privado:

    Si una variable o método de una clase es público, los usuarios externos a la
clase pueden acceder a esa variable o método; sin embargo, si una variable o
método de una clase es privado, entonces sólo puede ser utilizado por código
miembro de la clase.

    Cualquier otro código que no es miembro de la clase no puede acceder a un


método o variable privado. Como los métodos privados de una clase sólo se
pueden utilizar por otras partes del programa a través de los métodos públicos de
la clase, de esta forma se asegura que no se van a producir accesos no permitidos.
Esto quiere decir que la interfaz pública debería ser diseñada cuidadosamente
para no exponer demasiado los trabajos internos de una clase.

Herencia.

    La herencia es el mecanismo mediante el cual un objeto adquiere (o hereda)


las propiedades de otro. De esta forma se consigue la clasificación jerárquica. Si
no se hiciera una clasificación jerárquica de los objetos, cada objeto debería
definir todas sus características explícitamente, y esto no sería viable.

    Sin embargo, utilizando la herencia, un objeto puede heredar sus atributos
generales de otro objeto (su padre), y definir explícitamente sólo aquellas
cualidades que lo hacen único dentro de su clase. Por tanto, la herencia es el
mecanismo que permite a un objeto ser una instancia específica de un caso más
general.

    Una clase que hereda de otra, se denomina subclase, y aquella clase de la que
se hereda, se denomina superclase.

    Por ejemplo, supongamos que se define una clase para describir a los
animales; se podría definir otra clase para describir a los mamíferos. La clase
"mamíferos" heredaría todos los atributos de la clase "animales", pero además
definiría una serie de atributos específicos de los mamíferos, como el tipo de
dientes, o las glándulas mamarias. En este caso, la clase "mamíferos" es subclase
de "animales", y la clase "animales" es superclase de "mamíferos".
    Una subclase hereda todos los atributos de cada uno de sus antecesores en la
jerarquía de clases. Esta característica permite a los programas orientados a
objetos crecer en complejidad de manera lineal en vez de geométrica.

Polimorfismo.

    El polimorfismo, es una característica que permite que una interfaz sea
utilizada por una clase general de acciones. La acción específica se determina a
partir de la naturaleza exacta de la situación.

    El concepto de polimorfismo se puede expresar con la frase "una interfaz,


varios métodos". Esto reduce la complejidad permitiendo que la misma interfaz
se utilice para especificar una clase general de acción. El compilador es quien
debe seleccionar la acción específica (esto es, el método) que se debe ejecutar en
cada situación; el programador no tiene que preocuparse por hacer esta selección
manualmente, sino que sólo necesita recordar y utilizar la interfaz general.

    Como ejemplo, supongamos que necesitamos escribir una función que opere
con caracteres, números enteros, y números reales; sin el polimorfismo, el
programador tendría que escribir tres veces la misma función y darle a cada una
un nombre diferente; gracias al polimorfismo, estas funciones podrían recibir el
mismo nombre.

Clases, objetos, variables y métodos en Java.

    La clase es la base de la programación orientada a objetos en Java. Es la


construcción lógica sobre la que se construye el lenguaje Java, ya que define la
forma y la naturaleza de un objeto.

    Cualquier concepto que se quiera implementar en un programa Java debe ser
encapsulado en una clase.

    Una clase define un nuevo tipo de dato. Una vez definido, este nuevo tipo se
puede utilizar para crear objetos de ese tipo. Así, un objeto es una instancia de
una clase. Las palabras "objeto" e "instancia" se suelen usar indistintamente.

    Cuando se define una clase en Java, hay que especificar los datos que contiene
la clase y el código que opera sobre ellos. Aunque puede haber clases sencillas
que sólo contengan código o datos, la mayoría de las clases contiene ambas
cosas.

    En Java, una clase se declara utilizando la palabra clave class.


    En un programa Java, todos los caracteres después de la secuencia "//" hasta el
final de línea se consideran comentarios, al igual que los que se encuentran entre
la secuencia "/*" y "*/".

    La forma general de la definición de una clase en Java es: 


 
class nombre_de_clase {
    tipo variable_de_instancia_1;
    ...
    tipo variable_de_instancia_n;
    tipo nombre_de_método_1(lista_de_parámetros) {
        // cuerpo del método 1
    }
    ...
    tipo nombre_de_método_n(lista_de_parámetros) {
        // cuerpo del método n
    }
}

    Los datos o variables definidos en una clase se llaman variables de instancia.


El código está implementado en los métodos. El conjunto de las variables y
métodos definidos dentro de una clase son los miembros de la clase.

    Normalmente, las variables de instancia de una clase son modificadas por los
métodos definidos en esa clase, por lo que los métodos son los que determinan
cómo se pueden utilizar los datos de una clase.

    Cuando se crea un objeto de una determinada clase, ese objeto tiene su propia
copia de las variables de instancia; los datos de un objeto son propios y están
separados de los datos de otro objeto, aunque sean objetos de la misma clase.

Declaración y Creación de Objetos en Java.

    Una vez que se define una clase, para declarar objetos de esa clase, hay que
realizar dos pasos:

    • Declarar una variable del tipo de la clase; esta variable no es el objeto, sino
una referencia al mismo. 

    • Obtener una copia física y real del objeto y asignarla a esa variable; esto se
realiza con el operador de Java new. El operador new asigna dinámicamente, es
decir, en tiempo de ejecución, memoria para un objeto y devuelve una referencia
al mismo. Hasta que no se crea el objeto con el operador new, éste no existe
físicamente. 
 

    El uso del operador new es:


    variable = new nombre_de_clase();

    El nombre de la clase seguido por los paréntesis especifica el constructor de la


clase. El constructor de una clase define qué acciones se deben ejecutar cuando
se crea un objeto de esa clase; un uso de los constructores es, por ejemplo,
inicializar ciertas variables de instancia cuando se crea el objeto. Los
constructores también pueden recibir parámetros de entrada; al igual que los
métodos, también pueden ser sobrecargados.

    Con los tipos simples, como los caracteres o los enteros, no es necesario
utilizar el operador new, porque los tipos simples se implementan como variables
normales; esto es así por cuestiones de eficiencia en la implementación de Java.

    Merece la pena resaltar de nuevo la diferencia entre clase y objeto: la clase es
una construcción lógica, mientras que un objeto tiene realidad física, es decir,
ocupa espacio en memoria.

Destrucción de objetos en Java.

    El operador new se utiliza para reservar memoria dinámicamente para la


creación de los objetos.

    Sin embargo, la destrucción de los objetos, y la consiguiente liberación de su


memoria utilizada, se realiza en Java de manera automática. A este mecanismo se
le denomina recogida de basura (garbage collection), su funcionamiento es el
siguiente: cuando no hay ninguna referencia a un objeto determinado, se asume
que ese objeto no se va a utilizar más, y la memoria ocupada por el objeto se
libera, este proceso es ejecutado por un thread de baja prioridad.

    No hay necesidad, por tanto, en Java, de destruir explícitamente los objetos,
como sucede en C++.
Métodos.

    La forma general de un método en Java es: 


 
    tipo nombre_de_método(lista_de_parámetros) {
        // cuerpo del método
    }

    El tipo especifica el tipo de dato devuelto por el método. Puede ser cualquier
tipo válido, incluidos los tipos de clase; si el método no devuelve ningún valor,
entonces el tipo debe ser void. El nombre del método lo indica
nombre_de_método y lista_de_parámetros es la lista de parámetros
que recibe el método; los parámetros son variables que reciben el valor de los
argumentos que se pasan al método. Un método puede no tener parámetros, en
este caso la lista de parámetros está vacía.

    En cuanto al paso de parámetros, en Java se realiza de la siguiente manera:


cuando se pasa un tipo simple a un método, se hace por valor, esto es, se pasa una
copia del parámetro; sin embargo, si se pasa como parámetro un objeto, entonces
se pasa por referencia.

    Si el método devuelve algún valor distinto de void, entonces lo devuelve


utilizando la sentencia return, de la siguiente forma:

    return valor;

    Algunas veces un método necesita hacer referencia al objeto que lo invocó.
Para poder hacer esto, Java define la palabra reservada this, que puede ser
utilizada dentro de cualquier método para referirse al objeto actual. this también
se utiliza para resolver colisiones en el espacio de nombres.

    Otro concepto importante es la sobrecarga de un método, consiste en definir


dos o más métodos dentro de la misma clase que tengan el mismo nombre, pero
con sus listas de parámetros distintas. Esto permite implementar el polimorfismo
(una interfaz, varios métodos).

    Cuando se invoca un método sobrecargado, Java utiliza el tipo y/o el número
de argumentos como guía para determinar la versión del método sobrecargado
que realmente debe llamar. En algunos casos las conversiones de tipo
automáticas de Java pueden jugar un papel importante en la resolución de la
sobrecarga.
Control de acceso.

    La encapsulación proporciona otra importante característica: el control de


acceso. Éste consiste en poder controlar qué partes de un programa pueden
acceder a los miembros de una clase. Si se permite el acceso a los datos de una
clase solamente a través de un conjunto de métodos bien definidos, se puede
prevenir la incorrecta utilización de esos datos.

    Una clase bien implementada debe ser como una "caja negra" que puede ser
utilizada pero no deja ver los detalles internos de su implementación.

    El tipo de acceso a un miembro de una clase se define con el especificador de


acceso que modifica su declaración. Los especificadores de acceso en Java
son public público), private (privado) y protected(protegido).

    Cuando un miembro de una clase tiene el especificador public, entonces ese


miembro puede ser accedido por cualquier parte del programa, incluso si se
accede desde otra clase.

    Cuando un miembro tiene el especificador private, entonces sólo puede ser


accedido por otros miembros de su clase.

    Cuando no se utiliza ningún especificador de acceso, entonces, por defecto, los
miembros de una clase son públicos dentro de su propio paquete, pero no pueden
ser accedidos desde fuera de su paquete.

    El especificador protected permite que el miembro de la clase afectado sea


accesible por las subclases directas de su clase.

Herencia en Java.

    La herencia permite las clasificaciones jerárquicas. En Java, para heredar una
clase, se utiliza la palabra reservada extends.

    Por ejemplo, si la clase B hereda la clase A (B es subclase de A, A es


superclase de B), la declaración de la clase B sería así: 
 
    class B extends A {
        // variables de instancia
        // métodos
    }
    Así, la clase B hereda todas las variables de instancia y métodos de la clase A,
y además define sus propias variables de instancia y métodos. Pero hay una
excepción: una subclase no puede acceder a aquellos miembros de la superclase
que han sido declarados como private.

    Expliquemos ahora el concepto de sobrescritura de métodos:

    En una jerarquía de clases, cuando un método de una subclase tiene el mismo
nombre y tipo que un método de su superclase, entonces se dice que el método de
la subclase sobrescribe al método de la superclase.

    Y cuando se llama a un método sobrescrito dentro de una subclase, siempre se


refiere a la versión del método definida en la subclase. La versión del método
definida por la superclase está oculta.

    Y la llamada a una función sobrescrita se resuelve en tiempo de ejecución, en


lugar de durante la compilación; esto se denomina selección de método dinámica.
La selección de método dinámica es la forma que tiene Java de implementar el
polimorfismo durante la ejecución.

    Así, combinando la herencia con la sobrescritura de métodos, una superclase


puede definir la forma general de los métodos que serán utilizados por todas sus
subclases. Por otra parte, este polimorfismo dinámico es uno de los mecanismos
más poderosos que ofrece el diseño orientado a objetos para soportar la
reutilización del código y la robustez. 
 

GESTIÓN DE EXCEPCIONES EN JAVA.


    Una excepción es una condición anormal que surge en una secuencia de código
durante la ejecución de un programa. Es decir, es un "error de ejecución".

    En los lenguajes de programación que no tienen gestión de excepciones, hay


que controlar los posibles errores de ejecución del programa manualmente,
usando códigos de error. Sin embargo, Java posee gestión de excepciones, y lleva
el problema de la gestión del error en tiempo de ejecución al mundo orientado a
objetos.

    En Java, cuando surge una condición excepcional, se crea un objeto que
representa la excepción y se envía al método que provocó esta excepción. Este
método puede elegir gestionar la excepción él mismo o pasarla. Pero en algún
punto, la excepción es capturada y procesada.

    Las excepciones pueden ser generadas por el intérprete de Java o pueden ser
generadas por el propio código. Las excepciones generadas por Java están
relacionadas con errores que violan las reglas del lenguaje Java o las restricciones
del entorno de ejecución de Java. Las excepciones generadas manualmente se
suelen utilizar para informar de algún error al método llamante.

    La gestión de excepciones en Java se realiza mediante cinco palabras


clave: try, catch, throw, throws y finally.

    El funcionamiento básico es el siguiente: las sentencias del programa que se


quieren controlar se incluyen en un bloque try; si se produce una excepción
dentro de un bloque try, entonces esta excepción es lanzada. El programa puede
capturar esta excepción, utilizando la sentencia catch, y tratarla como desee. Si se
quiere generar una excepción manualmente, se utiliza la palabra clave throw.
Cualquier excepción que se lanza fuera de un método debe ser especificada como
tal utilizando la sentencia throws. Cualquier código que se quiera ejecutar
obligatoriamente antes de que termine un método, debe introducirse en un
bloque finally.

    Ésta es la forma general de un bloque de gestión de excepciones en Java: 


     try {
        // bloque de código
    }
    catch (TipoExcepción1 exOb) {
        // gestor de excepciones del tipo TipoExcepción1
    }
    catch (TipoExcepción exOb) {
        // gestor de excepciones del tipo TipoExcepción2
    }
    //...
    finally {
        // bloque de código que se ejecutará antes de que termine el
bloque try,
        // aunque se produzca una excepción
    }

    Cuando el intérprete de Java lanza una excepción, ésta debe ser capturada
porque de lo contrario el programa terminará su ejecución bruscamente. Hay
varios tipos de excepciones que son lanzadas automáticamente, como por
ejemplo, las excepciones de división por cero, de índice de matriz fuera del
rango de la misma, conversión de tipo inválida, etc. 

También podría gustarte