Conceptos Básicos de La Programación Orientada a Objetos

download Conceptos Básicos de La Programación Orientada a Objetos

of 25

description

Programacion

Transcript of Conceptos Básicos de La Programación Orientada a Objetos

Conceptos bsicos de la Programacin Orientada a Objetos.

Programacin Orientada a Objetos.

La programacin orientada a Objetos bsicamente define una serie de conceptos y tcnicas de programacin para representar acciones o cosas de la vida real basada en objetos, a diferencia de otras formas de programacin como por ejemplo la estructurada, con la POO trabajamos de manera distinta vinculando diferentes conceptos tales como clases, objetos, mtodos, propiedades, estados, herencia, encapsulacin entre otros, generando cada vez interrelaciones en nuestro desarrollo en pro del funcionamiento del sistema principal, definiendo el programa como un conjunto de estos objetos relacionados entre s.

Clases.

Las clases son uno de los principales componentes de un lenguaje de programacin, pues en ellas ocurren todos los procesos lgicos requeridos para un sistema, en si podemos definirlas como estructuras que representan objetos del mundo real, tomando como objetos a personas, lugares o cosas, en general las clases poseen propiedades, comportamientos y relaciones con otras clases del sistema.

Nombre: Contiene el Nombre de la Clase.Atributos: Representan las propiedades que caracterizan la clase.Mtodos: Representan el comportamiento u operaciones, la forma como interacta la clase con su entorno.

En java se representa as:

Hay que tener en cuenta que Java posee unos estndares de codificacin, que definen las convenciones para nombres de clases, mtodos, variables, constantes.

Para las clases se define lo siguiente:

- La primera letra debe ser mayscula.- Utilizar nomenclatura camelCase (por ej: un nombre compuesto por varias palabras: clase "FiguraGeometrica")- Los nombres deben ser sustantivos.

Con base a lo anterior, y como la idea es representar algo de la vida real, entonces podemos decir que una clase puede ser cualquier cosa, solo basta con mirar a nuestro alrededor y observar cualquier objeto, casi todas las cosas son candidatas para convertirse en clases, por ejemplo, una silla, un carro, un avin, una mesa, un perro, una persona entre otros.

Basados en este concepto veamos un ejemplo de clase donde aplicaremos las tres partes fundamentales:

Si queremos trabajar con un carro definimos:

Nombre de la clase: Carro

Atributos de la clase: Color, marca, tipo, tamao, numero de puertas....

Mtodos de la clase: encender(), arrancar(), girar(), retroceder(), frenar() .

hay que tener en cuenta que la clase carro es la representacin general de todos los carros, por eso los atributos se manejan como variables, ya que, si tomamos la marca o el color, depende del carro con el que vamos a trabajar.

Y listo, ya tenemos el concepto de nuestra clase definida, en la entrada sobre conceptos bsicos vimos la estructura bsica de una clase en java, ahora veamos cmo se representa nuestra clase Carro:

Como vemos la clase cumple con las reglas definidas anteriormente, tiene un nombre, atributos y mtodos, solo tenemos que definir lo que queremos que nuestros mtodos realicen.

Objeto.

Los objetos representan una entidad concreta o abstracta del mundo real, en programacin bsicamente se le conoce como la instancia de una clase en si es lo que da el sentido a estas.

Al igual que las clases se componen de tres partes fundamentales:

Estado: Representa los atributos o caractersticas con valores concretos del objeto.

Comportamiento: Se define por los mtodos u operaciones que se pueden realizar con l.

Identidad: Es la propiedad nica que representa al objeto y lo diferencia del resto.

En la imagen, los moldes representan las clases, mientras que las galletas obtenidas de estos moldes representan los objetos instancias de estas clases, por ejemplo, atributos del objeto galleta podra ser sabor, color, tamao etc.

En java se representa creando una instancia de la clase por medio de la palabra new al hacer eso creamos el objeto de la clase y podemos hacer uso de los mtodos o atributos de esta (dependiendo de la visibilidad de los mismos) por medio de un punto (.) as:

Herencia.

La herencia en java representa lo que conocemos de herencia en el mundo real, bsicamente mediante esta obtenemos las caractersticas o rasgos comunes de nuestros padres o abuelos, en java es el mismo enfoque permitiendo la creacin de nuevas clases basadas en clases ya existentes, con las cuales podemos obtener las caractersticas de las clases padres, heredando campos, atributos, mtodos o funcionalidades.

