Fundamentos F ndamentos de Programación Tema 2: Objetos y Clases de Objetos Martes 23-09-2007 Jueves 25-09-2007 Dpto. de Ingeniería de Sistemas Telemáticos http://www.lab.dit.upm.es/~fprg/ 1 Índice z Objetos z Clases Notación UML Encapsulamiento Convenio de nombres z Métodos referencias null z Comparación de objetos z Composición z Tipos enumerados Declaración de colecciones cerradas de valores z Clases predefinidas Math String z Ejercicios para Casa 2 ¿Qué es un objeto? z Un U objeto bj t es un trocito t it d de programa z Un programa es un conjunto de objetos z Se programan cosas que pueden ser muy complejas y para mantener esa complejidad bajo control hay que partir el problema en piezas controlables divide y vencerás 3 ¿Los objetos son objetos? z Los L objetos bj t de d programación ió NO son objetos bj t materiales z Inicialmente los objetos se inventaron para estructurar programas de simulación viaria un coche, un peatón, una calle, un semáforo, ... z Actualmente se usan p para estructurar objetos j materiales, servicios, conceptos, ..., en general cualquier q abstracción mental 4 Ejemplos de objetos z Una U estructura t t algebraica l b i (ej. ( j un grupo)) z Un ámbito de trabajo (ej. colores) z Un objeto material (ej. un satélite) z Un servicio inmaterial (ej. www) z Algo muy “real”: una cuenta corriente z ... 5 Clases de objetos z Habitualmente H bit l t un programa emplea l muchos h objetos de la misma clase muchos h coches, h muchos h satélites, él muchas h conexiones www, muchos transistores, ... z Los L programadores d definen d fi clases l class Car { ... detalles ... } z Y luego crean objetos de las clases definidas Car miCoche= new Car (...); Car cocheDeElisa= new Car (...); 6 Representación gráfica una clase nombre de la clase atributos características de la clase lo que se es o cómo se está métodos lo que puede hacerse con objetos de esta clase: comportamiento t i t posible ibl un objeto nombre nombre nombre nombre ... ... ... nombre nombre nombre ... ... ... nombre del objeto j valores memoria o estado particular de cada objeto todos los objetos j de una clase hacen exactamente l mismo lo i 7 class Circulo Circulo radio:do ble radio:double dameRadio:double area:double circunferencia:double escala:void class Circulo { double radio; Circulo (double _radio) { radio= _radio; } double dameRadio () { return radio; } double area () { return Math.PI * Math.pow(radio, 2); } double circunferencia () { return 2 * Math.PI * radio; } void escala (double proporcion) { radio= radio * proporcion; } UML unified modelling language } 8 Encapsulamiento z Quien Q i programa un objeto bj t controla t l los l métodos ét d de acceso a su estado y su comportamiento z El programador puede (y debe) responsabilizarse de la corrección del código correspondiente a un objeto compromiso contractual Objeto Métodos privados Atributos Métodos publicos 9 Convenios z Para P id identificar tifi clases l y objetos bj t unívocamente, í t cada uno recibe un nombre diferente mayúsculas ú l ≠ minúsculas ú l SePuedenUtilizarPequenasFrases yNumerosComoDia28oAno2000 peroNoSePuedenUsarAcentosNiEnes z Las clases empiezan con letra mayúscula j empiezan p con letra minúscula z Los objetos 10 Métodos z Constructores C t t para crear un método z Otros: Consultas { extraen características del objeto Modificadores { crean impronta en el objeto Operaciones { hacen h que ell objeto bj t evolucione, l i con memoria i 11 Referencias z Cuando C d se crea un objeto bj t de d una clase, l el programador se queda con una referencia para poder d llegar ll a ese objeto bj t Circulo c1= new Circulo(1.0); c1 Circulo c2= new Circulo(3.5); c2 Circulo 1.0 dameRadio area circunferencia escala Circulo 3.5 dameRadio area circunferencia escala 12 Acceso z A los l componentes t de d un objeto bj t se accede d referenciaDelObjeto c1.dameRadio(); c2.dameRadio(); c1.area(); c2.area(); c1.escala(2.0); c1.area(); . nombreDelComponente → 1.0 → 3.5 → 3.1416 → 38.4846 → 12.5664 13 Referencias compartidas z Un U objeto bj t puede d tener t varias i referencias f i alias Circulo c1= new Circulo(1.0); Ci l c2= Circulo 2 c1; 1 c11 c2 Circulo 1.0 dameRadio area circunferencia i f i escala c1.area(); c2.area(); // 3.1416 // 3.1416 c1.escala(2.0); c2.area(); // 12.5664 14 null z cuando d una referencia f i no se refiere fi a ningún i ú objeto (por ejemplo, antes de crearlo) se dice que apunta a null ll Circulo c1; c1.area(); // error c1= new Circulo(1.0); c1.area(); // 3.1416 c1= null; c1.area(); // error 15 Adiós z Cuando C d un objeto bj t se queda d sin i referencias f i 1. no es accesible por el programa 2. el sistema se reserva el derecho de reciclarlo Circulo c1= new Circulo(1.0); c1= null; Circulo c1= new Circulo(1.0); Circulo c2= c1;; // reciclable c1= null; // aún queda c2 c2= null; // reciclable 16 Comparación z Se S comparan referencias f i cierto si ambas referencian el mismo objeto z No se comparan los objetos falso, incluso si son dos objetos iguales en todos Circulo c1= new Circulo(1.0); Circulo(1 0); Circulo c2= c1; Circulo c1= new Circulo(1.0); Circulo(1 0); Circulo c2= new Circulo(1.0); c1 1 == c22 // true c1.escala(2.0); c1 == c2 // true c1 1 == c22 // false f l 17 Composición z Un U objeto bj t puede d ser parte t integrante i t t d de otros t z Ejemplo: un rectángulo esta compuesto por 4 puntos p1 p2 p3 p4 18 Composición Punto x: double y: double d bl Punto: distancia: double Rectangulo R l p1: Punto p2: Punto p3: Punto pp4: Punto Rectangulo: R t Rectangulo: l area: double 19 Composición class Punto { double x, y; Punto (double _x, double _y) { x= _x; y= _y; } class Rectangulo { Punto p1, p2, p3, p4; Rectangulo (Punto _p1, Punto _p2, Punto _p3, Punto _p4) { p1= _p1; p2= _p2; p3= _p3; p3 p3; p4 p4= _p4; p4; } void desplaza (double deltaX, double deltaY) { x= x + deltaX; y= y + deltaY; } Rectangulo (double base, double altura) { p1= new Punto(0.0, altura); p2= new Punto(base, altura); p3= new Punto(0.0, 0.0); p4= new Punto(base, 0.0); p4 } double distancia (Punto Q) { ... } } double area () { ... } } 20 ¿Cuándo creamos clases? z Cuando C d encontremos t un concepto t nuevo del problema a solucionar de la solución ó al problema z Con objetos la programación se vuelve parsimoniosa e incluso algo contemplativa: vamos definiendo objetos interesantes, el programa queda muy clarito y comprensible y “funciona solo” porque cada objeto “sabe” lo que tiene que hacer 21 Tipos Enumerados z Un enumerated type es un tipo de dato que contiene un conjunto de valores constantes z JDK 5 permite definir tipos de datos enumerados C Características t í ti avanzadas d incluyen i l la l capacidad id d de d agregar los l métodos y campos a los enums. z Enums son Comparable y Serializables. Las constantes de Enum deberían ser nombradas de manera similar que las constantes. constantes Enums son básicamente un nuevo tipo de Clase. Hasta el momento no he usado Enums en mi código, es que todavía no pienso cómo debería usarlo z ¿Cuando debería usar Enums? Tipos de enumerados naturales: días de la semana, fases de la luna, e t ione estaciones. Otros conjuntos donde sepamos todos los valores posibles: opciones de un menú, etc. 22 Enumerados Básicos z Uso básico: El enumerado Coin public enum Coin {penny, nickel, dime, quarter} Uso: public class PruebaCoin2 { } public static void main (String [] args){ Coin2 moneda = Coin2.penny; System.out.print ("La ( La Moneda: Moneda:" + moneda); } 23 Enumerados: Uso z Ficheros diferentes Coin2.java public enum Coin2 { penny, nickel, dime, quarter} PruebaCoin2.java public class PruebaCoin2 { public static void main (String [] args){ Coin2 moneda = Coin2.penny; System.out.print ("La Moneda:" + moneda); } } z En el mismo fichero PruebaCoin3.java enum Coin {penny, nickel, dime, quarter} public class PruebaCoin3 { public static void main (String [] args){ Coin moneda = Coin.penny; System.out.print ("La Moneda:" + moneda); } } 24 Enumerados: Ejecución z public static void main (String [] args) {…} { } Método para comenzar la ejecución Nombre main Delante { { { Public: P bli se puede d utilizar ili desde d d cualquier l i sitio ii Static: no necesita crear ningún objeto Void: no devuelve nada { { { Se le pasan los argumentos en forma de Matriz de una dimensión conteniendo listas de Caracteres y se llaman args – el nombre puede cambiar ( String [] args) z Ficheros diferentes Coin2.java PruebaCoin2.java Javac Coin2.java Javac PruebaCoin2.java Aparecen Coin.class Coin class PruebaCoin2.class PruebaCoin2 class Java PruebaCoin2 z En el mismo fichero PruebaCoin3.java Javac PruebaCoin3.java Aparecen Con.class PruebaCoin3.class Java PruebaCoin3 25 Enumerados Ampliados z Uso básico: El enumerado Coin, Coin con un campo que representa el valor de la moneda en céntimos public enum Coin { penny (1), nickel (5), dime (10), quarter (25); Coin (int value) { this.value = value; } private final int value; } public int value (){ return value;} Uso C Coin Moneda d = new Coin C (10) ( 0) 26 Clases predefinidas z Incluidas en el SDK de Java. Java Documentación: http://java.sun.com/j2se/1.5.0/docs/index.html p //j /j / / / Descargable de: http://java.sun.com/javase/downloads/ Como J2SE 5.0 Documentation z Analizaremos a modo de ejemplo: j p java.lang.Math { biblioteca de funciones matemáticas java.lang.String l { biblioteca de funciones para tratar cadenas de texto 27 Math class Punto { // teorema de Pitágoras double distancia (Punto Q) { double m= Q.x; double n= Q.y; return Math.sqrt( q Math.pow(m-x, 2) + Math.pow(n-y, 2) ); } } <Q.x, Qy> <x, y> 28 Math class l EcuacionGrado2 i G d 2{ double a, b, c; double discriminante; EcuacionGrado2 (double _a, double _b, double _c) c) { a= _a; b= _b; cc= _c; c; discriminante= b*b - 4*a*c; } bboolean l raicesReales i l () { return discriminante >= 0; } boolean raicesImaginarias () { return discriminante < 0; } double raiz1 () { return (-b + Math.sqrt(discriminante)) Math sqrt(discriminante)) / (2 (2*a); a); } double raiz2 () { return (-b - Math.sqrt(discriminante)) / (2*a); } } 29 String z Cadena C d de d caracteres t de cualquier longitud tiene su sintaxis propia { “una cadena normal” { “Jose Canas (alias \”pepon\”)” { “Jos\u00e9 Ca\u00f1as (alias \042pep\u00f3n\042)” caracteres especiales { \n \r \t \” \\ { \ooo octal { \uxxxx hexadecimal (unicode - iso10646) 30 String z Operaciones O i concatenación: +, += saludo.equals(nombre) o saludo.compareTo(mensaje) saludo.length() l d l th() saludo.charAt(indice) crear cadena d desde d d tipo ti primitivo i iti toString(); t St i () imprimir en pantalla: System.out.println(saludo) 31 String String pedro= "Lopez Lopez, Pedro"; Pedro ; String perico= "Lopez, Pedro"; String manolo= "Pi, Manuel"; System.out.println(pedro); System.out.println(perico); y p (p + " [p [perico]"); ] ); System.out.println(perico System.out.println(manolo); System.out.println(manolo.substring(0, 2)); // Pi System.out.println(manolo.length()); // 10 System.out.println(pedro.equals(perico)); System.out.println(pedro.equals(manolo)); // true // false System.out.println(pedro.compareTo(perico)); System.out.println(pedro.compareTo(manolo)); // 0 // < 0 32 Ejercicios z Ejercicio n.11 Temas:2 L Dificultad:2 Escriba un programa que muestre el mensaje "Hola Mundo" por pantalla.¿Cuántas clases necesitará definir p para conseguir g la funcionalidad deseada? ¿Cuántos métodos habrá que q definir como mínimo? í z Ejercicio n.16 Temas:2 3 Dificultad:5 Escriba un programa que reciba como argumento el radio de una circunferencia y calcule (y muestre por pantalla) la longitud de la circunferencia y el área del círculo delimitado por la misma. Utilice 3.141592 como valor de la constante PI. z Ejercicios complementarios Método distancia de la clase punto Métodos Mét d perimetro i t y area de d la l clase l R t Rectangulo l Definir el Rectangulo como p3, base y latura 33