PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) Objetivos El alumno conocerá y aplicará el concepto de programación orientada a objetos para la realización de programas. Al final de esta práctica el alumno podrá: Implementar programas orientados a objetos, que utilicen los conceptos del paradigma de la programación orientada a objetos. Antecedentes 1. Tener las bases de la programación orientada a objetos. 2. Manejar sentencias de control de flujo en algún lenguaje de programación Introducción Para entender el paradigma de programación orientada a objetos, es necesario primeramente definir algunos conceptos. • • • • Objeto.- Es un conjunto de atributos y métodos que conforman una entidad. Clase.- Es un tipo de objeto definido por el usuario. Es decir, una clase, visto desde la programación estructurada, es como un nuevo tipo de dato, creado por el usuario. Atributos.- Son las características que tiene un objeto. Por ejemplo, un lapicero tendría como atributos marca, color, diámetro de puntilla, número de puntillas, goma, etc. Métodos.- Son todas las acciones que puede realizar un objeto. Por ejemplo, el lapicero tendría como método escribir();si además tuviera goma, también podría tener como método borrar(). En la programación orientada a objetos se definió, por convención, una nomenclatura para escribir los programas, y así identificar a simple vista, clases, atributos y métodos: 1) No debe existir ningún espacio en blanco, ni guiones bajos dentro de los nombres. 2) En el caso de las clases, la primera letra de cada palabra que conforma el nombre, deberá ser mayúscula, por ejemplo: RaizCuadrada, MetodoNewton, etc. 3) Para los nombres de atributos, las letras de todo el nombre deberán ser minúsculas; en el caso de que incluya varias palabras, a partir de la segunda deberá iniciar con mayúscula; por ejemplo: banderaIf, parteReal, parteImaginaria, anguloExpresionPolar, etc. 4) Los nombres de métodos, siguen la misma nomenclatura que con los atributos, la diferencia es que los métodos llevan un par de paréntesis después del nombre. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) A continuación se presenta el clásico programa que imprime “hola mundo”, escrito en el lenguaje de programación Java Ejemplo 1 Imprimir “hola mundo” en pantalla public class HolaMundo{ public static void main(String args[]){ System.out.println("hola mundo"); } } Se puede observar que este programa inicia definiendo una clase. Esto ocurre siempre que se elabora un programa escrito en Java. En este caso, se definió una clase que se llama HolaMundo: public class HolaMundo{ } Como se indicó anteriormente, toda clase genera objetos, y estos objetos deben tener atributos y métodos. Pero cuando se requiere ejecutar una clase en lugar de crear un objeto, ésta debe contener un método main, y siempre se define de la misma forma. public static void main(String args[]){ } Y el equivalente al printf() de C, en Java es: System.out.println(); Habiendo visto las bases de lo que conforma una clase, ahora se establecerán pasos en el diseño, desarrollo e implementación de una clase. En el diseño de programas orientados a objetos, existe una serie de pasos a seguir: a) Leer y analizar el enunciado. b) Identificar las clases a utilizar. c) Para cada clase definir atributos y métodos. d) Elaborar el diagrama de clases. Ejemplo 2 Elaborar un programa que defina una entidad Persona que tenga como datos nombre, dirección, teléfono y edad; además que tenga como acciones caminar, correr y hablar por teléfono. Posteriormente que cree dos instancias de esta entidad y a cada una le asigne valores a sus datos e invoque a las actividades definidas. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) a) Leer y analizar el enunciado. Se requiere implementar una clase llamada Persona y crear dos objetos a partir de dicha clase. b) Identificar las clases a utilizar. Sólo se necesita una clase, en este caso Persona. c) Para cada clase definir atributos y métodos. De acuerdo al enunciado los datos de la entidad son los atributos y los métodos son las acciones que realiza la entidad. Atributos: 1) nombre, que será de tipo String. 2) direccion, que será de tipo String 3) telefono, que será de tipo String 4) edad, que será de tipo int Métodos: 1) caminar() 2) correr() 3) hablarPorTelefono() d) Elaborar el diagrama de clases Un diagrama de clases representa, de manera esquemática, a las clases y las relaciones que hay entre ellas. Cada clase se visualiza como una caja con tres secciones, donde en la primera sección se pone el nombre de la clase, en la segunda sección los atributos de ésta, y en la tercera sus métodos. Por lo que el diagrama de clases para este ejemplo queda de la siguiente forma: Persona String nombre String direccion String telefono int edad caminar() correr() hablarPorTelefono() Al llegar a este punto, se puede empezar a programar. Partiendo del esqueleto básico visto en el ejemplo anterior, definimos la clase y el método main. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) public class Persona{ public static void main(String args[]){ } } Ahora sobre esta base, se le agregan los atributos y métodos. public class Persona{ String nombre; String direccion; String telefono; int edad; public static void main(String args[]){ } public void caminar(){ } public void correr(){ } public void hablarPorTelefono(){ } } Una vez definida la clase, se agregará código para crear objetos. Para generar un nuevo objeto se utiliza un constructor. Cuando se define una clase, se genera un constructor por omisión, con el mismo nombre que la clase; este constructor es invocado a través de la palabra new. Por lo tanto, para crear un objeto es similar a declarar una variable en lenguaje estructurado: se pone el tipo de dato, que en este caso es el nombre de la clase, después la variable que será el nombre del objeto, y luego, a través de una asignación, se invoca al constructor. Clase variableObjeto = new Clase(); Para el ejemplo, el código para la creación de los dos objetos requeridos es: Persona p1 = new Persona(); Persona p2 = new Persona(); Así, cuando se escribe new Persona(), se invoca al constructor Persona() para crear un objeto de la clase Persona. Este objeto creado se manipulará a través de la variable correspondiente (p1 o p2). Como ya se mencionó, cuando se crea una clase se genera automáticamente un método constructor por omisión, por lo que no es necesario ponerlo explícitamente. Para este ejemplo se pondrá de forma explícita para mostrar cómo se define y funciona. El código del método constructor del ejemplo se presenta a continuación. public Persona(){ System.out.println("Creando un objeto"); } Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) Hasta este punto, el código se muestra a continuación: public class Persona{ public Persona(){ System.out.println("Creando un objeto"); } String nombre; String direccion; String telefono; int edad; public static void main(String args[]){ Persona p1 = new Persona(); Persona p2 = new Persona(); } public void caminar(){ } public void correr(){ } public void hablarPorTelefono(){ } } Si se compila y ejecuta este código, se tendrá una salida como la siguiente: Creando un objeto Creando un objeto Esta salida se debe a que el constructor además de crear un objeto de la clase Persona imprime el mensaje: Creando un objeto Ahora se agregará código al método constructor para que al momento de que genere el objeto le asigne valores a sus atributos. Para realizar esto, el método constructor recibirá como parámetros los valores de los atributos; esto es similar al uso de parámetros en funciones de un lenguaje estructurado. El código final del constructor se muestra a continuación. public Persona(String nom, String dir, String tel, int ed){ System.out.println("Creando un objeto"); this.nombre = nom; this.direccion = dir; this.telefono = tel; this.edad = ed; } Como se observa en este código, los parámetros tienen indicado el tipo y van separados por coma. Además se ha introducido una nueva palabra: this; esta palabra, anteponiéndola a los nombres de los atributos, sirve para indicar que los atributos son del objeto que está invocando al método. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) De esta forma, cuando se invoque al constructor, se deberán dar los valores como argumentos. En este ejemplo, las líneas de código para crear un objeto, al tiempo que se le asignan valores a los atributos, se muestran a continuación. Persona p1 = new Persona("Juan Perez","Azucenas #12","12345678",28); Persona p2 = new Persona("Ana Lopez","Cipreses #45","87654321",24); Una vez asignados valores a los atributos, ahora se desplegarán en pantalla todos estos datos, por lo que dentro de main, agregaremos unas líneas de impresión en pantalla. System.out.println("\n\nDatos de p1:"); System.out.println("Nombre: "+p1.nombre); System.out.println("Direccion: "+p1.direccion); System.out.println("Telefono: "+p1.telefono); System.out.println("Edad: "+p1.edad); System.out.println("\n\nDatos de p2:\nNombre: "+p2.nombre+"\nDireccion: "+p2.direccion+"\nTelefono: "+p2.telefono+"\nEdad: "+p2.edad); Nótese que las primeras 5 líneas, despliegan los datos de la persona 1, mientras que la sexta despliega los datos de la persona2, esto con el objeto de observar que cuando se manda a imprimir algo, lo que se hace es concatenar cadenas, estas cadenas pueden ser variables o segmentos de texto entre un par de comillas, y el signo +, es el que hace la concatenación. Cabe destacar, que cuando se va a hacer referencia a algún atributo o método de un objeto, se debe poner el nombre del objeto seguido de un punto, y luego el nombre del atributo o método al que hace referencia. Ahora sólo falta agregarle algunas líneas de impresión a cada método para mandar llamar a los métodos y ver qué hacen los objetos. El código completo queda de la siguiente forma: public class Persona{ /*Se define un constructor explícito*/ public Persona(String nom, String dir, String tel, int ed){ System.out.println("Creando un objeto"); this.nombre = nom; this.direccion = dir; this.telefono = tel; this.edad = ed; } /*Se declaran atributos*/ String nombre; String direccion; String telefono; int edad; /*Método main de la clase*/ public static void main(String args[]){ /*Se crean los 2 objetos*/ Persona p1 = new Persona("Juan Perez","Azucenas #12","12345678",28); Persona p2 = new Persona("Ana Lopez","Cipreses #45","87654321",24); Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) /*Se manda a imprimir la información de cada objeto*/ System.out.println("\n\nDatos de p1:"); System.out.println("Nombre: "+p1.nombre); System.out.println("Direccion: "+p1.direccion); System.out.println("Telefono: "+p1.telefono); System.out.println("Edad: "+p1.edad); System.out.println("\n\nDatos de p2:\nNombre: "+p2.nombre+ "\nDireccion: "+p2.direccion+"\nTelefono: "+ p2.telefono+"\nEdad: "+p2.edad); /*Se llaman a los métodos con alguno de los objetos*/ p1.caminar(); p2.hablarPorTelefono(); p1.correr(); } /*Se declaran los métodos*/ public void caminar(){ System.out.println(this.nombre+" se fue a caminar"); } public void correr(){ System.out.println(this.nombre+" se fue a correr"); } public void hablarPorTelefono(){ System.out.println(this.nombre+" esta hablando por telefono"); } } Otro concepto de gran importancia en la programación orientada a objetos es: • Herencia: Permite el acceso a atributos y métodos de una clase desde otra. Visto en una jerarquía de clases, se dice que las subclases heredan de las superclases. Una superclase puede tener varias subclases, pero una subclase solo puede tener una superclase. Vea el siguiente diagrama. Ejemplo 3 Elaborar un programa que maneje los datos de un Empleado. Considere que el Empleado es una Persona y que además de tener los datos de Persona contiene datos propios de su condición de Empleado como lo son: clave de empleado, sueldo y puesto. Las actividades de empleado serán: atender a cliente y contactar a proveedores. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) a) Leer y analizar el enunciado. Como el Empleado es una Persona y debe contener los datos o atributos de ésta, entonces Empleado hereda de Persona. Para manipular los datos de Empleado se debe crear un objeto de este tipo ya que contiene datos y actividades adicionales a Persona. b) Identificar las clases a utilizar. Con base en el análisis, el Empleado es una subclase de la superclase Persona. Por lo que en este problema se contemplan dos clases: Persona y Empleado. c) Para cada clase definir atributos y métodos. Para la clase Empleado se necesitan los siguientes atributos y métodos. Atributos: 1) nombre, direccion, telefono, edad: estos atributos ya se encuentran en Persona. 2) claveEmpleado 3) sueldo 4) puesto Métodos: atendiendoACliente() contactandoAProveedores() d) Elaborar el diagrama de clases. En el diagrama se presenta la clase Empleado y se toma la clase Persona del ejemplo anterior. La línea flechada que une a las dos clases indica que empleado usa los atributos y métodos de Persona. El código base de la clase Empleado se muestra a continuación public class Empleado{ String claveEmpleado; double sueldo; String puesto; Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) public static void main(String args[]){ } public void atendiendoACliente(){ } public void contactandoAProveedores(){ } } Con este código, solamente se está definiendo una clase llamada Empleado, pero todavía no se le heredan los atributos y métodos de Persona. Para hacer que la clase Empleado sea una subclase de Persona, se utiliza la palabra extends, quedando el código como sigue. public class Empleado extends Persona{ String claveEmpleado; double sueldo; String puesto; public static void main(String args[]){ } public void atendiendoACliente(){ } public void contactandoAProveedores(){ } } Cabe hacer notar que cuando se utilizan clases para hacer subclases, no deben existir constructores explícitos. Además, la superclase puede no tener método main. Quitando el constructor y el método main del código del ejemplo anterior: public class Persona{ /*Se declaran atributos*/ String nombre; String direccion; String telefono; int edad; /*Se declaran métodos*/ public void caminar(){ System.out.println(this.nombre+" se fue a caminar"); } public void correr(){ System.out.println(this.nombre+" se fue a correr"); } public void hablarPorTelefono(){ System.out.println(this.nombre+" esta hablando por telefono"); } } Ahora, en el código de la clase Empleado, hay que agregar en el método main, unas líneas para crear el objeto, asignarle valores a sus atributos, y mandar llamar a los métodos de hablarPorTelefono() y contactandoAProveedores(). Por lo que el código final queda de la siguiente forma: Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) public class Empleado extends Persona{ String claveEmpleado; double sueldo; String puesto; public static void main(String args[]){ /*Se crea un objeto de tipo Empleado*/ Empleado e = new Empleado(); /*Se asignan valores a los atributos heredados*/ e.nombre = "Arturo Martinez"; e.direccion = "Siempreviva #83"; e.telefono = "98745632"; e.edad = 23; /*Se asignan valores a los atributos propios de la clase*/ e.claveEmpleado = "ArMart65874"; e.sueldo = 4532.80; e.puesto = "Capturista"; /*Desplegamos los valores asignados en pantalla*/ System.out.println("Nombre: "+e.nombre+"\nDireccion: " +e.direccion+"\nTelefono: "+e.telefono); System.out.println("Edad: "+e.edad+"\n\nClave de empleado: " +e.claveEmpleado+"\nPuesto: "+e.puesto); /*Se mandan llamar a algunos métodos*/ e.hablarPorTelefono(); e.contactandoAProveedores(); } /* se definen los métodos propios del cliente */ public void atendiendoACliente(){ System.out.println(this.nombre+" esta atendiendo a un cliente"); } public void contactandoAProveedores(){ System.out.println(this.nombre+" esta contactando proveedores"); } } Si se compila y ejecuta este código se observa una salida como la siguiente: Nombre: Arturo Martinez Direccion: Siempreviva #83 Telefono: 98745632 Edad: 23 Clave de Empleado: ArMart65874 Puesto: Capturista Arturo Martinez esta hablando por telefono Arturo Martinez esta contactando proveedores Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) Cómo compilar y ejecutar un programa de JAVA Lo primero que hay que hacer es guardar el código fuente con el mismo nombre de la clase, y además con extensión java, por ejemplo si la clase es HolaMundo, el nombre del archivo deberá ser HolaMundo.java. Ahora debemos abrir una ventana del sistema y desplazarnos por las carpetas hasta ubicarnos en donde se encuentren los programas. Para compilar usamos la instrucción javac. Por ejemplo, para compilar el programa HolaMundo.java, debemos escribir la siguiente instrucción: >javac HolaMundo.java Si el programa no tiene errores, regresará el símbolo del sistema. Con esto hemos generado el archivo HolaMundo.class. Ahora para ejecutar, usaremos la instrucción java de la siguiente forma: >java HolaMundo Cabe hacer notar que para ejecutar, no es necesario escribir la extensión class. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I) EJERCICIOS PROPUESTOS 1. Se tiene el siguiente código: public class OperacionesMatematicas{ int i; float f; double d,rd; public static void main(String args[]){ OperacionesMatematicas om = new OperacionesMatematicas(); om.i = 2; om.f = 10/3; om.d = 2673.8426; om.rd = i*f*d; System.out.println("El resultado almacenado en rd es: "+rd); } } ¿Compila correctamente? ¿Qué errores aparecen? Corrija dichos errores, sin mover de posición los atributos de la clase, y verifique que se ejecute correctamente. NOTA: Si se cambian valores en los atributos, específicamente para f, si pone un número como 25.89, se debe hacer un cast explícito, es decir debe anteponer (float) al número que se va a utilizar. Quedando de la siguiente forma: om.f = (float)25.89; 2. Investigue, ¿qué es un cast entre tipos de dato? Y explique, ¿cuándo se debe hacer explícito? 3. Implemente una clase llamada Punto2D, la cual almacene en sus atributos las coordenadas de un punto en un plano XY, y defina un método para desplegar en pantalla dichas coordenadas. 4. Implemente una clase llamada Punto3D, la cual almacene las coordenadas de un punto en un espacio XYZ. Tenga en cuenta que la clase Punto2D deberá ser la superclase de Punto3D. También deberá contar con un método de impresión de las coordenadas del punto. 5. Implemente una clase llamada Computadora, proponga por lo menos 5 atributos, un atributo extra que indicará el estado de la computadora, si está encendida o apagada. Deberá tener 3 métodos, uno para prender la computadora, otro para apagar la computadora, y otro que indique que se está trabajando en la computadora. Tenga en cuenta que para el método donde se está trabajando en la computadora, no se puede trabajar si está apagada. El estado inicial de la computadora es apagada. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos