sábado, 22 de marzo de 2014

Programacion Orientada a Objetos UNIDAD III





3.1 DEFINICION DE UNA CLASE.
En programación orientada a objetos, una clase es una construcción que se utiliza como un modelo (o plantilla) para crear objetos de ese tipo, el modelo describe el estado y contiene el comportamiento que todos los objetos creados a partir de esa clase tendrán. Una clase por lo general representa un sustantivo, como una persona, lugar o cosa, es el modelo de un concepto dentro de un programa de computadora y encapsula el comportamiento a través de secciones de código reutilizables llamadas métodos.

La sintaxis típica de una clase es:


3.2 DECLARACION DE CLASES.

Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La implementación de una clase comprende dos componentes: la declaración y el cuerpo de la clase.
DeclaraciónDeLaClase {
    CuerpoDeLaClase
}

Como mínimo, la declaración de una clase debe contener la palabra clave class y el nombre de la clase que está definiendo. Así la declaración más sencilla de una clase se parecería a esto.
class NombredeClase {
    . . .
}
Por ejemplo, esta clase declara una nueva clase llamada NumeroImaginario.
class NumeroImaginario {
    . . .
}
Los nombres de las clases deben ser un identificador legal de Java y, por convención, deben empezar por una letra mayúscula. Muchas veces, todo lo que se necesitará será una declaración mínima. Sin embargo, la declaración de una clase puede decir más cosas sobre la clase. Más especificamente, dentro de la declaración de la clase se puede.
  • declarar cual es la superclase de la clase.
  • listar los interfaces implementados por la clase
  • declarar si la clase es pública, abstracta o final

3.3 MIEMBROS DE UNA CLASE.

Las clases y tienen miembros que representan sus datos y comportamiento. Los miembros de una clase incluyen todos los miembros declarados en la clase, junto con todos los miembros declarados en todas las clases de su jerarquía de herencia.

·              - CAMPO: Los campos son variables declaradas en el ámbito de clase. Un campo puede ser un tipo numérico integrado o una instancia de otra clase. Por ejemplo, una clase de calendario puede tener un campo con la fecha actual.
·      - CONSTANTES: Las constantes son campos o propiedades cuyo valor se establece en tiempo de compilación y no se puede cambiar.
·           - PROPIEDADES: Las propiedades son métodos de una clase a los que se obtiene acceso como si fueran campos de esa clase. Una propiedad puede proporcionar protección a un campo de clase con el fin de evitar que se cambie sin el conocimiento del objeto.
·         - METODOS: Los métodos definen las acciones que una clase puede realizar. Los métodos pueden aceptar parámetros que proporcionan datos de entrada y devolver datos de salida a través de parámetros. Los métodos también pueden devolver un valor directamente, sin usar ningún parámetro.
·       - EVENTOS: Los eventos proporcionan a otros objetos notificaciones sobre lo que ocurre, como clics en botones o la realización correcta de un método. Los eventos se definen y desencadenan mediante delegados.
·         - OPERADORES: Los operadores sobrecargados se consideran miembros de clase. Si se sobrecarga un operador, se define como método estático público en una clase. Los operadores predefinidos (+*<, etc.) no se consideran miembros.
·        - INDIZADORES: Los indizadores permiten indizar un objeto de manera similar a como se hace con las matrices.
·            - CONSTRUCTORES: Los constructores son métodos a los que se llama cuando el objeto se crea por primera vez. Se usan a menudo para inicializar los datos de un objeto.
·           - DESTRUCTORES: En C#, los destructores se usan en raras ocasiones. Son métodos a los que llama el motor de ejecución del runtime cuando el objeto está a punto de quitarse de la memoria. Generalmente se utilizan para asegurarse de que los recursos que se deben liberar se controlan apropiadamente.
·        - TIPOS ANIDADOS: Los tipos anidados son tipos declarados dentro de otro tipo. Los tipos anidados se usan a menudo para describir objetos utilizados únicamente por los tipos que los contienen.

3.4 AMBITO REFERENTE A UNA CLASE.

