Módulo 1: Introducción a la Programación Orientada a Objetos

    1. Definición y Modelación de Clases y Tipos de Clases

Programacion Orientada a Objetos

La Programación Orientada a Objetos es un paradigma de programación diferente a la Programación Estructurada o a la misma Programación Procedural al que la mayoria de los programadores están acostumbrados a utilizar.

En la Programación Estructurada y la Programación Procedural lo mas importante es el procedimiento que se esta desarrollando a través de un lenguaje de programación.

En Programación Orientada a Objetos, se hace un gran énfasis a los datos, y todo gira alrededor de ellos.

Cada vez que alguien quiere hacer una aplicación, debe de pensar en los elementos (datos) que va a utilizar para programar, y la relación que existe entre estos datos, en su forma de interactuar entre si.

Cuando queremos hacer una aplicación de alumnos que estan inscritos en algunas materias con ciertos profesores, entonces debemos de pensar en los diferentes datos a manejar: Alumnos, Materias, Profesores, etc.

Pensar en estos elementos y pensar en todo lo que esta alrededor de ellos para poder tipificarlos en los elementos que definen la Programación Orientada a Objetos.

El mundo esta lleno de objetos y estos objetos tienen ciertas características que los hacen únicos y esas características se derivan de atributos que agrupadas representan a una clase que compone a los objetos definidos.

Por ejemplo: ¿Cómo se define un arbol?

Un arbol puede tener ramas, puede tener hojas, tiene raices, etc. A su vez un árbol nace, crece, muda de hojas, muere, etc.

Clases y Objetos

Una Clase es la definición de en la Programación Orientada a Objetos de todo lo referente a todos los objetos que tienen relación en comun y que se van a utilizar en una aplicación. La clase define las características y los comportamientos que tendrán todos los objetos que corresponden a la clase. Las características definen los valores que pueden ser indentificados en los objetos que pueden pertenecer a una clase y los comportamientos son las acciones que pueden ser realizadas por estos objetos.

Para poder entender mejor esto es necesario utilizar algunos ejemplos:

1. Clase Carro. Para poder definir las características y los comportamientos de la clase Carro, es necesario pensar en las características y los comportamientos que serían propios de los objetos carros, es decir todos los posibles carros. Las características pueden ser: el color, el número de asientos, el número de cilindros, etc.; por otro lado los comportamientos pueden ser: acelerar, frenar, cargar gasolina, etc.

2. Clase Computadora. Las características de una computadora pueden ser: memoria RAM, capacidad en Disco Duro, Velocidad del procesador, etc.; los comportamientos pueden ser: Prender, apagar, inhibirse, etc.

3. Clase Alumno. Las características pueden ser: nombre, sexo, edad, dirección, etc.; los comportamientos pueden ser: inscribirse, acreditar una materia, reprobar una materia, etc.

Cuando se desea escribir una aplicación se debe tener cuidado en analizar cuidadosamente el problema del que se trate para que la definición de las clases involucradas sea la más adecuada.

Una forma fácil de identificar las clases al leer un problema es identificar las frases o sustantivos que se tienen, por ejemplo alumno, materia, etc. Es importante que al leer el problema utilizemos un sustantivo que este de acuerdo a la clase a definir, por ejemplo si habla de un específico alumno, enfatizar como alumno, si se habla en plural, seguir utilizando el alumno en singular.

Despues de esto debemos eliminar de la lista de clases que tenemos, aquellas clases que no sean relevantes al problema que se trate, por ejemplo si el problema habla de alumnos y menciona algo de un libro y no haremos nada relacionado a libros, entonces el sustantivo libro será eliminado de la lista.

Identificar los atributos o caracterísitcas, es algo también sencillo, pues implica el definir los datos que los diferentes objetos de la clase deben contener, si hablamos de alumnos, es importante reconocer los datos que serán relevantes a utilizar en la aplicación a desarrollar, por ejemplo el nombre y matrícula del alumno serán importantes, pero el color de ojos o si sabe manejar un carro o no, serán datos no relevantes para nosotros.

Los comportamientos o también llamados métodos, son aquellos que identifican una acción y que pueden ser destacados al identificar los verbos en la redacción del problema.

Al decir un alumno se inscribe, o acredita una materia, se estan especificando las acciones propias de los objetos (en este caso alumnos) que pertenecerán a la clase Alumno que es la que estamos utilizando en este caso para ejemplificar.

Puede haber diferentes arboles:

                                      

