Tema 3. Clases en JAVA (i) n Clases n n n n n n n n n Concepto de clase y objeto Variables miembro de objeto y de clase Variables finales Métodos. Paso de argumentos Métodos de clase Control de acceso Métodos sobrecargados Constructores y destructores Packages 1 Tema 3. Clases en JAVA (ii) n Herencia n n n n n Interfaces n n n n Clase Object Redefinición de métodos Constructores Clases y métodos abstractos Definición Herencia Polimorfismo Clases internas n Clases static, clases miembro, clases locales y clases anónimas 2 Concepto de clase n Tipo definido por el usuario que describe los atributos y los métodos de los objetos que se crearán a partir de la misma n n n Los atributos son los datos que definen el estado del objeto Los métodos son las operaciones que definen su comportamiento Definición: [public] class NombreClase { //definición de datos y métodos } * Si no se define public, la clase sólo es visible para las demás clases del package 3 Concepto de objeto n Es un ejemplar concreto de una clase (una instancia) n n n Clases: “tipos de variables” Objetos: “variables concretas” de un tipo determinado Creación objetos: n n n n NombreClase unObjeto; unObjeto = new NombreClase(); NombreClase otroObjeto; otroObjeto = new NombreClase(); 4 Ejemplo (i) class Circulo { public static final double PI = 3.14159265; private double x,y; private double radio; public Circulo(double cx, double cy, double r) { x = cx; y = cy; radio = r; } 5 Ejemplo (ii) public Circulo() { this(0.0,0.0,1.0); } public double perimetro() { return 2.0*PI*radio; } public double area() { return PI*radio*radio; } } 6 Variables miembro de objeto n n Pueden ser de tipos primitivos o referencias a objetos Van precedidas por modificadores de acceso: n n public, private, protected o package Ejemplo: private double x, y; private double radio n Cada objeto posee sus propias variables miembro. Para acceder a ellas se utiliza el operador punto (.) n n Ejemplo: circulo1.radio Se inicializan de forma automática, incluso antes de llamar al constructor 7 Variables miembro de clase n Variables de clase (variables static): son variables propias de la clase y no de cada objeto n n n Es lo más parecido que Java tiene a las variables globales de C/C++ Ejemplo: contador de círculos creados n n n Permiten definir variables que sólo tienen sentido para toda la clase. Definición: static int numCirculos = 0; Uso: Circulo.numCirculos Si no se les da un valor en la declaración, se inicializa con los valores por defecto para los tipos primitivos, y con null si es una referencia 8 Variables finales n No pueden cambiar su valor a lo largo de la ejecución del programa n n Ejemplo: n n public static final double PI = 3.14159265; Es posible separar la definición de la inicialización: n n n Pueden considerarse constantes La inicialización puede hacerse en tiempo de ejecución La variable es constante, pero no tiene por qué tener el mismo valor en todas las ejecuciones del programa Si se declara como final un objeto, se hace constante la referencia, pero no el objeto. n No es posible hacer que un objeto sea constante 9 Métodos n n Son funciones definidas dentro de una clase Ejemplo: public double perimetro() { return 2.0*PI*radio; } n Declaración: n n modificador_acceso tipo_devuelto nombreMétodo (lista_argumentos) Se aplican a un objeto a través del operador punto (.). Dicho objeto es su argumento implícito. n circulo1.perimetro() 10 Paso de argumentos n Los argumentos de los tipos primitivos se pasan por valor n n n El método recibe una copia del argumento Las referencias se pasan también por valor, pero a través de ellas se pueden modificar los objetos referenciados No se pueden pasar métodos como argumentos a otros métodos n En C/C++ se pueden pasar punteros a función como argumentos 11 Métodos de clase n n n n Los métodos de clase (static) no actúan sobre objetos concretos a través del operador punto (.) Se crean anteponiendo la palabra static Para llamarlos se suele utilizar el nombre de la clase Ejemplo: n n Métodos matemáticos de la clase java.lang.Math: sin, cos, exp, pow,... Math.sin(ang); // Calcula el seno de ang 12 Control de acceso n Modificadores de acceso n n Indican el tipo de acceso permitido a cada miembro de la clase Modificadores: public, private, protected y package (por defecto) Visibilidad public protected private package Propia clase Sí Sí Sí Sí Otra clase del package Sí Sí No Sí Otra clase fuera del package Sí No No No Clase derivada dentro del package Sí Sí No Sí Clase derivada fuera del package Sí Sí No No 13 Métodos sobrecargados n Java permite métodos sobrecargados n n Ejemplo: n n n n n Tienen el mismo nombre, pero se diferencian por el número y tipo de los argumentos public void calcula (int dato1) public void calcula (int dato1, float dato2) public void calcula (int dato1, float dato2, double dato3) No es posible crear dos métodos sobrecargados que sólo difieran en el valor de retorno Constructores sobrecargados: n n public Circulo() public Circulo(double cx, double cy, double r) 14 Constructores (i) n Constructor: método que se llama automáticamente cada vez que se crea un objeto de una clase n n n n Constructor por defecto: n n n Misión: reservar memoria e inicializar las variables miembro de la clase No tiene valor de retorno Su nombre es el mismo que el de la clase No tiene argumentos Si no se especifica, el compilador crea uno, inicializando las variables de tipos primitivos a su valor por defecto, y las referencias a null Un constructor puede llamar a otro definido por medio de la palabra this 15 Constructores (ii) class Punto { private double x,y; public Punto(double cx,double cy) { x = cx; y = cy; } public Punto() { this(0.0,0.0); } } Constructor por defecto: Punto pt1 = new Punto(); Constructor parametrizado: Punto pt2 = new Punto (3,6); 16 Constructor copia n n Permite crear un objeto a partir de otro objeto de la misma clase Ejemplo: public Punto(Punto pto) { x = pto.x; y = pto.y; } n Llamada: n Punto pt3 = new Punto(pt2); 17 Destructores: liberación de memoria n n n En Java no hay destructores El sistema libera la memoria de los objetos que han perdido la referencia → garbage collection (recogida de basura) No se sabe exactamente cuando se va a activar el garbage collector n Si no falta memoria es posible que no se active en ningún momento 18 Packages (i) n Un package es una agrupación de clases n n n Para que una clase forme parte del package llamado nombrePaquete: n n package nombrePaquete; //1ª línea del fichero El nombre de un package puede constar de varios nombres unidos por puntos n n API Java 1.1 → 22 packages API Java 1.2 → 59 packages Ej: java.awt.event Todas las clases que forman parte de un package deben estar en el mismo directorio 19 Packages (ii) n import nombrePaquete; n Evita tener que utilizar nombres largos n n n n No hace que se carguen todas las clases (sólo se cargan las clases public) No se importan los subpaquetes n n import java.io.*; Se puede acceder a la clase FileReader simplemente con el nombre FileReader en lugar de con el nombre java.io.FileReader import java.awt; // no importa java.awt.event Los packages hacen referencia a los ficheros compilados *.class 20 Herencia (i) n n El mecanismo de herencia permite construir una clase a partir de otra Sintaxis: class ClaseDerivada extends ClaseBase { } n La clase derivada hereda todos los miembros de la clase base, excepto los constructores. n n n No tiene acceso a los miembros privados de la clase base Los métodos de la clase base pueden ser redefenidos (overriden) en la clase derivada Se pueden añadir nuevas variables y métodos en la clase derivada 21 Herencia (ii) n n n Java permite múltiples niveles de herencia No permite que una clase derive de varias → no existe herencia múltiple Todas las clases tienen una superclase n Si no se específica nada, la clase deriva de java.lang.Object → clase raíz 22 La clase Object n n Es la raíz de la jerarquía de clases de Java Métodos que pueden ser redefinidos: n n n clone() → crea un objeto a partir de otro objeto de la misma clase equals() → indica si dos objetos son o no iguales. Devuelve true si son iguales toString() → devuelve un String conteniendo una representación del objeto como cadena de caracteres 23 Redefinición de métodos n n Se puede redefinir cualquier método heredado que no sea final Se puede acceder a un método de la superclase que haya sido redefinido utilizando la palabra super n n n n public int funcion() // método clase base public int funcion() // método redefinido en la clase derivada super.funcion() // acceso al método de la clase base Los métodos de clase o static no pueden ser redefinidos 24 Constructores en clases derivadas n El constructor de una clase derivada puede llamar al constructor de su clase base mediante la palabra super Subclase(lista_parámetros) { super(lista_parámetros); // sentencias adicionales } n Si no se llama explícitamente al constructor de la clase base, se llama automáticamente al constructor por defecto de la clase base 25 Ejemplo constructor class Rectangulo class Cuadrado extends Rectangulo { public int alto,ancho; { Rectangulo(int alto,int ancho) Cuadrado(int tam) { { super(tam,tam); this.alto = alto; } this.ancho = ancho; } } } 26 Clases y métodos abstractos n n n Una clase abstracta es una clase de la que no se pueden crear objetos Proporciona los atributos y métodos que serán compartidos por todas sus clases derivadas Se declaran anteponiéndoles la palabra abstract n n Ej: public abstract class Geometria Una clase abstract puede tener métodos declarados como abstract n n Los métodos abstract no son definidos en la clase abstracta, deben ser redefinidos en las clases derivadas Si una clase tiene un método abstract, es obligatorio que la clase sea abstract 27 Ejemplo clase abstracta public abstract class Geometria { public abstract double perimetro(); public abstract double area(); } n Se declara public para que pueda ser utilizada por cualquier otra clase n Al ser abstract, no se permiten crear objetos de esta clase n Ambos métodos deberán definirse en las clases que deriven de esta clase 28 Interfaces n Una interface es un conjunto de declaraciones de métodos (sin definición) n n n Las clases que implementen una interface deben proporcionar una definición de los métodos de la interface Una clase puede implementar una o varias interfaces: n n Puede definir constantes (public, static y final) que deben inicializarse en la declaración public class CirculoGrafico implements Dibujable, Cloneable Una interface define un tipo de conducta de las clases que la implementan 29 Interface vs. clase abstract n Tienen en común que contienen declaraciones de métodos n n La clase abstract puede definirlos Diferencias: n n n Una clase no puede heredar de dos clases abstract, pero sí puede heredar de una clase abstract e implementar una interface, o implementar dos o más interfaces Una clase no puede heredar métodos definidos de una interface, aunque sí constantes Las interfaces tienen una jerarquía propia, permitiéndose la herencia múltiple 30 Definición de interfaces n Se define de forma similar a las clases public interface Dibujable { public void setPosicion(double x, double y); public void dibujar(Graphics dw); } n n Cada interface public debe ser definida en un fichero *.java con el mismo nombre de la interface Las interfaces sólo admiten los modificadores de acceso public y package n n Si no es public no será accesible desde fuera del package Los métodos son implícitamente public y abstract 31 Herencia en interfaces n Se permite la herencia simple y múltiple n n Sintaxis: n n La interface derivada incluye todas las constantes y declaraciones de métodos de la(s) interface(s) base(s) [public] interface InterfaceDerivada extends InterfaceBase1, InterfaceBase2, ... Una interface puede ocultar una constante definida en una interface base, definiendo una constante con el mismo nombre. Del mismo modo puede ocultar la declaración de un método heredado 32 Polimorfismo (i) Geometria Rectangulo Circulo Dibujable Dibujable RectanguloGrafico n n CirculoGrafico Una referencia a un objeto de una determinada clase puede servir de referencia a objetos de cualquiera de sus clases derivadas Ejemplo: Sólo se pueden utilizar las capacidades definidas en la Geometria geom1,geom2; clase Geometria: perimetro() geom1 = new RectanguloGrafico(); y area() geom2 = new CirculoGrafico(); 33 Polimorfismo (ii) n n Se puede utilizar una referencia a una interface para manejar objetos de clases que implementan dicha interface Ejemplo: Dibujable dib1,dib2; dib1 = new RectanguloGrafico(); dib2 = new CirculoGrafico(); n Los objetos dib1 y dib2 sólo pueden ser utilizados con los métodos definidos por la interface Dibujable n El poder utilizar nombres de una superclase o de una interface permite tratar de un modo unificado objetos distintos, aunque pertenecientes a distintas subclases o a clases que implementan dicha interface 34 Clases internas n Clase interna: clase definida dentro de otra clase (clase contenedora) n n Hay 4 tipos de clases internas: n n n n n Se utilizan en el modelo de eventos introducido en la versión Java 1.1 Clases Clases Clases Clases internas static internas miembro internas locales anónimas La JVM desconoce la existencia de clases internas. n El compilador las convierte en clases globales, contenidas en ficheros ClaseContenedora$ClaseInterna.class 35 Clases e interfaces internas static n n n n n n Clases anidadas (nested classes) Sólo pueden ser creadas dentro de otra clase al máximo nivel: en el bloque de definición de la clase contenedora Se pueden definir clases e interfaces static dentro de una interface contenedora Para utilizar su nombre desde fuera de la clase contenedora hay que precederlo por el nombre de la clase contenedora y el operador punto (.) Las clases internas static sólo tienen acceso a los miembros static de la clase contenedora No se necesitan objetos de la clase contenedora para crear objetos de la clase interna static 36 Ejemplo clase interna static (i) class A { int i = 1; static int is = -1; public A(int i){ this.i = i; } // a los métodos de la clase contenedora hay que pasarles // referencias a los objetos de la clase interna static public void printA(Bs unBs) { System.out.println("i=" + i + " unBs.j=" + unBs.j); } 37 Ejemplo clase interna static (ii) // Clase interna static static class Bs { int j = 2; public Bs(int j) { this.j = j; } // los métodos de la clase interna static no pueden acceder // a la i (variable de objeto). Sí pueden acceder a is public void printBs() { System.out.println("j=" + j + " is=" + is); } } } 38 Ejemplo clase interna static (iii) class ClasesIntStatic { public static void main(String [] arg) { A a1 = new A(11), a2 = new A(12); System.out. println("a1.i=" + a1.i + " a2.i=" + a2.i); A.Bs b1 = new A.Bs(-10); A.Bs b2 = a1.new Bs(-11); System.out. println("b1.j=" + b1.j + " b2.j=" + b2.j); b1.printBs(); b2.printBs(); a1.printA(b1); a1.printA(b2); } 39 } Clases internas miembro (i) n Son clases definidas al máximo nivel de la clase contenedora, y no son static n n No pueden tener miembros static Relación entre las clases internas y la contenedora: n n n Los métodos de la clase interna ven directamente las variables miembro del objeto de la clase contenedora Los métodos de la clase contenedora no ven directamente las variables miembro de los objetos de la clase interna: necesitan una referencia Se puede acceder a los objetos de la clase interna, aunque se pierda la referencia al objeto de la clase contenedora 40 Clases internas miembro (ii) n Permisos de acceso: n n n n Las clases internas pueden ser private o protected (las normales sólo pueden ser public o package) Los métodos de las clases internas acceden a todos los miembros, incluso private, de la clase contenedora La clase contenedora puede acceder (con una referencia) a todas las variables miembro de sus clases internas Una clase interna puede acceder a los miembros (incluso private) de otras clases internas 41 Clases internas miembro (iii) n n n n Una clase interna puede contener otra clase interna En la clase interna this se refiere al objeto de la propia clase interna. Para acceder al objeto de la clase contenedora se utiliza ClaseContenedora.this Para crear un objeto de la clase interna se utiliza new precedido por la referencia al objeto de la clase contenedora. Ejemplo: B clase interna de A y C clase interna de B A a = new A(); A.B b = a.new B(); A.B.C c = b.new C(); 42 Ejemplo clase interna miembro (i) class A { int i = 1; public A(int i) { this.i = i; } public void printA(B unB) { System.out.println("i=" + i + " unB.j=" + unB.j); } protected class B { int j = 2; public B(int j) { this.j = j; } public void printB() { System.out.println("i=" + i + " j=" + j); } } } 43 Ejemplo clase interna miembro (ii) class ClasesInternas { public static void main(String []arg) { A a = new A(13); A.B b = a.new B(-30); // se destruye la referencia al objeto de la clase contenedora a = null; b.printB(); // i = 13, j = -30 a = new A(14); // se crea un nuevo objeto asociado a la referencia a // b sigue asociado al anterior objeto de la clase contenedora b.printB(); // i = 13, j = -30 } } 44 Clases internas locales n n n n n No se declaran dentro de otra clase al máximo nivel, sino dentro de un bloque de código (en un método) Sólo son visibles y utilizables en el bloque de código en el que están definidas Tienen acceso a todos los miembros de la clase contenedora Pueden utilizar las variables locales y argumentos de métodos visibles en ese bloque de código, sólo si son final No pueden ser declaradas public, protected, private o package. Su visibilidad es la del bloque en la que ha sido definida 45 Ejemplo clase interna local (i) class A { int i = -1; public A(int i) { this.i = i; } public void getAi(final long k) { final double f = 3.14; class BL { int j = 2; public BL(int j) { this.j=j; } public void printBL() { System.out.println("j=" + j + " i=" + i + " f=" + f + " k=" + k); } } // fin clase BL BL bl = new BL(2*i); bl.printBL(); } // fin getAi } // fin clase A 46 Ejemplo clase interna local (ii) class ClasesIntLocales { public static void main(String []arg) { A a1 = new A(-10), a2 = new A(-11); a1.getAi(1000); a2.getAi(2000); } } 47 Clases anónimas n n Son similares a las clases internas locales, pero sin nombre: n Al no tener nombre, sólo se puede crear un único objeto n Se utilizan en el AWT para definir clases y objetos que gestionen los eventos de la interface de usuario Formas de definir una clase anónima: n Palabra new seguida de la definición de la clase anónima entre llaves n Palabra new seguida del nombre de la clase de la que hereda (sin extends) y la definición de la clase anónima entre llaves → el nombre de la clase base puede ir seguido de los argumentos de su constructor n Palabra new seguida de la interface que implementa (sin implements) y la definición de la clase anónima entre llaves → el nombre de la interface va seguido por paréntesis vacíos 48 Ejemplo clase anónima n Definición de clase anónima en relación con el AWT: unObjeto.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { .... } }); n La clase anónima deriva de Object e implementa la interface ActionListener 49