Bsicamente mediante este concepto podemos obtener las caractersticas de una clase padre o de una jerarqua mayor dependiendo de nuestro rbol de herencia, en java definimos esta jerarqua mediante la palabra extends seguido del nombre de la clase a la que vamos a heredar, tambin se debe tener claro que solo se puede heredar de una sola clase pues el lenguaje no permite la Herencia mltiple (En Java por defecto todas las clases heredan de la clase Object, es decir, esta es la clase Padre de todas las clases en Java). Encapsulamiento.

Este concepto es uno de los ms importantes en trminos de seguridad dentro de nuestra aplicacin, la encapsulacin es la forma de proteger nuestros datos dentro del sistema, estableciendo bsicamente los permisos o niveles de visibilidad o acceso de nuestros datos.

Se representa por 3 niveles:

Pblico: Se puede acceder a todos los atributos o mtodos de la clase.

Protegido: Se puede acceder a los atributos o mtodos solo en la misma jerarqua de herencia.

Privado: Solo se puede acceder a los atributos o mtodos de la clase en la que se encuentran.

con la Encapsulacin mantenemos nuestros datos seguros, ya que podemos evitar que por ejemplo se hagan modificaciones al estado o comportamiento de un objeto desde una clase externa, una buena prctica es trabajar con mtodos setter y getter que permiten manipular nuestros datos de forma segura.

en Java lo representamos as:

Clases Abstractas.

La abstraccin permite resaltar la parte ms representativa de algo, ignorando detalles para centrarse en lo principal.

La imagen es muy fcil de identificar, con base a ella podemos crear una clase persona, o la clase hombre, humano entre otras, pero obviamente vemos que la imagen no tiene elementos como ojos, nariz, boca, rostro en general, ni dedos, pies, manos o cuello, pero entonces porque decimos que es una persona? Precisamente aqu estamos aplicando el concepto de abstraccin, ya que nos fijamos en lo ms representativo de algo, en este caso vemos que se tiene una cabeza, tronco, brazos y pies, con esto es suficiente para saber que es una persona sin fijarnos en los detalles mencionados anteriormente.

La Abstraccin en java solo tiene lgica mediante la Herencia, ya que una clase abstracta posee al menos un mtodo abstracto el cual no tiene implementacin, el comportamiento de estos mtodos lo definen las clases concretas que lo hereden.

Podemos usarlos cuando existan varias clases con caractersticas o acciones comunes, pero con diferentes comportamientos, mediante el uso de la herencia y componentes abstractos hacemos ms ptima y organizada nuestra aplicacin. (hay que tener en cuenta que, a diferencia de las clases concretas, las clases abstractas no se pueden instanciar).

Bsicamente una clase Abstracta es similar a una clase normal, la estructura es prcticamente igual, ya que poseen nombre, atributos y mtodos, pero para que una clase sea abstracta la condicin es que al menos uno de sus mtodos sea abstracto (se le agrega la palabra reservada abstract y no se especifica el cuerpo del mtodo). Su uso depende de la aplicacin del concepto de Herencia y adicionaremos a la estructura bsica de clase la palabra reservada abstract.

Veamos cmo se implementa en Java.

Caractersticas de una Clase Abstracta.

Esto es lo que debemos conocer sobre de Clases Abstractas.

Una clase Abstracta No puede ser instanciada (no se pueden crear objetos directamente - new), solo puede ser heredada.

Si al menos un mtodo de la clase es abstract, esto obliga a que la clase completa sea definida abstract, sin embargo, la clase puede tener el resto de mtodos no abstractos.

Los mtodos abstract no llevan cuerpo (no llevan los caracteres {}).

La primera subclase concreta que herede de una clase abstract debe implementar todos los mtodos de la superclase.

Cundo Utilizarlas?

Al trabajar clases y mtodos abstractos, no solo mantenemos nuestra aplicacin ms organizada y fcil de entender, sino que tambin al no poder instanciar una clase abstracta nos aseguramos de que las propiedades especficas de esta, solo estn disponibles para sus clases hijas....

Con las Clases Abstractas lo que hacemos es definir un proceso general que luego ser implementado por las clases concretas que hereden dichas funcionalidades. Qu?, es decir, si tengo una clase que hereda de otra Abstracta, estoy obligado a poner en el cdigo, todos los mtodos abstractos de la clase padre, pero esta vez sern mtodos concretos y su funcionalidad o cuerpo ser definido dependiendo de para que la necesite, de esa manera si tengo otra clase que tambin hereda del mismo padre, implementar el mismo mtodo, pero con un comportamiento distinto. Veamos un Ejemplo.