Pero los atributos y las conductas que se definen para una clase Arbol, hacen que puedan tipificarse todos los objetos que pueden pertenecer a esta clase.

Algunos Tipos de Clases

Existen diferentes tipos de clases en Java, de acuerdo al uso que se le va a dar a esa clase, en este curso solo utilizaremos tres tipos de clases:

1) Clase Singular, es una clase que identifica a todos los objetos que tienen alguna relación entre si, como ejemplos: Carro, Alumno, Materia, Libro, Banco, etc.

2) Clase Aplicación, es una clase que se utilizará para poder ejecutar diferentes acciones a ser realizadas sobre clases singulares, a petición de un usuario, siendo estas clases ejecutables como cualquier aplicación de la computadora.

3) Clase Applet, clase que es parecida a una aplicación, pero la manera en la que se puede utilizar es a través de un navegador y puede ser ejecutada en cualquier lugar a través de Internet.

Sintaxis de una Clase Singular

Una clase Singular es declarada en Java haciendo uso de la declaración:

modificador-de-clase  class   NombreClase {

        definición de variables (caracteristicas)

        definición de métodos constructores (como crear el objeto inicialmente)

        definición de métodos de la clase (conductas)

}

Existen tres tipos de modificadores de clase: 1) public, para que la clase pueda ser utilizada por cualquier clase, 2) abstract, significa que la clase no fue implementada completamente y entonces alguna clase que se derive de esta debe terminar la definición, y 3) final, esta clase tiene todas su definición completa, pero no puede tener alguna clase que herede de ella.

El modificador-de-clase es utilizado para definir el permiso de uso de la clase (normalmente se usa public para clases, pero varía segun el problema), con public cualquiera puede utilizar esta clase y NombreClase es el nombre de la clase a utilizar, donde es importante utilizar la convención de código definida por Sun . Esta convención es importante, ya que la lectura de un programa se hace más sencilla al conocer y utilizar esta convención, además de esta manera tenemos un estandar en la programación. Todos los nombres de clase inician con mayúscula y cuando se quiere identificar mas de una palabra se utiliza una mayúscula por cambio de palabra, ejemplos: Libro, Automovil, ComputadoraEscritorio.

La definición de variables se hace a través de definir el tipo del modificador (permiso de uso) para cada una de las variables, el tipo de variable (parecido a los utilizados en C++) y el nombre de la variable (lo explicamos mas abajo).

Los métodos constructores se definen sin tipo de valor de retorno y lo que se especifica en ellos es la forma en la que se van a crear los atributos o variables de la clase al utilizar la clase para crear un objeto (instancia) de la clase.

Los métodos de la clase son como las funciones o procedimientos utilizados en otros lenguajes, nos sirven para separar las instrucciones necesarias para hacer los cálculos o instrucciones necesarias para llevar a cabo algun procedimiento que representa una conducta de la clase.

Se definen métodos porque es el lenguaje propio de la Programación Orientada a Objetos (POO), ya que identifican las formas o procedimientos o mas bien dicho los comportamientos de los objetos de la clase donde se definen.

Los métodos se inician definiendo el permiso de uso del método, después el tipo de método (valor a ser regresado por el método al terminar de ejecutarse), el nombre del método y entre paréntesis las variables a utlizar en el método (también se definen más abajo).

Definamos un ejemplo de una clase en Java.

Veamos la clase Punto, la cual manejará un punto en un plano cartesiano.

Las variables a utilizar por esta clase serán el valor de la coordenada x y el valor de la coordenada y.

Los métodos a definir en esta clase tienen que ver con las variables a utilizar, en este caso con la coordenadas en x, como en y.

La clase Punto quedaría en Java como:

public class Punto {

    private int x;  //  variable para la coordenada en x

    private int y; // variable para la coordenada en y

    public Punto() {  // metodo para construir un objeto sin parámetros

          x = 0;

          y = 0;

      }

      public Punto(int x, int y) {  // método para construir un objeto con parámetros

           this.x = x;

            this.y = y;

       }

       public int getX() {         // método que te dá el valor de la coordenada x

             return x;

       }

       public int getY() {         // método que te dá el valor de la coordenada y

             return y;

      }

       public void setX(int x) {  // método que sirve para cambiar el valor de la coordenada x

              this.x = x;         // this se utiliza porque se esta utilizando (x) como parámetro y como 

                                  // variable de instancia y esto es para que no se confunda

      }

