www.fdi.ucm.es/profesor/balta Java Clases y objetos BFM 2 Clases La unidad fundamental de programacin en Java es la clase Un programa Java est formado por un conjunto de clases Una clase es una plantilla que describe un conjunto de objetos con atributos y comportamiento similares Un programa Java en ejecucin crea y manipula (mediante llamadas a mtodos) objetos concretos (ejemplares o instancias) Cada objeto es un ejemplar de una clase Cuando se invoca un mtodo de un objeto, se mira en el cdigo de su clase las acciones a ejecutar Un objeto puede usar otros para realizar su trabajo Java Clases y objetos BFM 3 Clases Una definicin de clase comprende: Cabecera Campos o atributos: Variables Constantes Mtodos: Funciones Constructores Bloques de inicializacin static Finalizador estado del objeto comportamiento Java Clases y objetos BFM 4 Definicin de una clase [Modificadores] class NombreClase [extends SuperClase] { // definicin de los atributos de la clase tipo1 identificador1; tipo2 identificador2; .. // definicin de los mtodos de la clase tipoDevuelto nombreMetodo1 (listaParametros) { //instrucciones del mtodo1 } tipoDevuelto nombreMetodo2 (listaParametros) { //instrucciones del mtodo2 } .. } Java Clases y objetos BFM 5 Modificadores de clase Modificadores: public class NombreClase // visible fuera del paquete Normalmente la clase se almacena en un fichero NombreClase.java En un fichero .java puede haber como mucho una clase public class C extends superclase // la clase hereda de otra Slo herencia simple (una sla superclase) Si no aparece extends la clase definida hereda (es una subclase) de un objeto general del sistema llamada Object public class Rectangulo{ int x; int y; int ancho; int alto; // faltan los mtodos de Rectngulo } Object Rectangulo Java Clases y objetos BFM 6 int num = 5; Rectangulo rect; num 5 rect null Variables, objetos y referencias Una variable de un determinado tipo simple proporciona Capacidad para almacenar un valor simple Un conjunto predifinido de operadores Un objeto de una determinada clase proporciona Capacidad para almacenar diversos valores (atributos) Define su propio conjunto de mtodos para operar sobre las instancias o ejemplares de esa clase Cuando se declara un objeto de una clase se crea una referencia a una instancia de dicha clase Incialmente toma el valor null porque no existe objeto al que referirse No son punteros con los que se pueda trabajar directamente Java Clases y objetos BFM 7 x y ancho alto Creacin de instancias o ejemplares Operador new Crea una instancia o ejemplar de la clase indicada y devuelve una referencia a dicho objeto Se reserva espacio de memoria para los datos del objeto Un ejemplar es una copia individual de la plantilla de la clase que tiene su propio conjunto de datos int num = 5; // crea una referencia Rectangulo rect; // reserva la memoria rect = new Rectangulo(); Rectangulo otroRect; otroRect = rect; // otroRect se refiere al mismo // rectangulo que rect num 5 rect otroRect Java Clases y objetos BFM 8 Acceso a los atributos de un objeto Desde un objeto se puede acceder a los atributos o miembros con la siguiente sintaxis referenciaObjeto.atributo; public class Rectangulo { int x; int y; int ancho; int alto; //faltan las funciones miembro public static void main(String args[ ]) { Rectangulo rect; rect = new Rectangulo(); rect.x = 5; rect.y = 7; rect.ancho = 4; rect.alto = 3; System.out.println( "x = " + rect.x + y = " + rect.y ); System.out.println( "ancho = " + rect.ancho + alto = " + rect.alto ); } } Java Clases y objetos BFM 9 Declaracin de mtodos Funciones declaradas en la clase y que determinan su comportamiento Sintaxis tipoDevuelto nombreMetodo (listaParametros) { //instrucciones del mtodo } // calcula la superficie y la devuelve como un nmero entero int calcularSuperficie(){ int area; area = ancho * alto; return area; } // muestra los valores por pantalla pero no devuelve nada void mostrarValores(){ System.out.println( "x = " + x + " y = " + y ); System.out.println( "ancho = " + ancho + " alto = " + alto ); } Java Clases y objetos BFM 10 Llamada a los mtodos La invocacin a los mtodos desde una instancia se hace mediante el operador de acceso ( . ) Los argumentos de tipos simples se pasan por valor Los objetos se pasan por referencia public class Rectangulo { int x; .. int calcularSuperficie(){ .... } void mostrarValores(){.} public static void main(String args[ ]) { Rectangulo rect; rect = new Rectangulo(); rect.x = 5; rect.y = 7; rect.ancho = 4; rect.alto = 3; int area = rect.calcularSuperficie(); rect.mostrarValores(); System.out.println( "Superficie: " + area ); System.out.println( "x = " + rect.x + y = " + rect.y ); System.out.println( "ancho = " + rect.ancho + alto = " + rect.alto ); } } referenciaObjeto.nombreMetodo(listaArgumentos); Java Clases y objetos BFM 11 Nueva funcionalidad public class Rectangulo { int x; .. int calcularSuperficie(){ .... } void mostrarValores(){.} void cambiarValores(int posx, int posy, int lar, int anc) { x= posx; y= posy; alto = lar; ancho = anc; } public static void main(String args[ ]) { Rectangulo rect; rect = new Rectangulo(); rect.x = 5; rect.y = 7; rect.ancho = 4; rect.alto = 3; int area = rect.calcularSuperficie(); rect.mostrarValores(); System.out.println( "Superficie: " + area ); rect.cambiarValores(3,5,8,9); rect.mostrarValores(); } Java Clases y objetos BFM 12 Constructores Mtodo que inicializa el objeto en su creacin Se llama automticamente cuando se crea un objeto Su nombre es igual que el de la clase y no tiene tipo de retorno Java proporciona un constructor sin parmetros por defecto que deja de estar disponible cuando se aade algn constructor public class Rectangulo{ int x; .... // constructor public Rectangulo(int x1, int y1, int w, int h){ x=x1; y=y1; ancho=w; alto=h; } ..... public static void main(String args[ ]) { Rectangulo rect; rect = new Rectangulo(5, 7, 4, 3); int area = rect.calcularSuperficie(); rect.mostrarValores(); System.out.println( "Superficie: " + area ); . } } Java Clases y objetos BFM 13 Constructores Pueden sobrecargarse Una clase puede tener ms de un constructor (polimorfismo) Si no se declara ninguno se hereda el de la superclase (o el de Object) Se puede crear un objeto con distintos tipos de parmetros Pueden llamar al constructor del padre super(argumentos); Debe ser la primera instruccin del constructor o a otros constructores de la misma clase this(argumentosPorDefecto); // constructor polimorfico // sin parmetros public Rectangulo() { x=0; y=0; alto=0; ancho=0;} Java Clases y objetos BFM 14 Referencia a objeto this Referencia especial que utilizada dentro de un mtodo de cualquier clase se refiere a la instancia actual Permite parmetros con igual nombre que atributos Posibilita la llamada a otros constructores class Rectangulo{ int x; .... // constructor Rectangulo(int x1, int y1, int w, int h){ x=x1; y=y1; ancho=w; alto=h; } // otro constructor polimorfico Rectangulo(int ancho, int alto){ x=0; y=0; this.ancho= ancho; this.alto= alto; } ..... public static void main(String args[ ]) { Rectangulo rect; rect = new Rectangulo(5, 7, 4, 3); rect.mostrarValores(); Rectangulo nuevo; nuevo = new Rectangulo(6, 9); rect.mostrarValores(); . } } Java Clases y objetos BFM 15 Miembros estticos Slo hay un miembro por clase Se declaran con la palabra clave static Variables, constantes y mtodos nicos y comunes a toda la clase Atributos de clase Hay exactamente una copia (aunque no exista ningn objeto) Se inicializan antes de usarse: Se usan como variables finales para definir constantes de clase public static final int MAXIMO = 12; public class Rectangulo{ int x; .. static int numRect=0; // constructor public Rectangulo(int x1, int y1, int w, int h){ numRect++; x=x1; y=y1; ancho=w; alto=h; } public static void main(String args[ ]) { Rectangulo rect; rect = new Rectangulo(5, 7, 4, 3); rect.mostrarValores(); System.out.println(Num: + Rectangulo.numRect); } Java Clases y objetos BFM 16 Mtodos de clase o estticos Se invocan en nombre de la clase Slo pueden acceder a variables de clase Para realizar funciones de utilidad (que slo actan sobre sus parmetros o que no necesitan parmetros): double numero = Math.sqrt(234.0); public static void main() {/*codigo programa prin. Que debe crearse antes de que exista ningn objeto*/}; Declaracin de mtodo de clase en Rectngulo: public static int obtNumRect() { return this.numRect;} Llamada desde main: int num= Rectangulo.obtNumRect(); Bloques de inicializacin esttica Para inicializar campos estticos u otros estados necesarios cuando es necesario realizar algn tipo de clculo static { for (int i = 0; i < primos.length; i++) primos[i] = i; } Java Clases y objetos BFM 17 Reutilizacin de cdigo Composicin Utilizar objetos como miembros de otros objetos Herencia Especializacin o extensin de una clase para crear otra nueva Java Clases y objetos BFM 18 Composicin: clase Punto public class Punto { int x; int y; public Punto(int x, int y) { this.x = x; this.y = y; } public Punto() { // llamada al otro constructor this(-1, -1); } public void mostrar(){ System.out.println(x = + x + y = + y); } } Java Clases y objetos BFM 19 Composicin: prueba de la clase Punto public class Punto { int x; int y; public Punto(int x, int y) { this.x = x; this.y = y; } public Punto() { // llamada al otro constructor this(-1, -1); } public void mostrar(){ System.out.println(x = + x + y = + y); } public static void main(String args[]) { Punto pun1 = new Punto(); Punto pun2 = new Punto(2,3); System.out.println( "visualizar datos del punto" ); pun1.mostrar(); pun2.mostrar();}} Java Clases y objetos BFM 20 Composicin: clase Crculo public class Circulo { Punto origen; int radio; public Circulo(int x, int y, int radio) { origen = new Punto(x,y); this.radio = radio; } public void mostrar() { origen.mostrar(); System.out.println("radio = " + radio); } public static void main(String args[]) { Circulo cir = new Circulo(5, 5, 9); System.out.println( "visualizar datos del circulo" ); cir.mostrar(); }} Java Clases y objetos BFM 21 La clase genrica Object Todas las clases en Java heredan implcitamente de la clase Object. De esta forma, Object es la raiz de la jerarqua de herencia (de implementacin) en Java. Object define un conjunto de mtodos tiles, que pueden ser redefinidos en cada clase. En particular: public boolean equals(Object o): Permite definir el criterio de igualdad utilizado para los objetos de una determinada clase (el operador == nicamente chequea la igualdad de referencias). En Object, equals se define directamente como la identidad de referencias. public String toString(): Permite decidir la representacin externa de un objeto. Por defecto es el valor de su referencia, etiquetada con el nombre de la clase. Java Clases y objetos BFM 22 Herencia: clase Persona public class Persona { String nombre = ""; int edad; public Persona(String nom, int ed) { nombre = nom; edad = ed; } public void mostrar() { System.out.println("Nombre: "+ nombre); System.out.println("Edad: "+ edad); } public static void main(String args[]) { Persona yo= new Persona("Balta", 99); yo.mostrar(); } } Persona Trabajador Java Clases y objetos BFM 23 Herencia: clase Trabajador public class Trabajador extends Persona { float sueldoHora; int numHoras; public Trabajador(String nom, int ed, float suel, int num) { super(nom, ed); // llamada al constructor de Persona sueldoHora = suel; numHoras = num;} public double sueldo() { return sueldoHora * numHoras; } public static void main(String args[]) { Trabajador yo= new Trabajador("Balta", 99, 200.5f, 45); yo.mostrar(); // se invoca al metodo heredado mostrar double pelas = yo.sueldo(); System.out.println("Cobra: " + pelas); } } Java Clases y objetos BFM 24 Sobrecarga o reescritura de un mtodo y polimorfismo La signatura de un mtodo viene dada por su nombre y el tipo y nmero de los parmetros El tipo devuelto no forma parte de la signatura Cuando se reescribe un mtodo en una clase derivada La signatura debe ser la misma que el mtodo de la clase base El tipo devuelto debe ser el mismo que el del mtodo de la clase base El atributo de acceso del mtodo de la clase derivada tiene que ser igual o mas general que el de la clase base (NO puede ser mas restrictivo) Java Clases y objetos BFM 25 Ejemplo //En Persona redefinimos el mtodo mostrar() public class Trabajador extends Persona { float sueldoHora; int numHoras; public Trabajador(String nom, int ed, float suel, int num) { super(nom, ed); // llamada al constructor de Persona sueldoHora = suel; numHoras = num;} // sobrecarga completa de mostrar // nombre y edad son atributos heredados de Persona public void mostrar() { System.out.println("Nombre: "+ nombre); System.out.println("Edad: "+ edad); System.out.println("Sueldo por hora: "+ sueldoHora); System.out.println("Horas trabajadas: "+ numHoras);}} Java Clases y objetos BFM 26 Sobrecarga de mtodo Sobrecarga parcial ampliando el mtodo heredado El mtodo de la subclase puede llamar al mtodo de la superclase public class Trabajador extends Persona { float sueldoHora; int numHoras; public Trabajador(String nom, int ed, float suel, int num) { super(nom, ed); // llamada al constructor de Persona sueldoHora = suel; numHoras = num;} // sobrecarga parcial de mostrar // nombre y edad son atributos heredados de Persona public void mostrar() { super.mostrar(); // llamada al mtodo de la clase padre System.out.println("Sueldo por hora: "+ sueldoHora); System.out.println("Horas trabajadas: "+ numHoras);} } Java Clases y objetos BFM 27 Vinculacin dinmica El mtodo a ejecutarse se determina en ejecucin en funcin del objeto concreto (no del tipo de la referencia) Una referencia a la superclase puede referir a un objeto de la subclase Los objetos Trabajador son tambin objetos Persona public static void main(String args[]) { Persona per; Trabajador yo= new Trabajador("Balta", 99, 200.5f, 45); per = yo; // Asignacion legal // se ejecuta el mtodo mostrar de Trabajador y no el de Persona per.mostrar(); // per se trata como cualquier Trabajador pelas = per.sueldo(); // Ilegal (sueldo se define en Trabajador) boolean b1, b2; b1 = (per instanceof Persona); // True b2 = (per instanceof Trabajador); // True System.out.println("b1: "+ b1 + " b2: "+ b2); } Persona Trabajador Java Clases y objetos BFM 28 Clases abstractas Clases cuya descripcin es incompleta Se definen utilizando la palabra reservada abstract No proporcionan la implementacin de todos sus mtodos Los mtodos no implementados se declaran como abstract Una clase con un mtodo abstracto debe declararse como clase abstracta Pero una clase puede declararse como abstracta aunque no tenga ningn mtodo abstracto Las subclases de una clase abstracta deben: Sobreescribir todos los mtodos abstractos de la superclase, o bien Ser declaradas como clases abstractas Una clase abstracta no puede instanciarse No se pueden crear objetos de una clase abstracta Java Clases y objetos BFM 29 Ejemplo clase abstracta public abstract class Figura { int x, y; public void mostrarOrigen() { System.out.println("x= "+x+" y= "+y);} public abstract double area(); // No tiene implementacin public abstract double mostrarNombre(); } public class Triangulo extends Figura { protected int base, altura; public Triangulo (int ba, int al) { base=ba; altura=al; } public double area() { return base*altura/2; } public void mostrarNombre() { System.out.println(triangulo); } } public class Cuadrado extends Figura { protected int lado; public Cuadrado (int lado) { this.lado=lado; } public double area() { return lado*lado; } public void mostrarNombre() { System.out.println(cuadrado);}} Figura Triangulo Cuadrado Java Clases y objetos BFM 30 Prueba clase abstracta public class PruebaClaseAbstracta { public static void main(String args[]) { Figura fig; Triangulo tri; Cuadrado cua; fig = new Figura(); // error no se puede instanciar una clase abstracta tri = new Triangulo(4,3); tri.mostrarOrigen(); tri.mostrarNombre(); fig = tri; fig.mostrarNombre(); System.out.println("Area triangulo: "+fig.area()); cua = new Cuadrado(5); fig = cua; System.out.println("Area cuadrado: "+fig.area()); } } Java Clases y objetos BFM 31 protected void finalize() throws Throwable { super.finalize(); // conviene ponerlo siempre if ( archivo != null ) // si el archivo no se ha cerrado { archivo.close(); archivo = null; } } Mtodos finalizadores Java tiene recolector de basura Un objeto se elimina cuando se deja de hacer referencia a l No hay que eliminar los objetos explcitamente Al destruir un objeto se invoca el mtodo finalize Para hacer limpieza de recursos no Java (recursos externos) Por ejemplo: cerrar conexiones, cerrar ficheros, registrar algn tipo de resultado, etc. Al acabar un programa, se ejecuta finalize para todos los objetos Java Clases y objetos BFM 32 Recoleccin automtica de memoria rect otroRect Rectangulo rect = new Rectangulo(); Rectangulo otroRect =new Rectangulo(); // se pierde la referencia al primer rectngulo otroRect = rect; // este primer rectngulo pasa a ser candidato a recoleccin automtica alto x y ancho alto x y ancho rect otroRect alto x y ancho alto x y ancho Memoria que ser recuperada por el recolector automtico Java Clases y objetos BFM 33 Interfaces Slo declaran comportamiento Se utiliza la palabra clave interface Por defecto todos sus mtodos son pblicos y abstractos No implementan el comportamiento Por defecto todos sus atributos son pblicos, constantes y de clase Por legibilidad normalmente los declaramos static y final Permite simular algunos aspectos de la herencia mltiple Define un tipo de datos Posibilita la vinculacin dinmica Otras clases pueden implementar un interfaz Cualquier clase que implemente un interfaz debe definir todos los mtodos de dicho interfaz Debe proporcionar la implementacin de dichos mtodos Si la clase no proporciona la implementacin para todos los mtodos del interfaz debe ser declarada como abstracta Java Clases y objetos BFM 34 Declaracin de interfaces Sintaxis Implementacin del interfaz en una clase Una clase puede implementar varios interfaces interface NombreInterfaz { tipo static final NOMBRECONSTANTE1 = valor; ... public tipoDevuelto nombreMetodo1(listaParmetros); ... } class NombreClase implements NombreInterfaz1 [, NombreInterfaz2 ..] { // declaracin atributos y mtodos de la clase ... } Java Clases y objetos BFM 35 Ejemplo de interfaz interface Nombrable { static final boolean CIERTO = true; public void mostrarNombre(); } public class Elemento implements Nombrable { String nombre; public Elemento(String nom) { nombre = nom; } // obligatorio implementar mtodo mostrarNombre porque se implementa // la interfaz Nombrable public void mostrarNombre(){ System.out.println("Nombre: "+nombre); if (CIERTO) System.out.println("Constante CIERTO del interfaz"); } } Java Clases y objetos BFM 36 Uso del interfaz en vinculacin dinmica public class PruebaInterfaz { public static void main(String args[]) { Elemento elem; Nombrable inter; elem = new Elemento("Balta"); elem.mostrarNombre(); // una referencia a interfaz puede utilizarse con una instancia de // una clase que lo implemente inter = elem; inter.mostrarNombre(); } } Java Clases y objetos BFM 37 Paquetes Los paquetes permiten agrupar una coleccin de clases e interfaces funcionalmente relacionadas asignndole un nombre Todo nombre en Java est dentro de un paquete package nombrePaquete; // fichero como parte de un paquete El paquete default contiene todas las clases no definidas explcitamente en un paquete Definen contextos de denominacin Para evitar colisin de nombres Sirven para definir bibliotecas de clases e interfaces Reutilizacin: no volver a inventar la rueda Permiten organizar el cdigo de una gran aplicacin Un paquete determina un subdirectorio del disco Java Clases y objetos BFM 38 Ejemplo: java.lang.System.out Paquetes Los paquetes pueden anidarse Define una jerarqua: paquete.subpaquete.subpaquete.clase Convencin para el nombrado de paquetes (para conseguir nombres nicos): dominio.empresa.departamento.proyecto Autor del paquete (nombre de dominio Internet al revs) Ejemplo: es.ucm.sip.cursoJava Java Clases y objetos BFM 39 Uso de paquetes Utilizacin de nombres de un paquete: Usando un nombre completo: Usando la clusula import: class ImprimeFecha1 { public static void main () { java.util.Date ahora = new java.util.Date(); System.out.println(ahora); } } import java.util.Date; class ImprimeFecha2 { public static void main () { Date ahora = new Date(); System.out.println(ahora); } } Java Clases y objetos BFM 40 Importacin de clases No es necesario para el paquete java.lang Por defecto: import java.lang.* * permite referirse a todas las clases e interfaces de un paquete import java.*; // ERROR: no vale para paquetes Ejemplo: Para importar la clase Applet: import java.applet.Applet; // directamente la clase import java.applet.*; // todos los nombres del paquete El compilador busca en classes/java/applet/* En los entornos de programacin existen funcionalidades que simplifican la gestin del proyecto. Normalmente se busca dentro de los ficheros de clases del proyecto Java Clases y objetos BFM 41 Control de acceso a miembros de una clase Hay cuatro niveles de proteccin en funcin de los atributos de acceso y de la organizacin en paquetes Publico, paquete, protegido y privado Atributos de acceso Si no se indica nada un miembro es accesible desde todo el paquete private acceso slo dentro de la clase public acceso desde cualquier lugar protected acceso en la clase, las subclases (en cualquier paquete) y desde las clases del mismo paquete Java Clases y objetos BFM 42 // redefinicin de la clase rectngulo con control de acceso public class Rectangulo { private int x; // accesible slo dentro de la clase int y; // accesible dentro del paquete (opcin por defecto) public int ancho; // accesible desde todos los sitios protected int alto; // accesible desde el paquete y desde las subclases private int calcularSuperficie() // accesible slo dentro de la clase { .... } ... } Ejemplo control de acceso El control de acceso se aplica tanto a atributos como a mtodos