En el diagrama vemos una clase Abstracta Instrumento, la cual posee una propiedad tipo y un mtodo abstracto tocar(), vemos tambin las clases hijas Guitarra, Saxofn y Violn que para este ejemplo solo utilizaremos (mediante la herencia) las propiedades de la clase Padre.

Todos los instrumentos musicales se pueden tocar, por ello creamos este mtodo abstracto, ya que es un proceso comn en todos los instrumentos sin importar el detalle de cmo se tocan, pues sabemos que una guitarra no se toca de la misma manera que el saxofn, as al heredar de la clase Instrumento, todas sus clases hijas estn obligadas a implementar este mtodo y darle la funcionalidad que le corresponda.

Veamos esto en Java.

Como vemos cada una de las clases concretas implementan el mtodo tocar() y le dan la funcionalidad dependiendo de cmo se toque el instrumento, tambin en cada constructor de las clases definimos el tipo, pero si nos fijamos bien en las clases concretas no tenemos la variable tipo declarada, pues estamos usando la variable heredada de la clase Instrumento.

Hay que tener en cuenta que cuando trabajamos con clases Abstractas, estas solo pueden ser heredadas mas no instanciadas, esto quiere decir que no podemos crear objetos directamente de estas clases.

Como vemos en la clase Principal tenemos la lgica para ejecutar nuestra aplicacin y usamos el concepto de Polimorfismo para crear los objetos de tipo Instrumento por medio de sus clases Hijas, pero en ningn momento creamos un objeto como instancia directa de la clase abstracta.

Interfaces.

Las interfaces son el mecanismo que utiliza Java para simular la herencia mltiple, como mencionamos en Java solo se puede extender de una sola clase, mediante el uso de interfaces esto se puede simular ya que el lenguaje permite implementar el nmero de interfaces que necesitemos, bsicamente son clases completamente abstractas, es comn relacionarlas con un contrato en el que se define que se debe hacer, as cada clase concreta que implemente una interfaz est obligada a implementar todos los mtodos que la compongan.

Las interfaces definen lo que la clase que la implemente deber hacer, mas no la forma como lo har.

Al decir que las interfaces son clases completamente abstractas significa que todos sus mtodos lo son y por ende no poseen implementacin, no requieren el uso de la palabra reservada abstract, ya que al ser completamente abstracta todo dentro de ella lo es, al igual que las clases abstractas la implementacin de los mtodos depende de las clases concretas que las usen.

Se debe tener en cuenta que toda variable definida en una interfaz automticamente se convierte en una constante, adems tampoco se puede instanciar una interfaz.

En java se representan con la palabra interface y se usan con la palabra implements as:

Caractersticas de las Interfaces.

Todos los mtodos de una interfaz son implcitamente public abstract, no es necesario especificarlo en la declaracin del mismo. Todas las variables y atributos de una interfaz son implcitamente constantes (public static final), no es necesario especificarlo en la declaracin del misma. Los mtodos de una interfaz no pueden ser: static, final, strictfp ni native. Una interfaz puede heredar (extends) de una o ms interfaces. Una interfaz no puede heredar de otro elemento que no sea una interfaz. Una interfaz no puede implementar (implements) otra interfaz. Una interfaz debe ser declarada con la palabra clave interface. Los tipos de las interfaces pueden ser utilizados polimrficamente. Una interfaz puede ser public o package (valor por defecto). Los mtodos toman como mbito el que contiene la interfaz.

Cundo Utilizarlas?

Su uso est muy ligado al concepto de herencia y cumple el mismo principio que aplicamos al usar clases abstractas, lo que buscamos es establecer un mecanismo donde podamos compartir caractersticas comunes entre clases diferentes, adems al igual que con clases abstractas nos aseguramos que los mtodos y atributos solo estn disponibles para las clases que las implementen.

Polimorfismo.

Este tal vez sea uno de los conceptos de la programacin orientada a objetos ms usados pero muchas veces sin saber que se aplica ya que el concepto inicialmente puede ser un poco confuso, bsicamente mediante el polimorfismo programamos de forma general en lugar de hacerlo de forma especfica, se usa cuando se trabajen con la herencia y objetos de caractersticas comunes los cuales comparten la misma superClase y rbol jerrquico, al trabajar con este concepto optimizamos y simplificamos en gran medida nuestro trabajo.

Bsicamente podemos definirlo como la capacidad que tienen los objetos de comportarse de mltiples formas sin olvidar que para esto se requiere de la herencia, en si consiste en hacer referencia a objetos de una clase que puedan tomar comportamientos de objetos descendientes de esta.