      public void setY(int y) {  // método que te sirve para cambiar el valor de la coordenada y

              this.y = y;        // this se utiliza porque se esta utilizando (y)  como parámetro y como 

                                 // variable de instancia y esto es para que no se confunda

      }

}

Esta es una clase muy sencilla que nos servirá para definir lo más importante de una clase, aunque el concepto pudiera ser muy abstracto, es importante que realices algunos ejercicios antes de tratar de crear alguna aplicación o applet que utilicen clases y que puedan mostrar el resultado de su uso.

Los atributos de esta clase (llamados también variables de instancia) son solo dos, la coordenada en el eje x y la coordenada en el eje y. Ambos atributos fueron definidos como privados (private) y esto se define así por integridad, de tal manera que no se podrán modificar desde fuera de esta clase, es decir si alguna otra clase quiere hacer uso de las variables privadas, necesita de los métodos definidos en la clase, que usen estos atributos y que sean públicos para que puedan ser usados por otras clases. De esta manera a través de los métodos de la clase, la clase define de que manera se utilizarán las variables de instancia para ser utilizadas en otras clases. No te preocupes si no entiendes todos estos conceptos abstractos, poco a poco lograrás entenderlos mejor.

Atributos o Características

La sintaxis de los atributos o características de una clase en forma general es:

        modificador     tipo    nombre;

modificador puede ser : 1) public, cualquiera puede tener acceso a este atributo, 2) private, solo la clase en la que esta definido puede utilizar este atributo y 3) protected, solo la clase en la que esta definido este atributo y cualquier clase que descienda de esta clase puede utilizar este atributo.

tipo puede ser:

tipo descripción formato/tamaño
(integers)
byte entero de tamaño byte 8-bits a complementos a dos
short entero corto 16-bits a complementos a dos
int entero 32-bits a complementos a dos
long entero grande 64-bits a complementos a dos
(números reales)
float punto flotante de precision sencilla 32-bits IEEE 754
double punto flotante de doble precision 64-bits IEEE 754
(otros tipos)
char un solo caracter caracter de 16-bits de tipo Unicode
boolean valor boleano (true o false) true o false
NombreClase Alguna clase existente representará un objeto de alguna clase conocida

nombre es el nombre definido por el programador, igual que para las clases, los nombres de las variables o atributos a utilizar en la clase se apegan a una convención, deben empezar con minúsculas y cada cambio de palabra tener mayúscula, ejemplos: color, estatura, pesoPonderado.

Métodos o Conductas

Los métodos o las conductas de una clase, deben definirse de acuerdo a una sintaxis muy parecida a la que se utiliza en C++, a diferencia que en Java debemos anteponer el modificador del método, tenemos la siguiente sintaxis:

                       modificador            tipo-metodo     nombre-metodo (parámetros) {

                                            instrucciones del método

                      }

modificador puede ser : 1) public, cualquiera puede tener acceso a este método, 2) private, solo la clase en la que esta definido puede utilizar este método y 3) protected, solo la clase en la que esta definido este atributo y cualquier clase que descienda de esta clase puede utilizar este método.

tipo-metodo  puede ser:

tipo descripción formato/tamaño
(integers)
byte entero de tamaño byte 8-bits a complementos a dos
short entero corto 16-bits a complementos a dos
int entero 32-bits a complementos a dos
long entero grande 64-bits a complementos a dos
(números reales)
float punto flotante de precision sencilla 32-bits IEEE 754
double punto flotante de doble precision 64-bits IEEE 754
(otros tipos)
char un solo caracter caracter de 16-bits de tipo Unicode
boolean valor boleano (true o false) true o false
NombreClase
void no regresa valor  

nombre de método puede ser cualquiera, se recomienda seguir la convención de Java Sun, iniciando con minúsculas y luego cambiando a mayúsculas con cambio de palabra, por ejemplo getX, getNombreAlumno, setDireccionAlumno, etc.

Los parámetros pueden ser de cualquiera de los tipos definidos anteriormente en los atributos, pero debe definirse el tipo, luego el nombre del parámetro y una lista de otros, seguidos por comas.

Por ejemplo:

    int   getSaldo()   // método getSaldo que regresa un valor entero

   void setSaldo(double saldo)  // metodo setSaldo que no regresa valor y recibe un valor real de doble precisión

Del ejemplo anterior en la clase Punto tenemos:

     public int  getX()  //  método que te da el valor de la coordenada en el eje x

     public void setX(int x) //  método que te sirve para cambiar el valor de x