El ámbito es el contexto que tiene un nombre dentro de un programa, determina en qué partes del programa una entidad puede ser usada.
Esto sirve para que se pueda volver a definir una variable con un mismo nombre en diferentes partes del programa sin que hayan conflictos entre ellos.
Si una variable es declarada dentro de un bloque (método/función/procedimiento), ésta será válida solo dentro de ese bloque y se destruirá al terminar el bloque. Adicionalmente, la variable no podrá verse ni usarse fuera del bloque (en el exterior del bloque). La variable dentro del bloque es una variable local y solo tiene alcance dentro del bloque que se creó y sus bloques hijos, pero no en bloques hermanos ni padres, una variable definida fuera de cualquier bloque es una variable global y cualquier bloque puede acceder a ella y modificarla.
En el caso de programación orientada a objetos (POO), una variable global dentro de una clase es llamada variable de instancia, y cada objeto creado con esa clase tiene una. Adicionalmente existen variables globales que son comunes a un todos los objetos creados con una clase y son llamadas variables de clase.
Hay dos tipos de alcances, el estático que también es llamado lexicográfico, donde el alcance se determina en tiempo de compilación, mientras que las variables de alcance dinámico se verificara en el hilo de ejecución.


3.5 ESPECIFICADORES DE ACCESO.

En una definición de clase, un especificador de acceso se utiliza para controlar la visibilidad de los miembros de una clase fuera del ámbito de la clase.
Los miembros de una clase pueden ser públicos, privados o protegidos. Las palabras reservadas publicprivate y protected se utilizan para controlar el modo de acceso a la clase.
Dentro de una declaración de clase, cada una de estas palabras se puede utilizar para preceder a una o más declaraciones de los miembros de una clase:
Acceso protegido. Los miembros protegidos significan que sólo se puede acceder a ellos por funciones miembro dentro de la misma clase y por funciones miembro de clases derivadas de esta clase.
Acceso público. Los miembros públicos son accesibles por cualquier parte del programa.
Acceso privado. Los miembros privados sólo pueden ser utilizados por las funciones miembro de la clase y las funciones amigas de la clase.

3.6 CREACION DE OBJETOS.

Una clase es una plantilla que define los datos  y los métodos del objeto. Un objeto es una instancia de una clase. Se puede crear muchas instancias de una clase .La creación de una instancia se conoce como instanciación.

Clase Circulo

Nota: una  clase puede tener muchos objetos diferentes. 

Una vez que se define una clase, el  nombre de la clase se convierte en  nuevo tipo de dato y se utiliza tanto como declarar una variable de ese tipo, como para crear objeto del mismo. La sintaxis para declarar un  objeto es:   

NombreClase nombreObjeto;

Ejemplo
Circulo miCirculo; //declara la variable mi circulo

La variable miCirculo es una instancia de la clase Circulo .La creación de un objeto  de una clase se llama creación de una instancia de la clase. Un objeto es similar a una variable que tiene un tipo de clase. La creación de variables de un tipo de dato primitivo se realiza simplemente declarándolas, esta operación  crea la variable y le asigna espacio en memoria.

1.- Creación  de la clase.

Una variable de tipo clase es una variable  referencia, que puede contener la dirección de en memoria (o referencia) de un objeto de la clase o null para una referencia no valida. La declaración de un objeto simplemente asocia el objeto con una clase,  haciendo al objeto una instancia de esa clase. La declaración  no crear el objeto. Para crear realmente miCirculo (objeto de la clase Circulo)  se necesita utilizar el operador new con el objeto de indicar a la computadora que cree un objeto miCirculo y asigne espacio de memoria para ella.

La sintaxis para crear un objeto es:

nombreObjeto  =  new NombreClase();

Ejemplo
La siguiente sentencia crea un objeto, miCirculo, y le asigna memoria:
miCirculo = new Circulo();

Declaración e Instanciación

Se puede combinar la declaración  y la instanciación en una sola sentencia con la siguiente sintaxis:
NombreClase nombreObjeto = new NombreClase();

Ejemplo
Creación e instanciación de miCirculo en una etapa:
Circulo miCirculo = new Circulo();


3.7 PUNTERO THIS.