Con el polimorfismo usamos la generalizacin olvidando los detalles concretos de los objetos para centrarnos en un punto en comn mediante una clase padre.

Tomando como ejemplo la imagen anterior, podemos decir que un objeto de la clase FiguraGeometrica puede usarse para referirse a cualquier objeto de cualquier subClase de FiguraGeometrica, en otras palabras, una figura geomtrica puede ser un cuadro, un tringulo, un cuadrado o cualquier figura que en trminos generales sea geomtrica.

Veamos este proceso como se representa en Java.

Como vemos en el ejemplo la clase FiguraGeometrica puede convertirse en cualquier figura que se encuentra en su jerarqua de Herencia pudiendo utilizar las propiedades que compartan entre ellas, hay que tener presente que solo se permite el polimorfismo de clases padre a clases hija mas no al contrario.

Qu es un Constructor?

El objetivo de un constructor es el de inicializar un objeto cuando ste es creado. Asignaremos los valores iniciales, as como los procesos que sta clase deba realizar.

Se utiliza para crear tablas de mtodos virtuales y poder as desarrollar el polimorfismo, una de las herramientas de la programacin orientada a objetos (POO). Al utilizar un constructor, el compilador determina cul de los objetos va a responder al mensaje (virtual) que hemos creado. Tiene un tipo de acceso, un nombre y un parntesis.

En java es un mtodo especial dentro de una clase, que se llama automticamente cada vez que se crea un objeto de esa clase.Posee el mismo nombre de la clase a la cual pertenece y no puede regresar ningn valor (ni siquiera se puede especificar la palabra reservada void). Por ejemplo, si aadiramos a la clase Suma un constructor, tendramos que llamarlo tambin Suma. Cuando en una clase no se escribe propiamente un constructor, java asume uno por defecto (que es el Constructor vaco, es decir sin parmetros).

Constructor por defecto:

Un constructor por defecto es un constructor sin parmetros que no hace nada. Sin embargo, ser invocado cada vez que se construya un objeto sin especificar ningn argumento, en cuyo caso el objeto ser iniciado con los valores predeterminados por el sistema (los atributos numricos a ceros, los alfanumricos a nulos, y las referencias a objetos a null).

Constructor con Parmetros:

Un constructor con Parmetros siempre debe especificar algn argumento, en cuyo caso el objeto ser iniciado con los valores indicados por el usuario, y realizar tambin las acciones programadas al ejecutarse.

Destructor:

Un destructor en algunos lenguajes de programacin orientados a objetos es un mtodo de una clase que se llama justo antes de una instancia de esa clase y se elimina de la memoria. No todos los lenguajes de programacin orientados a objetos suelen tener un destructor.

La contrapartida de un destructor es un constructor que se ejecuta cuando se crea el objeto, se instancia y se lo inicializa.

Excepciones.

Una excepcin es un objeto que se genera automticamente cuando se produce un acontecimiento circunstancial que impide el normal funcionamiento del programa:

Dividir por cero.

No encontrar un determinado fichero.

- Utilizar un puntero nulo en lugar de una referencia a un objeto.

El objeto generado excepcin contiene informacin sobre el acontecimiento ocurrido y transmite esta informacin al mtodo desde el que se ha generado la excepcin.

La ocurrencia de estas situaciones excepcionales provocar la terminacin no controlada del programa o aplicacin.

Las excepciones estndar.

En Java las situaciones que pueden provocar un fallo en el programa se denominan excepciones.

Las excepcionespueden originarse de dos modos:

El programa hace algo ilegal (caso normal)

El siguiente cdigo de ejemplo origina una excepcin de divisin por cero:

