Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos Programación Orientada a Objetos Facultad de Informática Juan Pavón Mestras Dep. Ingeniería del Software e Inteligencia Artificial Universidad Complutense Madrid Conceptos a tratar Objetos y clases Igualdad e identidad Miembros de clase: static Constantes: final El patrón singleton El método main() Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 2 Programación orientada a objetos La unidad fundamental de la programación orientada a objetos es la clase Un programa orientado a objetos en ejecución crea objetos y manipula (mediante llamadas a métodos) objetos Cada objeto es un ejemplar de una clase Cuando se invoca un método de un objeto, se mira en el código de su clase las acciones a ejecutar Un objeto puede crear y usar otros para realizar su trabajo Juan Pavón Mestras Facultad de Informática UCM, 2007-08 3 Programación Orientada a Objetos Clases Una definición de clase comprende: Cabecera Campos: • Variables • Constantes estado del objeto Métodos: • Funciones • Constructores • Bloques de inicialización static Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos comportamiento 4 Programación orientada a objetos Para hacer un programa orientado a objetos 1. 2. Identificar los objetos del dominio Ver cómo se pueden implementar usando clases ya existentes • Evitar reinventar la rueda • Las clases estándar suelen estar muy probadas y son eficientes Para ello es conveniente familiarizarse con las librerías estándar de Java (o del lenguaje correspondiente) Conocer bien clases de uso común Saber encontrar las demás Lo más importante es la interfaz, no la implementación Cómo usar una clase, no cómo se implementa Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 5 Objetos Los objetos son instancias de las clases Cada objeto tiene sus propios valores de las variables definidas en la clase Cada objeto tiene su propia identidad Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 6 Igualdad vs. Identidad if(entrada == "hola") { ... } if(entrada.equals("hola")) { ... } Prueba la identidad Prueba la igualdad Todos los objetos Java se deben comparar siempre con .equals Los tipos básicos (incluidos referencias a objetos) se comparan con == Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 7 Igualdad vs. Identidad (1) :Persona :Persona “Ana” “Pepe” persona1 persona2 persona1 == persona2 ? Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 8 Igualdad vs. Identidad (2) :Persona :Persona “Ana” “Ana” persona1 persona2 persona1 == persona2 ? Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 9 Igualdad vs. Identidad (3) :Persona :Persona “Ana” “Ana” persona1 persona2 persona1 == persona2 ? Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 10 Igualdad vs. Identidad class PruebaIgualdad { public static void main(String args[]) { String str1, str2; str1 = “Texto de prueba."; str2 = str1; System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("El mismo objeto? " + (str1 == str2)); str2 = new String(str1); System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("El mismo objeto? " + (str1 == str2)); System.out.println("El mismo valor? "+ str1.equals(str2)); } } Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 11 Miembros estáticos de una clase (static) Sólo hay un miembro por clase Se declaran con la palabra clave static • variables de clase • métodos de clase Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 12 Miembros estáticos Variables de clase Hay exactamente una (aunque no exista ningún objeto) • Si se modifica, todos los objetos la verán modificada Se inicializan antes de usarse: public static final int MAXIMO = 12; protected static int[] primos = new int[4]; Se usan • Para definir constantes de clase (static final) • Para implementar el patrón singleton • Otras utilizaciones no suelen resultar de un buen diseño Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 13 Constantes Literal (valor constante de un tipo) null (referencia literal de objeto) • Para acabar de utilizar un objeto: variable = null; true y false 12 0 ‘N’ \116 "Hola Mundo.“ 28.4 ‘\n’ Variable constante (variable cuyo valor nunca cambia) Se declaran con la palabra clave final • static final float pi = 3.141592; • static final valormax = 255; • static final int abierto = 0, cerrado = 1; Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 14 Miembros estáticos public class Cuenta{ public static String INFO = "Ejemplo de clase Cuenta"; public final static int UNO = 1; public final static int DOS = 2; public final static int TRES = 3; } Se pueden acceder Consola Directamente desde la clase 1 System.out.println(Cuenta.UNO); O bien desde un objeto cualquiera Cuenta cuenta = new Cuenta(); System.out.println(cuenta.INFO); Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Consola Ejemplo de clase Cuenta Programación Orientada a Objetos 15 Miembros estáticos Métodos de clase Definen comportamiento referido a la clase, no a objetos concretos Se invocan en nombre de la clase Sólo pueden acceder a variables de clase (static) Para realizar funciones de utilidad (que sólo actúan sobre sus parámetros: Math.sqrt(234.0); public static void main() {}; Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 16 Métodos de clase También se pueden acceder desde la clase o los objetos public class Cuenta{ public static String INFO = "Ejemplo de clase Cuenta"; public final static int UNO = 1; public final static int DOS = 2; public final static int TRES = 3; public static String getInfo(){ return INFO; } } System.out.println(Cuenta.getInfo()); Ejemplo de clase Cuenta Cuenta cuenta = new Cuenta(); System.out.println(cuenta.getInfo()); Ejemplo de clase Cuenta Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 17 Patrón Singleton Sirve para asegurarse de que se crea sólo un único objeto de la clase La referencia a ese objeto se guarda en una variable estática y se accede por un método estático public class Singleton { private static Singleton theInstance; public static Singleton getInstance(){ if (theInstance == null){ theInstance = new Singleton(); } return theInstance; } private Singleton(){ super(); } } Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 18 Patrón Singleton Obsérvese que el contructor se declara private Así se asegura que no se pueden crear objetos de la clase desde código externo a la clase El método getInstance() comprueba si existe una instancia y si no la crea y la guarda en la variable estática Esta técnica se denomina inicialización perezosa Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 19 Uso del patrón Singleton Si se intenta llamar a la creación de una instancia, fallará new Singleton() error El constructor Singleton() no es visible Al llamar al método estático getInstance() devolverá una referencia Singleton.getInstance() Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Devuelve la única instancia de la clase Programación Orientada a Objetos 20 Uso del patrón Singleton Ejercicio: busca ejemplos donde sea útil el patrón Singleton Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 21 Miembros estáticos Bloques de inicialización estática Para configurar campos estáticos u otros estados necesarios static { for (int i = 0; i < primos.length; i++) primos[i] = i; } Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 22 El método main() Define el flujo principal de un programa El ínterprete de Java espera que se le pase una clase con el método main() declarado como public static void main (String[] args) { // … flujo principal del programa } Y se invoca java NombreDeClase lista de parámetros Los parámetros se guardan en el array args Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 23 Ejercicio de programa main Hacer un programa que lea una serie de palabras y las escriba al revés Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 24 Cadenas de caracteres La clase java.lang.String implementa cadenas Las cadenas son constantes: String s = "hola"; • Cambiar una significa construir una nueva Se pueden concatenar con el operador + Todos los objetos tienen el método toString() Se pueden formatear con valueOf() Se comparan con equals() (== es para comparar referencias) Tiene un tratamiento especial por el compilador El compilador se encarga de crear una clase String cuando se encuentra un literal: String uno = "Uno"; String dos = "Dos"; Juan Pavón Mestras Facultad de Informática UCM, 2007-08 String uno = new String("Uno"); String dos = new String("Dos"); Programación Orientada a Objetos 25 Cadenas de caracteres La clase StringBuffer permite manipular cadenas Se crea con StringBuffer(NumeroGrande) Luego se usan los métodos insert(), append(), setCharAt(), ... Al final se llama a toString() para obtener un String Permite añadir, reemplazar y borrar caracteres Cuando se añaden caracteres se incrementa el tamaño Un objeto StringBuffer conoce su longitud y capacidad • length indica cuántos caracteres tiene • capacity indica cuántos caracteres caben Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 26 Cadenas de caracteres StringBuffer buffer = new StringBuffer(); buffer.append("Hello"); buffer.append(", do you"); buffer.insert(13, " like my hat?"); System.out.println(buffer); buffer.replace(0,5,"Hi"); System.out.println(buffer); buffer.delete(2,buffer.length()-1); buffer.replace(buffer.length()-1, buffer.length(), "!"); System.out.println(buffer); Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Console Hello, do you like my hat? Hi, do you like my hat? Hi! Programación Orientada a Objetos 27 Cadenas de caracteres La clase StringBuffer es más eficiente que String Aunque no tan cómoda de utilizar Usar String para cadenas de caracteres constantes Y StringBuffer cuando haya que manipularlas Juan Pavón Mestras Facultad de Informática UCM, 2007-08 Programación Orientada a Objetos 28