Transp. Clases - ingeniería de sistemas y automática

Anuncio
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
Descargar