El this es un puntero (C++) o referencia (Java) al objeto.
El programador no lo crea ni lo inicializa. Cuando se llama a una función miembro, el código oculto genera el this con la dirección del objeto y lo pasa como parámetro, en Java, sólo se puede usar this dentro del cuerpo de la definición de un método de instancia, nunca en el cuerpo de un método de clase.




USO DEL THIS.
public class Circulo {
  static int numCirculos = 0;
  public static final double PI=3.14159265358979323846;
  public double x, y, r;
  public Circulo(double x, double y, double r) {
    this.x = x;
    this.y = y;
    this.r = r;
    numCirculos++;
  }
  public Circulo(double r) { this(0.0, 0.0, r); }
  public Circulo(Circulo c) { this(c.x, c.y, c.r); }
  public Circulo() { this(0.0, 0.0, 1.0); }
  public double Perimetro() {return 2.0 * PI * r;}
  public double Area() {return PI * r * r;}
}

3.8 CONSTRUCTORES Y DESTRUCTORES.

CONSTRUCTOR
Un constructor es un método especial de una clase que se llama automáticamente siempre que se declara un objeto de esa clase; su función es inicializar el objeto y sirve para asegurarnos que los objetos siempre contengan valores válidos.

Cuando se crea un objeto en Java se realizan las siguientes operaciones de forma automática:

1.  Se asigna memoria para el objeto.
2. Se inicializan los atributos de ese objeto con los valores predeterminados por el sistema.
3. Se llama al constructor de la clase que puede ser uno entre varios.

El constructor de una clase tiene las siguientes características:

·         * Tiene el mismo nombre que la clase a la que pertenece.
·     * En una clase puede haber varios constructores con el mismo nombre y distinto número de argumentos (se puede sobrecargar)
·         * No se hereda.
·         * No puede devolver ningún valor (incluyendo void).
·     * Debe declararse público (salvo casos excepcionales) para que pueda ser invocado desde cualquier parte donde se desee crear un objeto de su clase.

INVOCAR UN METODO CONSTRUCTOR
Un constructor se invoca cuando se crea un objeto de la clase mediante el operador new; si es necesario invocarlo en otras situaciones, la llamada a un constructor solo puede realizarse desde dentro de otro constructor de su misma clase y debe ser siempre la primera instrucción.
Si tenemos varios métodos constructores en la clase, podemos llamar a un constructor desde otro utilizando this.

Por ejemplo, si en el constructor con parámetros de la clase Fecha fuese necesario llamar al constructor sin parámetros de la misma clase escribimos:

public Fecha(int d, int m, int a) {
         this();  // llamada al constructor sin parámetros
         dia = d;
         ……….
}

DESTRUCTOR

Un destructor es un método cuyo objetivo es el de eliminar toda la memoria que ocupo un objeto, en Java no es necesaria la definición de destructores, pues el mismo lenguaje se encarga de la eliminación y liberación de la memoria ocupada por un objeto, esto se realiza cada vez que un objeto pierde todas sus referencias.

Existen dos tipos de destructores, según se declaran, pueden ser públicos o privados.

·         * PUBLICOS: se llama desde cualquier parte del programa para destruir el objeto.
·         * PRIVADO: no se permite la destrucción del objeto por parte del usuario.

3.9 CLASES PREDEFINIDAS.

Uno de los puntos fuertes de Java es la gran cantidad de clases predefinidas que posee, dichas clases pueden ser utilizadas por los programadores sin necesidad de reinventar la rueda.


-         CLASES CONTENEDORAS O WRAPPERS

En Java existen una serie de clases predefinidas equivalentes a los tipos primitivos denominadas wrappers, clases contenedoras o envoltorios, el identificador de cada una de estas clases es el mismo que el del tipo primitivo correspondiente pero con la letra inicial en mayúsculas (salvo int - Integer y char - Character). Cada una de estas clases declaran un conjunto de métodos de gran utilidad; el uso de estas clases puede ser especialmente interesante para realizar determinadas operaciones mediante los métodos que implementan.

-       OBJETOS DE LA CLASE CHARACTER

La clase predefinida Character permite trabajar con instancias a las que se les puede asociar un único carácter Unicode. Esta clase incluye un conjunto de métodos que facilitan la manipulación de datos de tipo primitivo char.