Cuando se definen los métodos o conductas de una clase, normalmente se deben crear los constructores de la clase (que es la manera en la que se definirán inicialmente los atributos de esa clase en la instancia a crear), y por cada variable de instancia se deben de crear dos metodos: 1) el metodo de acceso (accesor) que es el que sirve para tomar el valor de la variable de instancia en cuestión y 2) el método modificador (mutator) que es el que sirve para modificar el valor de la variable de instancia en cuestion.

Posteriormente observaremos que hay otros dos métodos que se deben de crear en general para cualquier clase (equals y el método toString), pero esto será mas adelante.

Valores Constantes

La palabra final es utilizada en Java para definir una constante, esta palabra es utilizada antes del tipo de la variable utilizada, algunos ejemplos son:

     private   final  int MAX = 10;

      final float g = 9.8f;

El término final no solo se antepone en variables para hacerlas constantes, sino que también se escribe en clases para que éstas no se puedan modificar, ni tampoco sirvan para crear instancias a partir de ellas (objetos), sino para definir métodos que serán constantes, un ejemplo de estas es la clase Math, la cual al igual que en C++ nos ayuda a hacer cálculos matemáticos, pero esto lo revisaremos más adelante.

Creando y Usando Objetos

La creación de un objeto se hace al definir el tipo de clase a la que pertenece y crearlo, para posteriormente utilizar el objeto a través de los métodos definidos en la clase.

La clase Color por ejemplo define un color y pueden crearse diferentes objetos de ella solo haciendo lo siguiente:

      Color   rojo, amarillo, azul;

      rojo = new Color(Color.red);

      amarillo = new Color(Color.yellow);

      azul = new Color(Color.blue);

Mas tarde revisaremos tambien que existe una clase para depositar elementos gráficos (clase Graphics), la cual puede cambiar el color utilizando para ello su método que cambia color y definiendo para esto un color disponible, por ejemplo:

        g.setColor( rojo);

donde g es un objeto de la clase Graphics y rojo es un objeto de la clase Color previamente definido.

Vemos asi que los objetos se entrelazan y que es importante conocer los métodos que tienen definidos en la clase, que tipo son y que parámetros tienen. Mas tarde practicarás esto.

Herencia

La herencia es un concepto muy utilizado en Programación Orientada a Objeto. Podemos hablar que al igual que un joven puede tener ciertas conductas que son heredadas de sus padres, como la manera de comer, la manera de pedir las cosas, pero también habrá cosas que pueden ser diferentes, como la manera de bailar, la forma de vestirse, etc.

Lo mismo pasa con las clases, puede haber una clase que defina las caractertísticas y conductas de todos los objetos que conforman esa clase, pero habrá clases que tienen ciertas características adicionales o conductas diferentes, para lo cual utilizamos el concepto de herencia.

Mas adelante habrá un lugar donde se pueda hacer más referencia a este concepto. Este es introducido aqui, ya que para realizar alguna aplicación gráfica o una aplicación en Web, es necesario utilizar este concepto, ya que hay clases que ya estan definidas como la aplicación gráfica (Frame) y como la aplicación en Web (Applet) que estaremos utilizando en siguientes secciones.

La manera de definir la herencia es a través del término extends, el cual es utilizado en la definición de la clase, se escribe el nombre de la clase nueva y después se escribe extends y finalmente el nombre de la clase particular de la cual se está heredando, por ejemplo si la clase Laptop hereda de la clase Computadora, la instrucción inicial que declara esto será:

      public class Laptop  extends  Computadora  {

La herencia es una de las facilidades que provee Java, al igual que C++, la principal diferencia es que Java solo permite la herencia simple, es decir que solo se herede de una clase en particular, mientras que C++ tiene herencia múltiple.

 

Ejercicio

Para los siguientes ejercicios toma en cuenta el ejercicio desarrollado en esta sección.

1. Escribe la definición en Java para una clase de Cuentas Bancarias que solo manejen el atributo saldo.

2. Escribe la definición en Java para una clase de Alumnos que solo maneje la matrícula y el nombre como atributos.

3. Escribe la definición de la clase Computadora que tiene la capacidad de memoria RAM, capacidad en Disco Duro y el precio.

 

Material de Apoyo
Programación Orientada a Objetos
Ligas sugeridas
http://www.particle.kth.se/~lindsey/JavaCourse/Book/Java/Chapter03/index.html

Regresar                                                                                                                                                                       Siguiente