public class PruebaExcepcion { public static void main( String[] a ) { int i=0, j=0, k; k = i/j; // Origina un error de division-by-zero } }

Si compilamos y ejecutamos esta aplicacin Java, obtendremos la siguiente salida por pantalla:

> javac PruebaExcepcion.java> java PruebaExcepcion java.lang.ArithmeticException: / by zero at PruebaExcepcion.main(melon.java:5)

Las excepciones predefinidas, como por ej. ArithmeticException, se conocen como excepciones runtime. Las excepciones en tiempo de ejecucin ocurren cuando el programador no ha tenido cuidado al escribir su cdigo.

Por ejemplo: cuando se sobrepasa la dimensin de un array, se lanza una excepcin ArrayIndexOutOfBounds.

Cuando se hace uso de una referencia a un objeto que no ha sido creado se lanza la excepcin NullPointerException.

Estas excepciones le indican al programador que tipos de fallos tiene el programa y que debe arreglarlo antes de proseguir.

Actualmente, como todas las excepciones son eventos runtime, sera mejor llamarlas excepciones irrecuperables. Esto contrasta con las excepciones que generamos explcitamente, que suelen ser mucho menos severas y en la mayora de los casos podemos recuperarnos de ellas. Por ejemplo, si un fichero no puede abrirse, preguntamos al usuario que nos indique otro fichero; o si una estructura de datos se encuentra completa, podremos sobrescribir algn elemento que ya no se necesite.

El programa explcitamente genera una excepcin.

Para generar explcitamente una excepcin se ejecutar la sentencia throw.

La sentencia throw tiene la siguiente forma:

throw ObjetoExcepction;

El objeto ObjetoException es un objeto de una clase Excepcion o que hereda (ver siguiente unidad) de la clase Exception. Para que un mtodo en Java, pueda lanzar excepciones ser necesario indicarlo expresamente.

void MetodoQueLanzaExcepcion() throws Exception1,Exception2,...

Se pueden definir excepciones propias, no hay por qu limitarse a las predefinidas. Para definir una excepcin ser necesario con extender la clase Exception (herencia) y proporcionar la funcionalidad extra que requiera el tratamiento de esa excepcin.

Ejemplos de excepciones.

Por formato

String str=" 12 "; int numero=Integer.parseInt(str);

Si se introducen caracteres no numricos, o no se quitan los espacios en blanco al principio y al final del string, se lanza una excepcin NumberFormatException.

El mensaje que aparece en la ventana nos indica:

El tipo de excepcin: NumberFormatException,

La funcin que la ha lanzado: Integer.parseInt() que se llama dentro de main (por ejemplo)

Por objeto no inicializado

Habitualmente, en un mensaje a un objeto no inicializado

public static void main(String[] args) { String str; str.length(); //... }

El compilador se queja con el siguiente mensaje variable str might not have been initilized. En otras ocasiones, se lanza una excepcin del tipo NulPointerException.

class MiCanvas....{ Grafico grafico; public void paint(...){ grafico.dibuja(); //... }//...}

Si al llamarse a la funcin paint, el objeto grafico no ha sido inicializado con el valor devuelto por new al crear un objeto de la clase Grafico o de alguna de sus clases derivadas, se lanza la excepcin NullPointerException apareciendo en la consola el siguiente texto.

Tipos de excepcin

Todos los tipos de excepcin son subclase de Throwable. Esta clase tiene dos subclases:

1. Exception: Se usa para las excepciones que debern capturar los programas de usuario.

Esta clase tiene como subclase a RuntimeException, que representa excepciones definidas automticamente por los programas (divisin por 0, ndice invlido de matriz, etc). Adems tiene otras subclases como ClassNotFoundException, InterruptedException,etc.

1. Error: Excepciones que no se suelen capturar en condiciones normales.

Suelen ser fallos catastrficos no gestionados por nuestros programas. Ejemplo: desbordamiento de la pila.

Excepciones Predefinidas

Las excepciones predefinidas y su jerarqua de clases es la que se muestra en la figura:

-Excepciones no capturadas

public class EjemploExcepcion { static void subroutine() { int d = 0; int a = 10 / d; } public static void main(String args[]) { System.out.println("Antesxc1.subroutine"); EjemploExcepcion.subroutine(); System.out.println("Despuesxc1.subroutine"); }}

Cuando la mquina virtual Java detecta la divisin por 0 construye un objeto de excepcin y lanza la excepcin. Esto detiene la ejecucin de EjemploExcepcion, ya que no hemos incluido un gestor de la excepcin.

Cualquier excepcin no tratada por el programa ser tratada por el gestor por defecto.

try y catch

public class Exc2 { public static void main(String args[]) { int d, a;

try { // controla un bloque de cdigo. d = 0; a = 42 / d; System.out.println("Estoe imprimir."); } catch (ArithmeticException e) {// captura el error de divisin System.out.println("Divisincero."); } System.out.println("Despusa sentencia catch."); }}

El objetivo de una sentencia catch bien diseada ser resolver la condicin de excepcin y continuar.

// Gestiona una excepcin y continua.import java.util.Random;public class ManejadorExcepcion { public static void main(String args[]) { int a=0, b=0, c=0; Random r = new Random(); for(int i=0; i