El siguiente código muestra como crear referencias e instancias de la clase Character:

Character a1;
a1 = new Character('A');
Character a2 = new Character('B');
-         
      OBJETOS DE LA CLASE STRING

String es una clase predefinida y especial de Java definida en la librería o paquete java.lang y orientada a manejar cadenas constantes de caracteres. Una instancia de la clase String es inmutable, es decir, una vez que se ha creado y se le ha asignado un valor, éste no puede modificarse (añadiendo, eliminando o cambiando caracteres). El siguiente código muestra diferentes ejemplos de creación de referencias e instancias de la clase String:

String cortesia = new String("Buenos dias");
// O bien, al ser una clase muy habitual en la forma abreviada:
String saludo = "Hola";
// O tambien:
String despedida;
despedida = "Adios";

3.10 DEFINICION, CREACION Y REUTILIZACION DE PAQUETES/LIBRERIAS.

Los paquetes Java agrupan las clases en librerías (bibliotecas). Los paquetes Java se utilizan de forma similar a como se utilizan las librerías en C++, sólo que en Java se agrupan clases y/o interfaces.
En los paquetes las clases son únicas, comparadas con las de otros paquetes, y permiten controlar el acceso; esto es, los paquetes proporcionan una forma de ocultar clases, evitando que otros programas o paquetes accedan a clases que son de uso exclusivo de una aplicación determinada.

Los paquetes se declaran utilizando la palabra reservada package seguida del nombre del paquete. Esta sentencia debe estar al comienzo del fichero fuente, concretamente debe ser la primera sentencia ejecutable del código Java, excluyendo, los comentarios y espacios en blanco. Por ejemplo:

package figuras;
public class Circulo {
  . . .
}

En este caso, el nombre del paquete es figuras. La clase Circulo se considera como parte del paquete. La inclusión de nuevas clases en el paquete es simple, se ha de colocar la misma sentencia al comienzo de los ficheros que contengan la declaración de las clases. Cada uno de los ficheros que contengan clases pertenecientes a un mismo paquete, deben incluir la misma sentencia package, y solamente puede haber una sentencia package por fichero. La sentencia package colocada el comienzo de un fichero fuente afectará a todas las clases que se declaren en ese fichero, se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar. También se puede usar la palabra reservada import, si se van a colocar múltiples referencias a un mismo paquete.

La sentencia import se utiliza para incluir una lista de paquetes en los que buscar una clase determinada, y su sintaxis es:

import nombre_paquete.Nombre_Clase;

Esta sentencia, o grupo de ellas, deben aparecer antes de cualquier declaración de clase en el código fuente.



3.11 MANEJO DE EXCEPCIONES.

El manejo de excepciones es una técnica de programación que permite al programador controlar los errores ocasionados durante la ejecución del programa.

El manejo de excepciones ayuda al programador a remover el código para manejo de errores de la línea principal de ejecución, además se puede elegir entre manejar todas las excepciones, las de cierto tipo o de las de grupos relacionados, esto hace que la probabilidad de pasar por alto los errores se reduzca y a la vez hace los programas más robustos. Pero es importante utilizar un lenguaje de programación que soporte este manejo, de lo contrario el procesamiento de errores no estará incluido y hará el programa más vulnerable. Este manejo está diseñado para procesar errores que ocurren cuando se ejecuta una instrucción, algunos ejemplos son: desbordamiento aritmético, división entre cero, parámetros inválidos de método y asignación fallida en la memoria. Sin embargo, no está diseñado para procesar problemas con eventos independientes al programa como son pulsar una tecla o clic al mouse.


Las excepciones se dividen en verificadas y no verificadas. Es importante esta división porque el compilador implementa requerimientos de atrapar o declarar para las verificadas lo que hará que se detecten las excepciones automáticamente y de acuerdo al lenguaje de programación utilizado se utilizará un método para corregirlas. Sin embargo para las no verificadas se producirá un error indicando que deben atraparse y declararse. Por eso el programador debe pensar en los problemas que pueden ocurrir cuando se llama a un método y definir excepciones para verificarse cuando sean importantes.