Download Clase - Thrive
Document related concepts
no text concepts found
Transcript
CLASES, OBJETOS E INSTANCIAS Ángel Lucas González Martínez Jaime Ramírez Guillermo Román DLSIIS. Facultad de Informática Universidad Politécnica de Madrid 48 ¿Qué es un objeto? Un objeto representa una entidad, ya sea física o conceptual, relevante para comprender el dominio del problema o para formular la solución. – Entidad física: coche, persona,.. – Entidad conceptual: buffer, árbol binario,… 49 Los objetos son abstracciones • Toda abstracción es una simplificación que representa ciertas características relevantes y olvida otras. • Dependiendo del observador de un coche: – un vendedor: modelo, precio, color . . . – un mecánico: tipo de motor, transmisión, suspensión . . – un ingeniero: ... 50 Características de los objetos • Estado: – Viene determinado por los valores de sus atributos. • Comportamiento: – Define cómo reacciona un objeto a peticiones de otros objetos. – Viene dado como una serie de servicios que el objeto proporciona a otros. 51 ¿Cómo se define un objeto? • Una clase es una plantilla para la creación de objetos que comparten características comunes: – Su estado está determinado por los mismos atributos. – Saben realizar las mismas operaciones (también llamados métodos). • Un objeto es una instancia de una clase • Las clases deberán incluir al menos un método constructor (casi todos los lenguajes incorporan uno por defecto). 52 Las clases y los objetos están en todas partes Vehículo Platero:Animal Animal Punto Figura (1,3) (2,2) (2,1) (5,2.5) 53 Métodos y Mensajes • Métodos: definen el comportamiento de un objeto. Punto Estado x,y: float trasladar(a,b) distancia(pto) Comportamiento • Invocación de métodos: paso de mensajes. trasladar(1,-1) P1:Punto X=2 Y=2 Cambia su estado P1:Punto X=3 Y=1 54 Las Clases en Java • Las clases son el elemento fundamental de los programas en Java • Todo programa consta de al menos una clase • Recordemos: – Clase: Tipo de datos, compuesto de atributos y métodos, que representa a una entidad o elemento de la realidad – Instancia u objeto: Es un individuo particular de una clase, es decir, y se referencia por medio de una variable de tipo clase 55 Ocultación de Información • No siempre nos interesa que todos los componentes (atributos o métodos) sean accesibles desde fuera de la clase – Reducimos acoplamiento – Facilitamos las pruebas de la clase – Únicamente publicamos los servicios que nos interesan o que queremos proporcionar • Los lenguajes de programación proporcionan mecanismos para evitarlo 56 Ocultación de Información • Modificadores para atributos o métodos – public: Desde cualquier clase – private: Sólo desde nuestra clase – Java tiene otros modificadores que se verán más adelante • Otros modificadores – Final: Para crear constantes 57 ¿Cómo decidir que modificador usar? • Modificadores para métodos: – private: si se utiliza como función auxiliar – public: si va a ser utilizada fuera de la clase • Los atributos deben ser privados – Si es necesario acceder al atributo • Método getAtributo () • Método setAtributo (valor) 58 Definición de una clase en Java [modificadoresClase] class NombreClase { [modificadores] Tipo nombreAtributo ............. [modificadores] TipoResultado nombreMétodo(tipo1 arg1,..., tipoN argN) { “implementación del método o cuerpo”} } modificadorClase = abstract | public | final modificador = private | public | protected | final | static 59 Ejemplo de clase public class Empleado { Método de instancia private String nombre; observador private double sueldo; public String getNombre() { return nombre; } Método de instancia public double getSueldo() { return sueldo; selector } public void setNombre(String nombre1) { nombre = nombre1; } public void setSueldo(double sueldo1) { sueldo = sueldo1; } } 60 Ejemplo de clase public class TestEjemplo { Creación de una instancia usando el constructor por defecto public static void main(String[] args) { Empleado emp1; emp1 = new Empleado(); emp1.setNombre("Pepe"); emp1.setSueldo(1000); System.out.print("El sueldo de " + emp1.getNombre() + " es " + emp1.getSueldo()); } } 61 Constructor • • • • • Método especial Permite inicializar un objeto al crearlo Mismo nombre que la clase No puede devolver valor o dato Si no se define, java proporciona uno por defecto que asigna a cada atributo de instancia su valor por defecto: 0, false, 0l, 0.0f, null,’\0’ – No se inicializan las variables locales de un método 62 Constructor • El constructor se ejecuta al crear el objeto con el new • Al llamar a new se asigna memoria al objeto • El constructor puede tener parámetros • Los parámetros se utilizan para inicializar los atributos • Los parámetros se pasan al invocar a new • Para notificar problemas al inicializar se utilizan excepciones (se verán más adelante) 63 Ejemplo 1 de constructores public class Fecha { private int day, month, year; Sobrecarga public Fecha(String date) { String [] partes = date.split("/"); constructor day = Integer.parseInt(partes[0]); month = Integer.parseInt(partes[1]); year = Integer.parseInt(partes[2]); } public Fecha(int dia, int mes, int anio) { day=dia; month=mes; year=anio; } public String toString() { return day + "/" + month + "/" + year; } } del 64 Ejemplo 1 de constructores public class TestFecha { public static void main(String[] args) { Fecha ob1, ob2; ob1 = new Fecha(4, 11, 1996); ob2 = new Fecha("22/10/2001"); System.out.println("La primera fecha es " + ob1); System.out.print("La segunda fecha es " + ob2); } } 65 Ejemplo 2 de constructores public class Fecha { private int dia, anio; private TMes mes; public Fecha (int dia, int mes, int anio) throws FechaIncorrecta{ this.dia=dia; this.anio=anio; if (mes>0 && mes<= 12) this.mes=TMes.values()[mes-1]; else throw new FechaIncorrecta (); if (! esValida ()) throw new FechaIncorrecta ();} public Fecha (int dia, TMes mes, int anio) throws FechaIncorrecta { this.dia=dia; this.mes=mes;this.anio=anio; if (! esValida ())throw new FechaIncorrecta ();} 66 Ejemplo 2 de constructores import Fecha.Fecha; import Fecha.FechaIncorrecta; public class TestFecha { public static void main(String[] args) { Fecha ob1, ob2; try { ob1 = new Fecha(4, 11, 1996); ob2 = new Fecha(22,Fecha.TMes.OCTUBRE, 2001); System.out.println("La primera fecha es " + ob1); System.out.print("La segunda fecha es " + ob2); } catch (FechaIncorrecta e) { e.printStackTrace(); } }} 67 Atributos de Clase • Se definen anteponiendo la palabra clave static. • Todos los objetos comparten el mismo valor en ese atributo. • No existe una copia de ese atributo para cada instancia de la clase u objeto. • USO: cuando todos los objetos de una misma clase comparten unos mismos datos. – Se pueden utilizar para definir constantes (final) (véase las constantes PI y E de la clase Math) – Para datos comunes a todos los elementos de una clase 68 Métodos de Clase • Se antepone static a la definición del método • Se llaman sin necesidad de que ya haya sido creado una instancia u objeto de la clase: NombreClase.nombreMetodo(...); • Sólo pueden acceder a atributos de clase, y a métodos de clase. • USO: – Inicialización, modificación y consulta de atributos de clase. – Métodos que no necesitan atributos del objeto actual: parseInt(), parseDouble(), etc. 69 Atributos y Métodos de Clase public class CuentaCorriente { /** * Los intereses son comunes para todas las cuentas * abiertas en el banco */ Permite private static double interes = 0.5; resolver private double saldo; la ambigüedad public CuentaCorriente (double saldoInicial){ saldo=saldoInicial; } public void setSaldo (double saldo){ this.saldo=saldo; } public static void setInteres (double interes){ CuentaCorriente.interes=interes; } public String toString(){ return interes + " " + saldo; }} 70 Atributos y Métodos de Clase public class TestCuentaCorriente { public static void main(String[] args) { CuentaCorriente cuenta1, cuenta2; cuenta1 = new CuentaCorriente(23); cuenta2 = new CuentaCorriente(40); System.out.println(cuenta1); //La forma correcta es CuentaCorriente.setInteres(1.5) cuenta2.setInteres(1.5); System.out.println(cuenta2); System.out.println(cuenta1); // el interés de cuenta1 es //el de cuenta2 y cuando se cambia en uno se cambia en los //dos //Cambiamos el interés a todas las cuentas usando el nombre //de la clase CuentaCorriente.setInteres(0.75); System.out.println(cuenta2); System.out.println(cuenta1); } } 71 Memoria • Clasificaciones diferentes de la memoria: – Memoria estática vs dinámica – Memoria automática vs no automática Tipo Estática Dinámica Automático Variables Globales Parámetros Formales Variables Locales No automático ------Punteros – Tendencias: + Complejidad - Compilador Programación • Todo automático: Programación funcional, lógica, • No automática: – Administrada: Solicitud de memoria por el programador y recolector de memoria no usada (Java, .Net) → GC – No administrada: C, C++, Ada, … 73 Puntero • Las máquinas tienen la memoria dividida en celdas, cada celda tiene una dirección y un contenido. • El contenido dependerá del programa: – – – – Datos de tipo entero Datos de tipo booleano Datos de tipo array Código de programa • Clave: incluso el contenido de una celda puede ser una dirección de memoria → Puntero • En java todas las variables de tipo clase (instancias) son en realidad punteros (referencias a objetos) 74 Ciclo de vida de un objeto • Supuesta la definición de la clase NombreClase 1. Declaración de un objeto NombreClase obj; // declaración 2. Creación de una instancia obj=new NombreClase ();//creación e inicialización. //obj es una referencia o puntero //Memoria no automática 3. Utilización de la instancia obj.función(....); // invocación de un método a = obj.atributo; // acceso a un atributo //función y atributo tienen que ser accesibles por quien lo utiliza*. 78 Ciclo de vida de un objeto 4. Destrucción del objeto o instancia • • Automática El objeto ya no es referenciado por nadie: • • A null todas las referencias del objeto Se sale del ámbito NombreClase obj= new NombreClase (); { NombreClase obj2= obj; // declaración y creación de una referencia ....... } //Eliminación de la referencia obj2 obj= null; // Eliminación de la última referencia obj • Entra en juego el Garbage Collector (GC) 79 Garbage Collector (GC) • Recoge la memoria que no es accesible (basura o memory leaks) • Es activado de forma automática por la JVM • Se puede “sugerir” su ejecución por medio de System.gc() 80 Puntero this • Todo método de instancia lleva un parámetro implícito • Este parámetro es una referencia al objeto sobre el que se hace la llamada • Esta referencia se llama this • Se puede usar para evitar colisiones de identificadores dentro de un método public class Fecha{ ..... public Fecha(int dia, int mes, int anio) { this.dia=dia; this.mes=mes; this.anio=anio; }} • Y para pasar como parámetro el objeto actual, como en el siguiente ejemplo.... 81 Puntero this public static void main(String[] args){ Aeropuerto aeropuerto; Avion avion; avion = new Avion(); aeropuerto = new Aeropuerto("barajas"); avion.setDestino(aeropuerto); // this == avion avion.aterriza(); // this == avion } 82 Puntero this class Avion{ private Aeropuerto destino; private Aeropuerto origen; public void setDestino (Aeropuerto destino) { this.destino=destino; } public void aterriza () { Pista pista; pista = this.destino.darPista(this); ………… } } 83 Puntero this class Aeropuerto { private Pista pista; public Pista darPista(Avion avion) { if (puedeAterrizar(avion)) { return pista; } else return null; } } 84 Puntero this class Ventana { private Ventana ventanaPadre; public Ventana (Ventana ventanaPadre) { this.ventanaPadre = ventanaPadre; } public void solicitarInformacion () { Ventana ventanaInfo = new Ventana (this); ventanaInfo.hacerVisible (); } } 85 Pasos de parámetros • Paso por valor – Se copia el contenido de la variable – Se tienen 2 valores duplicados e independientes – Los cambios en uno no afectan al otro • Paso por referencia – Se pasa la dirección de memoria (referencia) del dato – Se tiene un único valor referenciado – Cualquier acción implica cambio en los 2 valores (el que está fuera y el que está dentro del método) 86 Paso de parámetros en Java • El paso de parámetros en Java es por valor – Se hace una copia del parámetro en el contexto del método • OJO: También lo podemos entender como que es por referencia – En Java los identificadores de objetos realmente contienen punteros a objetos – Los cambios en los objetos afectan a todas sus referencias – Los cambios en las referencias dentro de un método se pierden 87 Paso de parámetros a métodos static void intercambiar (Fecha d1, Fecha d2) { Fecha aux = d1; d1 = d2; d2 = aux; } Intercambia referencias Método de clase static void intercambiar (Fecha d1, Fecha d2) { "intercambiar d1.day y d2.day" "intercambiar d1.month y d2.month" "intercambiar d1.year y d2.year" } 88 Igualdad y Asignación • Distinguir asignación e igualdad entre tipos básicos y entre instancias de clase • Una variable declarada como de una cierta clase es una referencia o “alias” de un objeto – Utilizando el operador de asignación varias variables pueden referirse al mismo objeto. 89 Igualdad y Asignación public static void main(String[] args) { Fecha ob1, ob2, ob3; ob1 = new Fecha (12, 4, 1996); // ambos se refieren al mismo objeto Fecha ob2 = ob1; System.out.println("La primera fecha es " + ob1); System.out.println("La segunda fecha es " + ob2); // cambio el día por medio de ob1 ob1.setDia(10); if (ob1==ob2) // pero siguen siendo iguales System.out.println(“Son iguales”); else System.out.println(“Son distintos”); ob3 = new Fecha(10, 4, 96); if (ob1==ob3) // son distintos!? System.out.println(“Son iguales”); else System.out.println(“Son distintos”); } ob1 ob2 12/4/1996 10/4/1996 ob3 10/4/1996 90 Igualdad y Asignación • ¿Por qué ob1 y ob3 son distintos? • El operador de igualdad comprueba si ambas referencias son dos “alias” del mismo objeto, • ob1 y ob3 son dos objetos con el mismo contenido, pero “alias” o referencias a instancias distintas • ¿Cómo podemos comparar dos objetos de modo que el resultado sea cierto si ambos objetos tienen el mismo contenido? • Solución: definir un método equals() en la clase Fecha. • Esta solución es la que se ha adoptado en la API (véase la clase String) 91 Ejemplo con equals public boolean equals (Object o) {// método //implementado dentro de la clase Fecha return (day==((Fecha) o).day) && (month==((Fecha) o).month) && (year==((Fecha) o).year); } //Programa principal en un fichero .java distinto de //Fecha.java public static void main(String[] args) { Fecha ob1, ob2; ob1 = new Fecha(12, 4, 96); ob2 = new Fecha("12/4/96"); System.out.println("La primera fecha es " + ob1); System.out.println("La segunda fecha es " + ob2); System.out.println(ob1 == ob2); System.out.println(ob1.equals(ob2)); } 92 La clase String • Define un array de caracteres • Literales entre comillas dobles (“) • Para saber el número de caracteres se ha de usar el método length() • Una vez creado no se puede cambiar el valor de su contenido • StringBuffer define Strings que pueden ser modificados 93 La clase String • char charAt (int pos) • int compareTo (String con): "hola".compareTo(nombre) – Resultado cero son iguales – Resultado negativo si “con” es mayor – Resultado positivo si “con” en menor • • • • • int compareToIgnoreCase (String con) boolean equals (String compara) boolean equalsIgnoreCase (String compara) String pruebas=String.valueOf(15); int length() static String valueOf (<tipo básico> valor) 94 Clases Asociadas a los Tipos Básicos • Java proporciona clases envoltorio para los tipos básicos • Necesarias para las contenedoras y plantillas • Java 5 conversión automática: Tipo Básico ↔ Clase • Proporciona conversión String ↔ Tipo: – valueOf(String) -> Tipo – toString(Tipo) -> String Clase Tipo básico Boolean Byte Character Double Float Integer Long Short boolean byte char double float int long short 95 Arrays de objetos public static void main(String[] args) { Fecha [] fechas; // declaración del array fechas = new Fecha[3]; fechas[0]=new Fecha(1,1,06); fechas[1]=new Fecha(2,1,06); fechas[2]=new Fecha(3,1,06); Se crea espacio para tres referencias a Fecha Se crea la primera instancia y es referenciada por fechas[0] for (int i=0; i<fechas.length; i++) System.out.println(fechas[i]); } 96 Ejercicio Concesionario • • • • Crear una clase Persona – Con nombre, apellidos y DNI – Métodos de acceso al estado del objeto Crear una clase coche – Con marca, modelo, matrícula y propietario – Crear matrículas de forma consecutiva y sin que se repita – Un coche puede ser comprado por una persona que pasa a ser su propietario y a crearse una matrícula Crear una fábrica de coches para una marca y un modelo – Se solicitará el número de coches que el cliente quiera Crear un concesionario – Que dispone de una lista de coches y de una fábrica – Irá vendiendo coches según llegan compradores • Cuando se quede sin coches solicitará más coches a la fábrica 97 Ejercicio Agenda • • Dada la clase EntradaAgenda – Con nombre, apellido1, apellido2, telefono, email – Añadir un método equals() que devuelva cierto si coinciden el nombre y los apellidos, y falso en caso contrario. Crear una clase Agenda – Con una secuencia de entradas (contactos) – Un constructor que crea un vector vacío con el tamaño dado (tamaño max de la agenda) – Permite insertar un nuevo contacto si la agenda no está llena y no existe otro contacto con el mismo nombre y apellidos. – Permite buscar un contacto dados su nombre y apellidos, y devuelve su email y su tlfo. – Permite borrar un contacto dados su nombre y apellidos. – Devuelve un vector de Strings con los nombres y los apellidos de todos los contactos de la agenda. 98