Introducción a la Programación en Java Clases, Métodos y Atributos Ángel Lucas González Martínez Jaime Ramírez DLSIIS. Facultad de Informática Universidad Politécnica de Madrid Clase • 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, una variable de tipo clase 1 Declaración de una Clase [modif_clase] class nombre_clase [extends nombre_clase] [implements nombre_interfaz{, nombre_interfaz}] { {[modif_atributos] tipo id_atributo [= valor_inicial];} {[modif_métodos] tipo_retorno id_método ([list_parám]) {cuerpo_método}} } modifi_clase = abstract | public | final modif_atributos = private | public | protected | final | static modif_métodos = abstract | private | public | protected | final | static Declaración de una Clase • Recomendación metodológica: • Los atributos deben ser privados • Las métodos: – Privado: si se utiliza como función aux – Público: si va a ser utilizada fuera de la clase • Cuando se expliquen los paquetes, se distinguirán más niveles de acceso 2 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 (); // declaración 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*. 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 ....... } //Eliminación de una referencia obj= null; // Eliminación de la última referencia obj • Entra en juego el GC 3 Modificadores de una clase • Los modificadores de una clase son: – abstract: La clase no está completa y no se pueden crear instancia – final: No puede ser extendida – public: Pública – nada (friendly): Sólo se puede utilizar dentro del paquete en que se define (crear instancias o uso de métodos de clase) • Herencia y especializaciones: extends e implements Modificadores de atributos y métodos • De acceso para Atributos y Métodos: – private: Nadie puede acceder al método o atributo – nada (friendly): sólo es visible dentro del paquete que incluye la clase que lo definió – protected: es friendly, y además es visible para todas las subclases de la clase que lo definió – public: es visible para todos – static: define atributo o método de clase – final: en atributos junto con static define una constante. En métodos indica que no puede ser sobre escrito • Sólo para métodos: abstract y la clase ha sido declarada como abstract 4 Recomendaciones sobre control de acceso • Los atributos deben ser siempre privados • Los métodos deben ser: – “friendly”: si se desea que sólo sean utilizados dentro del paquete (no suele ser muy recomendable) – protected: si se desea permitir que posibles subclases definidas en otros paquetes tengan acceso – public: si se desea permitir el acceso a ellos desde cualquier parte del programa Ejemplo de clase public class Empleado { private String nombre; private double sueldo; public String getNombre() { return nombre; } public void setNombre(String nombre1) { nombre = nombre1; } public double getSueldo() { return sueldo; } public void setSueldo(double sueldo1) { sueldo = sueldo1; } } 5 Ejemplo de clase import Empleado; public class TestEjemplo { 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()); } } 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 6 Constructor • El constructor se ejecuta al crear el objeto con el new • 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 Ejemplo de constructores public class Date { private int day, month, year; public Date(String date) { String [] partes = date.split("/"); day = Integer.parseInt(partes[0]); month = Integer.parseInt(partes[1]); year = Integer.parseInt(partes[2]); } public Date(int d, int m, int y) { day=d; month=m; year=y; } public String toString() { return day + "/" + month + "/" + year; } } 7 Ejemplo de constructores import Date; public class TestDate { public static void main(String[] args) { Date ob1, ob2; ob1 = new Date(4, 11, 1996); ob2 = new Date(“22/10/2001"); System.out.println("La primera fecha es " + ob1); System.out.print("La segunda fecha es " + ob2); } } Garbage Collection (GC) • Recoge la memoria que no es accesible (basura) • Es activado de forma automática por la JVM • Se puede “sugerir” su ejecución por medio de System.gc() • La invocación manual se ha de realizar con cuidado • GC sólo se encarga de recuperar memoria 8 Destructor • • • • • Java no proporciona un destructor al uso El método finalize () es llamado por el GC Libera la memoria que ocupa el objeto Debe usarse sólo para liberar memoria No se debe utilizar para realizar tareas correspondientes a un destructor: – – – – Liberar recursos hardware Conexiones vía sockets Cerrar ficheros Etc. • Definir métodos para la “desinicialización” Puntero this • Todo método de instancia lleva un parámetro implícito • Este parámetro 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 Date { ..... public Date(int day, int month, int year) { this.day=day; this.month=month; this.year=year; } } 9 Paquetes • Permite agrupar en una misma librería varias clases e interfaces • Un paquete crea un espacio de nombres ⇒ – Dos clases pertenecientes a distintos paquetes se pueden llamar igual • Un paquete puede contener otros paquetes • Si no se especifica nada la clase pertenece al paquete por defecto Cómo crear un paquete • Al comienzo de todos los ficheros pertenecientes a un mismo paquete ‘a’: package a; • Todos los .java perteneciente a un paquete debería colgar del mismo directorio • Si el paquete ‘a’ está dentro del paquete ‘b’, y éste a su vez está dentro de ‘c’, entonces: package c.b.a; 10 Cómo crear un paquete • En un mismo fichero se pueden definir varias clases y/o interfaces, sólo una puede ser pública • Todos los ficheros del paquete ‘a’ deben: – o estar localizados en un directorio llamado A que cuelgue de un directorio incluido en la variable CLASSPATH (por ejemplo: c/b/a) – o estar incluidos en un file .jar, y el path del fichero debe estar incluido en la variable CLASSPATH Cómo usar un paquete • Escribiendo la referencia completa al elemento: nombre_paquete.nombre_elem • Importando: – el paquete entero: import nombre_paquete.*; – o sólo el elemento a ser utilizado: import nombre_paquete.nombre_elem; 11 Igualdad y Asignación • Una variable declarada como de una cierta clase es una referencia o “alias” de un objeto NombreClase obj= new NombreClase (); { NombreClase obj2= obj; // declaración ....... } //Eliminación de una referencia obj= null; // Eliminación de la última referencia obj obj obj2 Instancia NombreClase Igualdad y Asignación public static void main(String[] args) { Date ob1, ob2, ob3; ob1 = new Date(12, 4, 96); ob2 = ob1; // ambos se refieren al mismo objeto Date System.out.println("La primera fecha es " + ob1); System.out.println("La segunda fecha es " + ob2); ob1.setDia(10); // cambio el día por medio de ob1 if (ob1==ob2) // pero siguen siendo iguales System.out.println(“Son iguales”); else System.out.println(“Son distintos”); ob3 = new Date(10, 4, 96); if (ob1==ob3) // son distintos!? System.out.println(“Son iguales”); else System.out.println(“Son distintos”); } 12 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 Date. • Esta solución es la que se ha adoptado en la API (véase la clase String) Ejemplo con equals public boolean equals (Object o) { return (day==((Date) o).day) && (month==((Date) o).month) && (year==((Date) o).year); } public static void main(String[] args) { Date ob1, ob2; ob1 = new Date(12, 4, 96); ob2 = new Date("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)); } 13 Paso de parámetros a funciones • El paso de parámetros en Java no es por referencia, sino por valor ⇒ – Los cambios en los parámetros se pierden al terminar la función. static void intercambiar (Date d1, Date d2) { Date aux = d1; d1 = d2; d2 = aux; } static void intercambiar (Date d1, Date d2) { "intercambiar d1.day y d2.day" "intercambiar d1.month y d2.month" "intercambiar d1.year y d2.year" } Ejercicios • Hacer una clase Menu que reciba un conjunto de cadenas de caracteres, el tipo de numeración que se desea: usando letras (a-z) o números (1-n) • Definir una clase agenda y un programa de prueba que utilice la clase Menu. Debe permitirse insertar, borrar, buscar y Listar. Cada entrada de la agenda contendrá: – Datos personales – Datos de contacto 14