About this entry




Usando Objetos en Java (Using objects in Java, Spanish only)

En este artículo se sientan las bases teóricas para la programación orientada a objetos, utilizando el lenguaje de Java como ejemplo.

Liked it? !

Antes de leer este artículo se recomienda haber leído Introducción a Java.

Índice

  1. Programación y Modelos
  2. Objetos, Comportamiento y Clases
  3. Comentarios en Java
  4. Trabajando con el PrintStream
  5. Hileras como objetos
  6. Declaracion de Variables y Asignación
  7. Mas Sobre Hileras
  8. Llamadas en Cascada
  9. Llamadas Compuestas

 

  1. Programación y Modelos

    Prácticamente todos los programas modelan algo. Un modelo es una representación simplificada. Las personas han construido modelos mucho antes de que hubieran computadoras. Por ejemplo un carro de juguete modela a un carro real. Los modelos no son representaciones completas. El carro de juguete no incluye todos los detalles del motor de un carro real. A pesar de que hay una correspondencia lógica entre los elementos de un modelo y los que estos representan, los modelos son físicamente diferentes de lo que estos representan.

    Los modelos pueden representar un mundo imaginario o hipotético. De hecho no todos los modelos son algo físico que se pueda tocar. Un modelo puede existir solo en papel, o incluso solo en la mente de alguien.

    Todos los modelos, aunque representen un mundo real o uno hipotético, comparten las siguientes características:

    1. Elementos del modelo representan otras cosas mas complejas. El eje del carro de juguete es solamente un palillo de aluminio.
    2. Elementos del modelo exhiben un comportamiento consistente. El carro de juguete representa un vehiculo que camina. Este no puede volar.
    3. Los elementos del modelo pueden ser clasificados en diferentes categorías basados en sus comportamientos comunes. La función de los carros es transportar gente. La función de los camiones es transportar material.
    4. Acciones externas a los elementos del modelo provocan su comportamiento. La mano mueve el carro.

     

  2. Objetos, Comportamiento y Clases

    Los elementos del modelo en los programas de Java se llaman objetos. Objetos que comparten un comportamiento común se agrupan en distintas categorías llamadas clases. El definir una clase consiste en escribir las secciones de código que especifican como los objetos de esa clase se comportan o actúan.

    Media vez la clase esta definida, objetos de esta clase pueden ser creados. Cada objeto pertenece a exactamente una clase y se dice que es una instancia de la clase. Una referencia en Java es una frase que se refiere a un objeto.

    Por ejemplo la clase PrintStream (una clase predefinida de Java) modela la salida de datos de un programa de Java. El monitor del computador es representado como una instancia del PrintStream. Este objeto es referenciado por medio de System.out. Para desplegar un saludo el programa le tiene que mandar un mensaje al objeto referenciado por System.out.

    Un mensaje es una requisición de un comportamiento deseado de un objeto. Cuando mandamos un mensaje en Java es necesario especificar: el receptor del mensaje (System.out), el nombre del comportamiento deseado (println), cualquier información adicional ("Hello world!").

    Todo junto quedaría:

    En el monitor despliegue "Hello world!" System.out.println("Hello world");

    Ejercicio de clase

    Escriba un programa que despliegue su nombre.

     

  3. Comentarios en Java

    Para la claridad del programa podemos agregar comentarios.

    1. Para comentarios de una línea se usa //
    2. Para comentarios de varias líneas, se abren con /* y se cierran con */
    3. Para documentación se pueden usar los comentarios que abren con /** y cierran con */ para usar antes de la declaración de variables y funciones.

     

  4. Trabajando con el PrintStream

    Como vimos anteriormente es el comportamiento de los objetos lo que los distingue los objetos de una clase de otra. Un método es la sección de una clase que describe un comportamiento particular. La información adicional que algunas veces los mensajes necesitan se llaman argumentos.

    Anteriormente mandamos mensajes al println de la forma

    println ("Algo");

    Aquí println seria el nombre del metodo y "Algo" seria el argumento.

    Hay otros métodos que provee la clase PrintStream (algunos con argumentos y otros no):

    1. println (String): despliega la hilera y baja de línea
    2. print (String): despliega la hilera y el deja el cursor al lado de la ultima letra desplegada
    3. println (): baja de línea.

    Ejemplos:

    System.out.print("JA"); System.out.print("VA"); System.out.println(); // despliega JAVA y baja de linea.

    Con estos términos podemos dar mas preciso el formato de un mensaje:

    referencia.nombre-metodo (argumentos);

    Cada método tiene su propia firma, y así se distingue de los otros. La firma consiste en el nombre del método junto con el numero y tipo de sus argumentos. De esa forma es completamente valido tener dos métodos con el mismo nombre pero argumentos diferentes. Por eso es que no hay conflicto entre el método println() y el método println(hilera). Son dos métodos distintos ! Los métodos que tienen el mismo nombre pero diferente firma se dice que están sobre-cargados.

     

  5. Hileras como objetos

    Cualquier conjunto de caracteres entre comillas como

    "Bienvenidos"

    es una referencia a objeto de la clase String.

    Hasta ahora hemos utilizado referencias a String para mandarle como argumentos a métodos. Por ejemplo ya hemos mandado hileras constantes como argumentos al método println.

    Siendo estas hileras referencias a objetos de la clase String, también les podemos mandar mensajes para exigir cierto comportamiento. Por ejemplo la clase String provee el método toUpperCase. Este método no requiere argumentos. El siguiente enunciado:

    "ufm".toUpperCase();

    Aquí le estamos mandando el mensaje toUpperCase a "ufm", que es una instancia de la clase String. Este enunciado creara una nueva instancia de la clase String, idéntica a la hilera original pero en mayúsculas. En palabras de Java, el método toUpperCase devolverá una referencia a un nuevo objeto de la clase String. Puedo hacer tres cosas con esta referencia:

    1. Mandarle mensajes al objeto al cual le hace referencia.
    2. Mandarla como argumento en un mensaje a otro objeto.
    3. Almacenar la referencia en una variable.

    Por ejemplo en el enunciado:

    System.out.println("ufm".toUpperCase());

    estoy mandando la referencia a la nueva hilera como información en el mensaje println al objeto System.out.

     

  6. Declaracion de Variables y Asignación

    La sintaxis de declaración de una variable en Java es:

    tipo identificador1 [, identificador2, ...]

    Cuando el tipo es una clase, la variable me sirve de referencia a objetos de esa clase.

    Por ejemplo:

    String hil1, hil2; PrintStream p; hil1 = "ufm"; // hil1 sera una refencia al objeto "ufm" (instancia de String) hil2 = hil1.toUpperCase(); /* hil2 sera una referencia al nuevo objeto "UFM" (tambien instancia de String). */ p = System.out /* aqui p hace referencia al mismo objeto al cual System.out hace referencia.*/ p.println (hil2); /* exactamente lo mismo a System.out.println(hil2) ya que ambos hacen referencia al mismo objeto ! */

    Nota: Nosotros podríamos creer que la llamada a toUpperCase modifica al objeto hil1 (la decir objeto hil1 lo digo como abreviación a el objeto referenciado por hil1). Los diseñadores de la clase String decidieron que los métodos no deberían de modificar la hilera sino crear un nuevo objeto String.

     

  7. Mas Sobre Hileras

    Además del método toUpperCase, la clase String también incluye los siguientes métodos:

    Metodo Devuelve Argumentos
    toUpperCase referencia a un objeto String ninguno
    toLowerCase referencia a un objeto String ninguno
    length un numero ninguno
    trim referencia a un objeto String ninguno
    concat referencia a un objeto String referencia a un objeto String
    substring referencia a un objeto String un numero
    substring referencia a un objeto String dos números

    Los métodos toUpperCase y toLowerCase devuelven una referencia a un objeto recién creado con las versiones en mayúscula y minúscula de la hilera receptora. El método trim crea una copia de la hilera receptora removiendo los espacios del principio y el final. El método concat crea una nueva hilera consistiendo de los caracteres de la hilera receptora, seguidos por los caracteres de la referencia de hilera en el argumento.

    Por ejemplo:

    String s, t, u; s = "tapa"; t = "sol"; u = s.concat (t); // referencia al nuevo objeto String "tapasol"

    Las dos versiones de substring crean una nuevo objeto String de caracteres contenidos en la hilera receptora. Para la versión de un argumento la nueva hilera contendrá todos los caracteres desde la posición recibida como argumento hasta el final. Por ejemplo:

    String s, t; s = "tapasol"; t = s.substring(4); /* referencia al nuevo objeto String "sol". Notese que la primera posicion es 0 (no 1).*/

    Para la versión de dos argumentos, la nueva hilera contendrán todos los caracteres desde la posición del primer argumento hasta la posición del segundo argumento. Por ejemplo:

    String s, t; // 01234567890123456 s = "fundamentalistas" t = s.substring (5, 11); // referencia al nuevo objeto String "mental"

    El método length devuelve el numero de caracteres de la hilera receptora. Por ejemplo, si quisiéramos extraer el carácter de en medio de una hilera:

    String s, t; s = "fundamentalistas"; t = s.substring (s.length()/2, s.length()/2 + 1); // referencia al nuevo objeto String "t"

    Ejemplo completo: Dado el primer nombre, segundo nombre y apellido de una persona, despliegue las sus iniciales.

    import java.io.*; class Iniciales { public static void main (String args[]) { String primero = "Miguel"; String segundo = "Angel"; String apellido = "Asturias"; String iniciales; String initPrim, initSeg, initAp; initPrim = primero.substring(0,1); initSeg = segundo.substring(0,1); initAp = apellido.substring(0,1); iniciales = initPrim.concat(initSeg); iniciales = iniciales.concat(initAp); System.out.println(iniciales); } }

    Ejercicio en clase: Escribir un programa que tome una hilera de tres caracteres y a continuación calcule y despliegue todas las permutaciones posibles.

    Por ejemplo si la hilera es "abc", el programa debería desplegar:

    abc acb bac bca cab cba

     

  8. Llamadas en Cascada

    En el problema de las iniciales, nosotros concatenamos las tres iniciales por medio de las instrucciones:

    iniciales = initPrim.concat(initSeg); iniciales = iniciales.concat(initAp);

    En la primera instrucción se crea un objeto String con iniciales haciéndole referencia. Después se le manda un mensaje a este objeto recién creado para que se le concatene la tercera inicial . Este método crea otro nuevo objeto String y deja iniciales haciéndole referencia. El primer objeto creado en realidad se pierde, haciendo que la primera instrucción sea un desperdicio ya que en la instrucción inmediata se hace que iniciales haga referencia a otro objeto. Podemos evitar esto mandándole el mensaje concat(initAp) a la objeto creado y referenciado por initPrim.concat(initSeg).

    La instrucción me quedaría así:

    iniciales = initPrim.concat(initSeg).concat(initAp);

    Suponiendo que initPrim es "M", initSeg es "A" y InitAp es "A", la ejecución se lleva a cabo de la siguiente forma:

    1. Se le manda un mensaje concat (con initSeg como argumento) al objeto initPrim.
    2. Esta llamada crea un nuevo objeto String "MA" y devuelve una referencia a este.
    3. Se le manda un mensaje concat (con initAp como argumento) a esta referencia del objeto recién creado.
    4. Esta llamada crea otro nuevo objeto String "MAA" y devuelve una referencia a este (que se asigna a la variable iniciales)

    Esta secuencia se llama en cascada. Aquí se manda un mensaje a un objeto, que crea un objeto para mandarle otro mensaje para que a su vez cree otro objeto al cual se le manda otro mensaje.

     

  9. Llamadas Compuestas

    Alternativamente pudimos haber resuelto el problema con una instrucción así:

    iniciales = initPrim.concat(initSeg.concat(initAp));

    Suponiendo que initPrim es "M", initSeg es "A" y InitAp es "A", la ejecución se lleva a cabo de la siguiente forma:

    1. Se le manda un mensaje concat (con initAp como argumento) al objeto initSeg.
    2. Esta llamada crea un nuevo objeto String "AA" y devuelve una referencia a este.
    3. Esta referencia del objeto recién creado se manda como argumento en el mensaje concat que se le hace a initPrim.
    4. Esta llamada crea otro nuevo objeto String "MAA" y devuelve una referencia a este (que se asigna a la variable iniciales)

    Esta secuencia se llama composición. Aquí se manda un mensaje a un objeto , que crea un objeto cuya referencia se usa para mandarlo como argumento en un mensaje a otro objeto, que a su vez crea un nuevo objeto que su referencia se usa para mandarlo como argumento en un mensaje a otro objeto.

Siguiente articulo que se recomienda leer: Usando Clases.

Etiquetas de technorati:

Liked it? !

Posted on December 26th | 7 comments | Filed Under: Tutorial de Java