Download Introducción a la programación orientada a objetos en Java
Document related concepts
no text concepts found
Transcript
Departamento de Sistemas Telemáticos y Computación (GSyC) Introducción a la programación orientada a objetos en Java Katia Leal Algara 2012-2013 katia@gsyc.es http://gsyc.escet.urjc.es/~katia/ 0 Introducción a Java ¿Qué es Java? Lenguaje de programación de propósito general, pero orientado a objetos Creado por la empresa Sun MicroSystems Estaciones de trabajo UNIX, sistema operativo Solaris, estándar RPC, sistema de ficheros en red NFS, servicio de información en red NIS … Objetivo: tomando como referencia C++, diseñar Java para ser pequeño, simple e independiente de la plataforma de ejecución Java = lenguaje de programación + intérprete + API GSyC 2013 - Introducción a la POO en Java 1 Introducción a Java ¿Qué es Java? Programador: escribe aplicaciones en las que podrá usar paquetes predefinidos en la API de Java Programa Java: se compila con el compilador de Java generando código bytecode Bytecode: es interpretado por la Java Virtual Machine (JVM) JVM: utiliza librerías de enlace dinámico (DLLs) necesarias para implementar la API de Java en cada sistema operativo y hardware concreto API de Java: paquetes de software predefinidos con un gran número de funciones independientes de plataforma Conectividad de redes, seguridad, acceso a bases de datos, capacidades gráficas, etc. GSyC 2013 - Introducción a la POO en Java 2 Introducción a Java Carácterísticas del lenguaje Java ¡Realmente OO! Los objetos se manejan de forma pura y simple, no como estructuras de datos disponibles para el programador No pueden definirse procedimientos ni funciones No existen las estructuras, unios o las definiciones de tipos Todo son clases u objetos, menos las operaciones básicas (while, for, …) y los tipos básicos (int, float, boolean, …) Ofrece jerarquía de clases, herencia, encapsulación y polimorfismo Independiente de plataforma El código fuente puede ser compilado en cualquier máquina independientemente del fabricante o del sistema operativo Una vez compilada, una aplicación escrita en Java puede ejecutarse en cualquier máquina sin necesidad de recompilar el código fuente El código binario generado se denomina bytecode GSyC 2013 - Introducción a la POO en Java 3 Introducción a Java Carácterísticas del lenguaje Java Robusto y fiable No proporciona conversión automática de tipos, el programador lo debe de hacer de forma explícita en el código Para el programador los punteros no existen, aunque internamente los tipos de Java se implementan como punteros El acceso a los objetos de realiza declarándolos, utilizando una referencia explícita Interpretado y portable Aunque el código interpretado se ejecuta más lentamente que el compilado, tiene la ventaja de ser portable En aquellos casos en los que sea absolutamente necesario el uso de código nativo, existen compiladores just-in-time (JIT) que traducen el bytecode a código nativo GSyC 2013 - Introducción a la POO en Java 4 Introducción a Java Gestión de memoria No se puede reservar memoria de forma explícita, salvo mediante la creación de nuevos objetos Igual que no se reserva memoria, tampoco es preciso liberarla, de eso se encarga el recolector de basura (Garbage Collector) Este proceso se ejecuta de forma automática y en segundo plano, aunque el programador puede invocarlo directamente en el código El intérprete de Java lleva la cuenta del número de referencias a cada objeto en la memoria Cuando el número de referencias de un objeto es cero, en la siguiente recolección de basura, dicho objeto será destruido, liberándose la memoria que ocupa GSyC 2013 - Introducción a la POO en Java 5 Introducción a Java Aplicaciones y Applets Un applet es un programa dinámico e interactivo que se ejecuta dentro de una página web: Tanto la página como el applet se visualizan por medio de un navegador web con soporte para Java El applet, al igual que la página web, se descarga de internet y se ejecuta de forma local en el navegador web El primer applet que se escribió en Java fue … … la mascota de Java, Duke, agitando la mano. GSyC 2013 - Introducción a la POO en Java 6 Introducción a Java Aplicaciones y Applets World Wind es un applet en código abierto de la NASA que hace un uso intensivo de OpenGL para proporcionar un mapa detallado en 3D del mundo Desarrollado con JOGL (Java OpenGL): librería que permite utilizar OpenGL dentro de Java Otra librería también muy popular para Java es LWJGL (Lightweight Java Game Library) GSyC 2013 - Introducción a la POO en Java 7 Introducción a Java Aplicaciones y Applets Una aplicación es un programa general escrito en el lenguaje Java: No requiere de un navegador para ejecutarse, si no de la JVM A diferencia de los applets, no tienen por qué tener asociado un contexto gráfico y un interfaz de usuario GSyC 2013 - Introducción a la POO en Java 8 Introducción a Java Java y JavaScript JavaScript es un lenguaje para la creación de scripts: Es un lenguaje interpretado El código escrito en JavaScript se encuentra dentro de documentos HTML Es el navegador (un intérprete de JavaScript incluido en el mismo) el que se encarga de ejecutarlo GSyC 2013 - Introducción a la POO en Java 9 Introducción a Java Java y JavaScript JavaScript tiene una sintaxis similar a C: Débilmente tipado, en la declaración de las variables no es necesario especificar su tipo Realiza conversión automática de tipos GSyC 2013 - Introducción a la POO en Java 10 Entorno de desarrollo de Java JDK: Java Development Kit Javac: compilador de Java Java: intérprete de Java (JVM) Jdb: depurador de Java Javadoc: generador automático de documentación … Existen muchos entornos de desarrollo integrados (IDEs), como Eclipse, que integran distintas herramientas en un mismo paquete: editor, compilador, depurador, etc. Todo ello en un entorno GSyC 2013 - Introducción a la POO en Java gráfico. 11 Sintaxis básica de Java Introducción Conceptos no específicamente ligados a la POO Sintaxis inspirada en C/C++: sin punteros … Aplicación Java: conjunto de clases e interfaces que se agrupan en paquetes Las clases e interfaces se organizan en ficheros con extensión .java Debe existir una clase que contenga el programa principal, asociado a un método main que se ejecuta cuando se inicia la aplicación Por último, una aplicación debe importar todas aquellas clases, interfaces y/o paquetes que necesite para su implementación GSyC 2013 - Introducción a la POO en Java 12 Sintaxis básica de Java El método main() Toda aplicación debe tener una clase principal con un método main que es el primero que se ejecuta cuando se inicia el programa Definición del método : public static void main(String []args) public: visible en todo el programa y desde el exterior para poder ser ejecutado por la JVM static: se aplica a toda la clase y no a objetos o instancias de la misma void: al ser el primer método en ejecutarse no puede devolver ningún valor, nadie lo recogerá args: lista de argumentos pasados por la línea de comandos GSyC 2013 - Introducción a la POO en Java 13 Sintaxis básica de Java Variables Variables: se definen mediante un nombre, un tipo y un ámbito Variables miembro o atributos Representan datos específicos de cada clase y diferencian unos objetos de otros Los atributos comunes a todos los objetos de una clase se denominan Variables de clase y van precedidas del modificador static Variables locales a un ámbito Necesarias para almacenar valores intermedios Desaparecen una vez que el bloque o método en el que fueron definidas deja de existir Variables instancia Se corresponden con los objetos propiamente dichos Resultado de declarar una variable como perteneciente a una clase y dando valor a sus atributos No existen variables globales GSyC 2013 2012 - Introducción a la POO en Java 14 Sintaxis básica de Java Declaración de variables int edad; String nombre, apellido1, apellido2; boolen esCierto = false; GSyC 2013 2012 - Introducción a la POO en Java 15 Sintaxis básica de Java Tipo de una variable El tipo de una variables puede ser El nombre de una clase Uno de los tipos simples: Numéricos, caracteres y booleanos No se tratan como objetos por eficiencia y sencillez de uso No obstante, estos tipos también pueden ser usados como clases al estar definidos en la API de Java (paquete java.lang) GSyC 2013 2012 - Introducción a la POO en Java 16 Sintaxis básica de Java Tipos numéricos Enteros byte, 1 byte [-128..127] short, 2 bytes [-32.768..32.767] int, 4 bytes [2.147.483.648..2.147.483.647] long, 8 bytes Coma flotante float, de 32 bits double, de 64 bits La conversión automática de tipos sólo se produce cuando el compilador determina que el destino es lo suficientemente grande. En caso contrario, se necesita una conversión explícita o casting GSyC 2013 2012 - Introducción a la POO en Java 17 Sintaxis básica de Java Tipo carácter char Identifica caracteres individuales 16 bits sin signo, representa Unicode Aunque no se utilicen como enteros, es posible operar con ellos como si lo fueran, sumándolos, incrementando su valor, etc. GSyC 2013 2012 - Introducción a la POO en Java 18 Sintaxis básica de Java Tipo booleano boolean true o false Es el resultado que devuelven todos los operadores lógicos GSyC 2013 2012 - Introducción a la POO en Java 19 Sintaxis básica de Java Array Grupo de variables con el mismo tipo a los que nos referimos con el mismo nombre Podemos declarar y luego crear el array: int [] edades; edades = new int[10]; O hacer ambas cosas a la vez: String titulos[] = new String[10]; También podemos declarar e inicializar: String titulos[] = {“Hamlet”, “Macbeth”, “El Quijote”, “Drácula”}; int edades = {18, 45, 26, 3, 22, 44}; ¿Dimensión del array? GSyC 2013 2012 - Introducción a la POO en Java 20 Sintaxis básica de Java Arrays multidimensionales int matriz[][] = new int[10][20]; ¿Cómo podemos acceder a los elementos de un array? matriz[i][j] = 0; títulos[i+1]; GSyC 2013 2012 - Introducción a la POO en Java 21 Sintaxis básica de Java Ámbito de una variable Los bloques de sentencias compuestas se delimitan con dos llaves { } Las variables sólo son válidas desde el punto donde están declaradas hasta el siguiente } Como se pueden anidar sentencias compuestas, cada una puede tener su propio conjunto de variables locales Un bloque interno ve las variables declaradas por encima de él, pero no al contrario public static void main(String args[]) { int mi_variable = 1; { int mi_variable; // ¿error? } } GSyC 2013 2012 - Introducción a la POO en Java 22 Sintaxis básica de Java Comentarios De una sola línea: // Comentario de una sola línea Multilínea: /* Comentario multilínea */ Comentarios javadoc: en caso de que queremos generar documentación automática, utilizaremos /** Comentario javadoc*/ GSyC 2013 2012 - Introducción a la POO en Java 23 Sintaxis básica de Java Expresiones y Operadores Asignaciones con operadores aritméticos x += y x=x+y x -= y x=x-y x *= y x=x*y x /= y x=x/y Operadores aritméticos + Operador suma - Operador resta * Operador multiplicación / Operador división % Operador módulo GSyC 2013 2012 - Introducción a la POO en Java 24 Sintaxis básica de Java Expresiones y Operadores Operadores de comparación == Igualdad != Distinto > Mayor que < Menor que >= Mayor o igual <= Menor o igual Operadores lógicos && AND || OR ^ XOR ! NOT GSyC 2013 2012 - Introducción a la POO en Java 25 Sintaxis básica de Java Expresiones y Operadores Operadores de bit & AND | OR ^ XOR << Desplazamiento a la izqda >> Desplazamiento a la dcha >>> Dpl. dcha relleno de ceros ~ Complemento a 1 GSyC 2013 2012 - Introducción a la POO en Java 26 Sintaxis básica de Java Precedencia de operadores operadores posfijos op++ op-- operadores unarios ++op --op +op -op ~ ! multiplicación y división */% suma y resta +- desplazamiento << >> >>> operadores relacionales < > <= => equivalencia == != operador AND & operador XOR ^ operador OR | AND booleano && OR booleano || condicional operadores de asignación ?: = += -= *= /= %= &= ^= |= <<= >>= >>>= GSyC 2013 2012 - Introducción a la POO en Java 27 Sintaxis básica de Java Operadores de Strings Se pueden concatenar dos cadenas de caracteres mediante el operador ʻ+ʼ Como resultado se crea un nuevo String Si alguno de los operandos no es un String, se convierte, siempre que se trate de un objeto perteneciente a una clase que tenga implementado el método toString(). También se puede utilizar el operador ʻ+=ʻ String nombre = “Katia”; nombre += “ Leal”; nombre = nombre + “Leal”; GSyC 2013 2012 - Introducción a la POO en Java 28 Sintaxis básica de Java Estructuras de control de flujo: if - else if (condición) { sentencia1; … sentencia_n; } else // Esta rama no es obligatoria { sentencia_x; … sentencia_y; } Operador if-else ʻ?ʼ variable = (expresión booleana) ? expreCierta : expreFalsa int minimo = x<y ? x : y; GSyC 2013 2012 - Introducción a la POO en Java 29 Sintaxis básica de Java Estructuras de control de flujo: switch switch( expresión ) { case constante1: sentencia1; ... break; ... case constanteN: sentenciaN; ... break; default: sentencia; ... break } GSyC 2013 2012 - Introducción a la POO en Java 30 Sintaxis básica de Java Estructuras de iteración: for int[] enteros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for(int i = 0; i < 10; i ++) { System.out.println(enteros[i]); } GSyC 2013 2012 - Introducción a la POO en Java 31 Sintaxis básica de Java Estructuras de iteración: while boolean prueba = true; while (prueba) { System.out.println("Esto lo verás muchas veces"); } while (prueba) { System.out.println("Esto lo verás una vez"); prueba = false; } GSyC 2013 2012 - Introducción a la POO en Java 32 Sintaxis básica de Java Estructuras de iteración: do-while int numero = 4557888; int digitos = 0; do { numero /=10; digitos++; } while (numero > 0); System.out.println(digitos); GSyC 2013 2012 - Introducción a la POO en Java 33 Sintaxis básica de Java Sentencia break Cuando es necesario salir de un bucle sin esperar a que se cumpla la condición, como en caso de error, podemos utilizar esta sentencia Provoca la salida del bloque más interno que la contenga, al bloque inmediatamente anterior for (int i = 1; i < 5; i++) { for (int j = 1; j < 5; j++) { if (j == 3) break; //salimos al bucle anterior } } GSyC 2013 2012 - Introducción a la POO en Java 34 Sintaxis básica de Java Sentencia continue Provoca que se dejen de ejecutar las sentencias de su bloque, se regresa al punto en que se comprueba la condición for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j > i) { System.out.println(“ ”); continue; } System.out.println(“ ” + (i * j)); } } GSyC 2013 2012 - Introducción a la POO en Java 35 Sintaxis básica de Java Sentencia return Java utiliza métodos en lugar de procedimientos y funciones Los métodos también necesitan ser invocados y en ocasiones tienen que devolver un valor, retornando al punto en que fueron llamados return value; // El método devuelve algún dato return; // Queremos salir sin devolver valor antes // del fin del código GSyC 2013 2012 - Introducción a la POO en Java 36 Sintaxis básica de Java Casting Convertir una variables de un tipo origen en otro tipo destino Sólo puede realizarse entre tipos básicos o en una jerarquía de herencia int cuenta1 = 0; float cuenta2 = (float) cuenta1;// cuenta2 = 0.0 GSyC 2013 2012 - Introducción a la POO en Java 37 Programación orientada a objetos en Java Introducción Un POO está compuesto de varios objetos que presentan una serie de propiedades, atributos, y unas cuantas operaciones que saben como realizar, métodos Objeto = estado + comportamiento Una vez construido, un objeto se puede integrar donde nos haga falta: Encapsulación Reusabilidad GSyC 2013 2012 - Introducción a la POO en Java 38 Programación orientada a objetos en Java Introducción Encapsulación Los objetos deben presentar un diseño fuerte de su interfaz, ocultando los detalles de su implementación Los objetos no deben cambiar el modo en el que se solicite realizar una determinada tarea Cuando aprendemos a conducir un coche, luego somos capaces de conducir cualquiera, ¿por qué? La encapsulación permite que el control de errores sea más fácil Los objetos conocer mejor que nadie los datos que guardan y podrán saber si existen inconsistencias Un objeto de una clase jamás podrá modificar directamente los atributos de otra, tendrá que pedírselo al objeto que los guarda invocando el/los método/s correspondiente/s GSyC 2013 2012 - Introducción a la POO en Java 39 Programación orientada a objetos en Java Introducción Reusabilidad Tenemos que programar los objetos de tal manera que solo realicen aquellas funciones que les son inherentes De esta forma podremos reutilizar código fácilmente sin tener que inventar la rueda continuamente Un órgano del cuerpo humano se puede donar puesto que realizará la misma función en otro cuerpo GSyC 2013 2012 - Introducción a la POO en Java 40 Programación orientada a objetos en Java Clases Plantilla o molde a partir del cual se construyen los objetos La clase define una serie de propiedades comunes a todos los objetos que pertenecen a ella, atributos También define el conjunto de operaciones que se pueden realizar sobre dichos objetos, métodos Ejemplos de clases: un coche, una casa, un órgano humano, un árbol … El valor que tomen los atributos para las distintas instancias de una clase, objetos, es lo que permitirá distinguirlas GSyC 2013 2012 - Introducción a la POO en Java 41 Programación orientada a objetos en Java Creación de una clase modificadores_de_clase class Nombre_Clase Modificadores abstract: concepto relacionado con la herencia public: todas aquellas clases que pueden ser referencias fuera de su paquete final: concepto relacionado con la herencia class MiClase { // declaración de atributos … // declaración de métodos … } GSyC 2013 2012 - Introducción a la POO en Java 42 Programación orientada a objetos en Java Creación de una clase: atributos modificadores Nombre_Clase nombre_atributo; Los modificadores pueden ser static y final class MiClase { // declaración de atributos Fecha fecha_de_compra; int año_de_compra; } // declaración de métodos … GSyC 2013 2012 - Introducción a la POO en Java 43 Programación orientada a objetos en Java Creación de una clase: métodos modificadores tipo_resultado nombre_método(tipo1 arg1, …, tipoN argN) { // Implementación del método } class Coche { // atributos int numero_de_puertas; Color color; Fecha fecha_matriculación; String matrícula; int velocidad_actual; } // métodos void acelerar(int incremento) {} void frenar(int decremento) {} void pintar(String nuevo_color) {} int get_numero_puertas() {} GSyC 2013 2012 - Introducción a la POO en Java 44 Programación orientada a objetos en Java Instancias u Objetos Los objetos resultan de concretar el valor de los atributos que se definen en una clase Así, podremos tener dos objetos de la clase Coche que para el atributo color uno sea rojo y el otro sea gris Estado de un objeto: valor concreto de los atributos en un instante de tiempo determinado El estado de un objeto afecta a su comportamiento Si un pedido está pagado no puede aceptar nuevos artículos Si es un pedido vacío no le pueden borrar artículos puesto que no los tiene GSyC 2013 2012 - Introducción a la POO en Java 45 Programación orientada a objetos en Java Instancias u Objetos: Creación Como cualquier otra variable, un objeto de una clase se crea en dos pasos: Declaración: Coche mi_coche; Inicialización o creación propiamente dicha: mi_coche = new Coche(); Finalmente, podemos hacer ambas cosas a la vez: Coche mi_coche = new Coche(); Para referirnos a los objetos o atributos de una clase utilizamos el ʻ.ʼ: mi_coche.matrícula = “0212 CGH”; System.out.println(“Mi coche tiene ” + mi_coche.get_numero_puertas() + “ puertas.”); GSyC 2013 2012 - Introducción a la POO en Java 46 Programación orientada a objetos en Java Constructor de una clase El constructor es un método especial que tienen todas las clases Cuando creamos una instancia de una clase y se invoca a new, lo que hacemos es invocar a uno de los constructores de dicha clase El constructor debe tener exactamente el mismo nombre que la clase El método constructor realiza tareas de inicialización, como dar valor a los atributos Java define un constructor por defecto para todas las clases: Este constructor no recibe argumentos Los atributos se inicializan a los valores por defecto que corresponde a su tipo (a cero los números, a null los objetos, a false los booleanos y al carácter nulo ʻ\0ʼ los caracteres) Suele resultar interesante tener varios constructores a medida En muchas ocasiones, la primera línea de un constructor suele invocar a otros constructores de la clase: this this: entre otras cosas, actúa como sustituto del nombre del constructor de una clase GSyC 2013 2012 - Introducción a la POO en Java 47 Programación orientada a objetos en Java Constructor de una clase class Cliente { // atributos String nombre_cliente; int numero_cuenta; int compras_efectuadas = 1; int bonus_acumulado; // constructores Cliente (String nombre) { this(nombre, Cuenta.obtener_nuevo_numero()); } Cliente (String nombre, int num_cuenta) { nombre_cliente = nombre; numero_cuenta = num_cuenta; } // métodos public void apuntar_compra() { compras_efectuadas = compras_efectuadas + 1; } public void bonificar(int bonus) { bonus_acumulado = bonus_acumulado + bonus; } public String get_nombre() { return nombre_cliente; } } GSyC 2013 2012 - Introducción a la POO en Java 48 Programación orientada a objetos en Java Destructor de una clase En contraposición a los constructores, el método finalize() se ejecuta cuando un método es eliminado de la memoria por el recolector de basura No lleva asociada ninguna acción por defecto Deberá ser sobreescrito por aquellas clases que necesiten un proceso de finalización especial Por ejemplo: La clase FileInputStream utiliza el método finalize() para cerrar el Stream La clase DatagramSocket sobreescribe el método finalize() para añadir un proceso adicional necesario para cerrar el socket GSyC 2013 2012 - Introducción a la POO en Java 49 Programación orientada a objetos en Java This this se utiliza para referirse al objeto actual 1.Cuando queremos llamar a un método pasándole como parámetro el objeto actual 2.Para resolución de variables dentro de un ámbito: diferenciar parámetros de los atributos de la clase con el mismo identificador 3.Para invocar, dentro de un constructor, a otro constructor de la misma clase GSyC 2012 2013 - Introducción a la POO en Java 50 Programación orientada a objetos en Java This class Cliente { int codigo_cliente; Cliente(int codigo_cliente) { this.codigo_cliente = codigo_cliente; } public void apuntarCompra(Pedido P){…} … } // class class Pedido { Cliente c; int codigo_pedido; public void asignarAlCliente() { c.apuntarCompra(this); } } // class GSyC 2012 2013 - Introducción a la POO en Java 51 Programación orientada a objetos en Java Paquetes Las clases e interfaces en Java se organizan en paquetes a modo de librería Las estructuras de paquetes siguen un esquema de árbol que garantiza la unicidad en el nombre de los paquetes Cuando una clase no pertenece a un paquete, se asocia al paquete por defecto, el cuál está asociado al directorio que contiene ese código GSyC 2013 2012 - Introducción a la POO en Java 52 Programación orientada a objetos en Java Paquetes: cómo escribir un paquete En Java no son necesarios los ficheros de cabecera Para indicar que una clase o interfaz pertenece a un paquete, hay que poner al comienzo del fichero fuente: package nombre_paquete; Si en un mismo fichero se escriben varias clases o interfaces, sólo uno de ellos puede ser declarado como público GSyC 2013 2012 - Introducción a la POO en Java 53 Programación orientada a objetos en Java Paquetes: uso de un paquete Para hacer referencia a un elemento de un determinado paquete, tenemos dos opciones: Escribir el nombre completo del paquete y del elemento en cuestión java.awt.event.ActionEvent Importar el paquete para poder referenciar al elemento sin tener que anteponer todo el nombre del paquete que lo contiene import java.awt.event.ActionEvent; import java.awt.event.*; GSyC 2013 2012 - Introducción a la POO en Java 54 Programación orientada a objetos en Java Paquetes: cómo localiza el compilador los paquetes Todos los ficheros de un paquete deben localizarse dentro de un subdirectorio que concuerde con el nombre del paquete Los subdirectorios pueden colgar de cualquier directorio contemplado en la variable de entorno CLASSPATH java.util : c:\jdk.x.y.z\lib ==> \java\util (paquete) (CLASSPATH) (subdirectorio) GSyC 2013 2012 - Introducción a la POO en Java 55 Programación orientada a objetos en Java Modificadores Palabras reservadas que se anteponen al nombre de una clase, método o atributo Su objetivo es el de imponer un comportamiento o cualidades de las que carecen por defecto A continuación veremos modificadores de métodos y de atributos GSyC 2013 2012 - Introducción a la POO en Java 56 Programación orientada a objetos en Java Modificadores de acceso La manera en la que desde fuera se puede referenciar a los métodos o atributos de una clase, depende de los modificadores que anteceden al propio método o atributo Modificadores de acceso: public private protected GSyC 2013 2012 - Introducción a la POO en Java 57 Programación orientada a objetos en Java Modificadores de acceso: public Cuando declaramos un método o atributo como público, estamos permitiendo que desde cualquier otra clase puedan referenciarlo directamente Desde otra clase podemos incrementar el número de compras de un Cliente sin más: mi_cliente.compras_efectuadas++; GSyC 2013 2012 - Introducción a la POO en Java 58 Programación orientada a objetos en Java Modificadores de acceso: private Cuando declaramos un método o atributo como privado, no podremos acceder al atributo ni invocar al método desde ninguna otra clase mi_cliente.compras_efectuadas++; // ¿error? GSyC 2013 2012 - Introducción a la POO en Java 59 Programación orientada a objetos en Java Modificadores de acceso: protected Los atributos y métodos así declarados son accesibles directamente sólo desde la clase en que se definieron, de las subclases de esta y las clases que se encuentran dentro de su mismo paquete Éste es el modificador por defecto, el que toma un atributo o método cuando no se especifica ningún otro GSyC 2013 2012 - Introducción a la POO en Java 60 Programación orientada a objetos en Java ¿Qué tipo de modificador es mejor? Un programa que pretende ser OO debe declarar todos los atributos de todas las clases private Métodos get y set Para que una interfáz sea fuerte, los métodos tipo get y set serán declarados: public, si queremos invocarlos desde cualquier clase protected, si sólo queremos que sean invocados por las clases hijas private, cuando no nos interesa que puedan ser invocados desde el exterior (método que hace saltar una alarma) Cuando quereamos incrementar las compras de un Cliente, lo mejor es invocar al método apropiado: mi_cliente.apuntarCompra(); GSyC 2013 2012 - Introducción a la POO en Java 61 Programación orientada a objetos en Java Otros modificadores para atributos static: un atributo así declarado se asocia con la clase, tomando el mismo valor para todos los objetos de dicha clase Una variable de este tipo se denomina variable de clase y funciona de forma similar a las variables globales final: una variables con este modificador es en realidad una constante y debe ser inicializada antes de poder ser referenciada private static final int BASE = 300; public static final int SCHEDULE_NOW = BASE + 0; System.out.println(Tag.SCHEDULE_NOW); GSyC 2013 2012 - Introducción a la POO en Java 62 Programación orientada a objetos en Java Otros modificadores para métodos static: identifica a un método de clase que sólo puede actuar y acceder sobre métodos estáticos Se pueden ejecutar sin tener que crear una instancia de la clase y = Math.pow(x, a); final: un método de este tipo no puede ser sobreescrito por las subclases de la clase a la que pertenece Sólo los métodos static pueden ser final abstract: lo veremos en el apartado de Herencia GSyC 2013 2012 - Introducción a la POO en Java 63 Programación orientada a objetos en Java Metodología del main Como el método main(…) supone un artificio dentro de la POO, pueden surgir algunos problemas La forma más recomendada de emplear el main consiste en crear una clase que represente a nuestra aplicación y que sólo contenga el método main public class MiAplicacion { public static void main (String args[]) { Cliente mi_cliente; … } } GSyC 2013 2012 - Introducción a la POO en Java 64 Programación orientada a objetos en Java Paso de parámetros en Java Aunque los objetos son referencias, un método no puede cambiar el valor de sus parámetros Como siempre, hay que recurrir a los métodos de ese objeto para modificar su estado Java no puede asociar a un objeto otro diferente GSyC 2013 2012 - Introducción a la POO en Java 65 Programación orientada a objetos en Java Acceso protegido y clonación Cuando se copia una variable, el origen y la copia son referencias al mismo objeto Empleado pepe = new Empleado(“Pepe”, 2000, new Fecha(2013, 25, 1), “TIC”); Empleado mi_empleado = pepe; mi_empleado.cambiarDepartamento(“Marketing”); Si lo que queremos es crear un objeto idéntico a otro con la idea de que más adelante sea independiente de él, hay que utilizar el método java.lang.Object.clone() GSyC 2013 2012 - Introducción a la POO en Java 66 Programación orientada a objetos en Java Acceso protegido y clonación Para poder clonar un objeto, es necesario: Que la clase implemente el interfaz Cloneable Si la implementación que ofrece Object del método clone no se adapta a nuestras necesidades, habrá que redefinir dicho método La copia se realiza bit a bit, por lo que si el objeto molde tiene atributos que no sean tipos simples, el método clone no funcionará correctamente puesto que origen y copia seguirán teniendo variables comunes GSyC 2013 2012 - Introducción a la POO en Java 67 Programación orientada a objetos en Java Herencia En el mundo real los objetos se relacionan unos con otros de una manera jerárquica, compartiendo: características de estructura y comportamiento, pero añadiendo especialidad respecto a sus semejantes Cada clase define unas propiedades y un comportamiento. Las clases que pertenecen a la primera los compartirán, pudiendo añadir sus cualidades particulares A estas clases se las conoce como subclases, clases hijas o clases derivadas A la clase de la que heredan se la denomina superclase o clase padre GSyC 2013 2012 - Introducción a la POO en Java 68 Programación orientada a objetos en Java Herencia En la POO existen dos tipos fundamentales de herencia: Herencia de implementación, extends Herencia de interfaz, implements GSyC 2013 2012 - Introducción a la POO en Java 69 Programación orientada a objetos en Java Herencia de implementación Consiste en establecer una jerarquía de clases de modo que la clase hija hereda los atributos y métodos de la clase padre pudiendo añadir métodos y atributos propios La subclase hará las cosas como su padre: podemos invocar a métodos no definidos en ella pero sí en algunas de las clases que la preceden en la jerarquía El compilador ascenderá niveles en la jerarquía hasta encontrar el método invocado GSyC 2013 2012 - Introducción a la POO en Java 70 Programación orientada a objetos en Java Herencia de implementación Si una subclase necesita hacer las cosas de forma diferente a su clase padre, podrá redefinir los métodos necesarios Todos los Animales respiran, pero los Mamíferos lo hacen por medio de pulmones y los Peces por medio de branquias. Podemos redefinir el método respirar() en cada una de ellas para contemplar esta particularidad GSyC 2013 2012 - Introducción a la POO en Java 71 Programación orientada a objetos en Java Herencia de implementación No debe utilizarse este tipo de herencia a menos que todos los atributos y métodos tengan sentido No es conveniente que existen jerarquías de herencia de muchos niveles (más de cuatro) Al igual que C++, no permite la herencia múltiple class MiClaseHija extends MiClasePadre { // atributos propios de la clase hija // métodos propios de la clase hija // métodos redefinidos } GSyC 2013 2012 - Introducción a la POO en Java 72 Programación orientada a objetos en Java Herencia de implementación Por defecto, todas las clases heredan de la superclase Object, definida en el paquete java.lang Es posible asignar un objeto subclase a una variable perteneciente a la superclase Empleado primer_empleado; Directivo jefe = new Directivo(…); primer_empleado = jefe; GSyC 2013 2012 - Introducción a la POO en Java 73 Programación orientada a objetos en Java Herencia de implementación: super Se utiliza en una clase hija para referenciar métodos y atributos de una clase padre super.atributo; super.metodo(…); El uso más generalizado se realiza desde el constructor de la clase hija GSyC 2013 2012 - Introducción a la POO en Java 74 Programación orientada a objetos en Java Herencia de implementación: super class Empleado { String nombre; int sueldo; Fecha fecha_contrato; public Empleado(String nombre, int salario, Fecha alta) { this.nombre = nombre; sueldo = salario; fecha_contrato = alta; } public void despedir(…) { } } class Directivo extends Empleado { String nombre_secretaria; public Directivo(String nombre, int salario, Fecha alta) { super(nombre, salario, alta); nombre_secretaria = “”; } } GSyC 2013 2012 - Introducción a la POO en Java 75 Programación orientada a objetos en Java Herencia de implementación: final Si por motivos de seguridad no nos interesa que una clase pueda tener descendencia, la podemos declarar con final final class MiClaseSinHijos { // atributos // métodos } Si queremos evitar que una clase hija redefina un método implementado por la clase padre, tenemos que añadir final a la declaración del método Por defecto, en una clase final todos los métodos son finales GSyC 2013 2012 - Introducción a la POO en Java 76 Programación orientada a objetos en Java Herencia de implementación: private Vs protected Los atributos presentes en una clase padre, ¿deben declararse private o protected? Aun en una jerarquía de herencia, el acceso a los atributos de la clase padre se debe llevar a cabo a través de métodos get y set GSyC 2013 2012 - Introducción a la POO en Java 77 Programación orientada a objetos en Java Herencia de interfaz La herencia de interfaz según la POO consiste en establecer una jerarquía en al que las clases superiores e intermedias definen un comportamiento que se concretará en la clase situada en el nivel más inferior Los métodos se declaran en las clases padres y se implementan en las hijas Las clases así definidas no están destinadas a tener instancias de sí mismas Se trata más bien de plantillas o patrones para crear clases más específicas GSyC 2013 2012 - Introducción a la POO en Java 78 Programación orientada a objetos en Java Herencia de interfaz: abstract clase declarada como abstract posee al menos un método abstracto Un método abstracto es un método que no se implementa en la clase que lo declara, obligando a que sean las clases hijas quienes lo hagan Una modificador_de_acceso abstract class MiClaseAbstracta { // atributos // métodos implementados // métodos abstractos modificador_acceso abstract tipo_resultado metodo1(…); } // class GSyC 2013 2012 - Introducción a la POO en Java 79 Programación orientada a objetos en Java Herencia de interfaz: abstract Implementación de la clase MensajeEscrito que hereda de Mensaje public class MensajeEscrito extends Mensaje { int longitud_mensaje; String texto; MensajeEscrito(String mensaje, String remite) { super(remite); texto = mensaje; } public void reproducir() { System.out.println(texto); } } // class GSyC 2013 2012 - Introducción a la POO en Java 80 Programación orientada a objetos en Java Herencia de interfaz: interfaces La forma más adecuada de implementar la herencia de interfaz es por medio de interfaces Un interfaz es similar a una clase pero: No tiene atributos Contiene declaraciones de métodos sin implementar Un interfaz define un comportamiento Una clase puede heredar de múltiples interfaces: un objeto se puede comportar de varias maneras Una persona puede ser informático y también puede jugar al baloncesto Para la declaración de un interfaz se utiliza la palabra reservada interface GSyC 2013 2012 - Introducción a la POO en Java 81 Programación orientada a objetos en Java Herencia de interfaz: interfaces La forma más adecuada de implementar la herencia de interfaz es por medio de interfaces Un interfaz es similar a una clase pero: No tiene atributos Contiene declaraciones de métodos sin implementar Un interfaz define un comportamiento Una clase puede heredar de múltiples interfaces: un objeto se puede comportar de varias maneras Una persona puede ser informático y también puede jugar al baloncesto Para la declaración de un interfaz se utiliza la palabra reservada interface Una clase que hereda de un interfaz utiliza la palabra reservada implements GSyC 2013 2012 - Introducción a la POO en Java 82 Programación orientada a objetos en Java Herencia de interfaz: interfaces public interface Mensaje { public void reproducir(); public String getRemitente(); } public class MensajeEscrito implements Mensaje { String texto; String remitente; MensajeEscrito(String mensaje, String remite) { remitente = remite; texto = mensaje; } public void reproducir() { } public String getRemitente() { return remitente; } } // class GSyC 2013 2012 - Introducción a la POO en Java 83 Programación orientada a objetos en Java Herencia de interfaz: extends Jerarquía de herencia por interfaz Cada interfaz que se añade a la cadena declara los métodos que añade Es responsabilidad de la clase que hereda del último interfaz la implementación de todos los métodos declarados en la jerarquía public interface Interfaz1 { public void método1(parámetros); } public interface Interfaz2 extends Interfaz1 { public void método2(parámentros); } GSyC 2013 2012 - Introducción a la POO en Java 84 Programación orientada a objetos en Java Herencia de implementación Vs Herencia de interfaz Aunque no existe una respuesta universal, las tendencias en POO se inclinan hacia la herencia de interfaz Los interfaces favorecen la reusabilidad: con elllos el grado de especialización de un objeto se alcanza únicamente en él mismo, no tomando carácterísticas de otras clases precedentes en la jerarquía Nuevo mensaje, MensajeAudiovisual Los interfaces son robustos frente a los cambios: cuando en un programa tenemos algoritmos que cambian con relativa frecuencia, tendremos bien aislados los puntos sensibles y sabremos que no interaccionan con los demás Empleado implementa el método subirSueldo() y tiene dos clases hijas, Directivo y Programador. Si a los directivos se les sube el sueldo con un criterio diferente al resto de empleados, tendremos que reescribir el método en la subclase Directivo teniendo cuidado de las llamadas a super GSyC 2013 2012 - Introducción a la POO en Java 85 Programación orientada a objetos en Java Herencia de implementación Vs Herencia de interfaz Los interfaces permiten que un objeto presente varios comportamientos de manera simultánea Cuando se usan interfaces, la llamada a los métodos en tiempo de ejecución se realiza a través de una búsqueda dinámica Mensaje m = new MensajeEscrito(); m.reproducir(); Los interfaces obligan al programador a escribir más código, pero a la larga compensa en términos de reusabilidad y de mantenimiento de las aplicaciones GSyC 2013 2012 - Introducción a la POO en Java 86 Programación orientada a objetos en Java Casting Convertir una variable de un tipo origen en otro destino El casting sólo puede realizarse entre tipo básicos o en una jerarquía de herencia int cuenta1 = 4; float cuenta2 = (float) cuenta1; // cuenta2 = 4.0 En una jerarquía de herencia solo se puede realizar de una clase hija a la clase padre Directivo jefe = new Directivo(…); Empleado mi_empleado = (Empleado)jefe; Mentir en un casting generará una excepción en tiempo de ejecución Para saber si un objeto está en la jerarquía de herencia de otro se utiliza la palabra reservada instanceof Empleado e1 = new Empleado(); if (e1 instanceof Directivo) { jefe = e1; } GSyC 2013 2012 - Introducción a la POO en Java 87 Programación orientada a objetos en Java Sobrecarga Concepto que permite que un método tenga múltiples implementaciones que se seleccionan en virtud del número y tipo de los parámetros que recibe el método, lo cual se conoce como sobrecarga del método class Perro { public void oler(Comida c) { System.out.println(“¡Me gusta la comida!”); } public void oler(Gato g) { System.out.println(“¡Odio a los gatos!”); } } // class GSyC 2013 2012 - Introducción a la POO en Java 88 Programación orientada a objetos en Java Polimorfismo Posibilidad de enviar un mensaje a un grupo de objetos cuya naturaleza puede ser heterogénea La clase Animal tiene el método abstracto mover() que se implementa de forma distinta en cada una de las subclases Pez y Ave. Entonces, un tercer objeto puede enviar el mensaje mover() a un grupo de objetos Pez y Ave por medio de una variable de referencia de clase Animal, haciendo así un uso polimórfico de dichos objetos respecto del mensaje mover() GSyC 2013 2012 - Introducción a la POO en Java 89