Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
10
3. Clases y objetos en Java
Variables
Creación de objetos
Definen una estructura de datos (como un struct de C)
class CuentaBancaria { struct CuentaBancaria { Una clase define un tipo de dato que se puede utilizar para declarar variables
long numero; long numero; CuentaBancaria cuenta1, cuenta2;
String titular; char *titular;
long saldo; long saldo; Declarar un objeto es declarar una referencia a un objeto
CuentaBancaria
} };
Los objetos se crean con el operador new numero -- sin definir
d f --
Pueden almacenar objetos titular -- sin definir --
cuenta1 = new CuentaBancaria ();
saldo -- sin definir --
class CuentaBancaria { class Cliente {
long numero; String nombre; Crear un objeto significa reservar espacio en memoria para sus variables
Cliente titular; long dni; new reserva memoria para un objeto y devuelve una referencia al objeto
long saldo = 0; }
} Las variables se pueden inicializar directamente
Los objetos siempre utilizan memoria dinámica
en la clase (con una expresión arbitraria que no
Por defecto se inicializan a 0 ó null
genere checked exceptions)
3 4
11 12
La variable this
La variable this: relaciones inversas
Definida implícitamente en el cuerpo de los métodos
Referencia al objeto sobre el que se invoca el método
class Nodo {
class Vector3D { Nodo anterior;
double x, y, z; Nodo siguiente;
... void conectar (Nodo z) {
double productoEscalar (Vector3D u) { siguiente = z;
return x * u.x + y * u.y + z * u.z; z.anterior = this;
// return this.x * u.x + this.y * u.y + this.z * u.z; }
} }
double modulo () {
return (double) Math.sqrt (productoEscalar (this)); Nodo Nodo
siguiente siguiente Nodo
} siguiente siguiente
}
// Bloque main anterior anterior anterior anterior
Vector3D v = new Vector3D (2, -2, 1);
v.modulo ();
17 18
this en constructores
Sobrecarga de métodos
class Cliente {
String nombre; long dni;
Cliente (String str, long num) { nombre = str; dni = num; } class Plano3D {
CuentaBancaria cuentas[] = new CuentaBancaria [20]; double a, b, c, d;
int ncuentas = 0; Plano3D (double aa, double bb, double cc, double dd) {
CuentaBancaria
void nuevaCuenta (CuentaBancaria cuenta) { a = aa; b = bb; c = cc; d = dd;
cuentas[ncuentas++] = cuenta; }
} boolean paralelo (Plano3D p) {
} Cliente
CuentaBancaria Vector3D u = new Vector3D (a, b, c);
Vector3D v = new Vector3D (p.a, p.b, p.c);
class CuentaBancaria { return u.paralelo (v);
long numero; }
Cliente titular; CuentaBancaria
boolean paralelo (Recta3D r) {
long saldo;
Vector3D u = new Vector3D (a, b, c);
CuentaBancaria (long num, Cliente clt, long s) {
numero = num; titular = clt; saldo = s; return u.perpendicular (r.vector);
clt.nuevaCuenta (this); }
} }
}
19 20
Control de acceso
Destrucción de objetos (II) Miembros públicos vs. privados
Soltar expresamente una referencia:
class A { class B {
cuenta1 = null; GC public int x; void h () {
private int y; A a = new A ();
CuentaBancaria public void f () { ... } a.x = 2;
numero 8350284 private void g () { ... } a.y = 6; // Error
cuenta1
titular
void h () { a.f ();
Cliente x = 2; a.g (); // Error
saldo 200000
nombre "Pilar Garcia" y = 6; }
dni 25672046 f (); }
null
cuentas g ();
A a = new A ();
a.x = 2;
Un objeto se libera sólo cuando se sueltan todas las referencias a él a.y = 6;
a.f ();
CuentaBancaria cuenta2 = cuenta1;
a.g ();
cuenta1 = null; // El objeto no se libera aún }
}
Es posible solicitar garbage collection: System.gc ();
25 26
27 28
Ocultación de clases
dentro de packages Packages
A.java Conjunto de clases definidas en un directorio
package p1; package p2;
Evitar conflictos de símbolos
// Clase pública class C {
public
bli class
l A { void
id f () { Cada clase pertenece a un package
... p1.A a;
} p1.B b; // Error
} Si no se define ningún package para una clase, java la incluye
// Clase del package
class B { en el package DefaultPackage
...
}
29 30
package p2;
La memoria de las variables estáticas se reserva al cargar la clase en el CuentaCorriente cuenta = new CuentaCorriente ();
cuenta.numero = cuenta.generarNumero ();
intérprete Java
cuenta.numero = CuentaCorriente.generarNumero ();
37 38
Cadenas de caracteres:
La clase java.lang.String
String encapsula cadenas de caracteres y su manipulación
String ≠ char[ ]
Los caracteres de un String no se pueden modificar
45 46
Cadenas de caracteres:
La clase java.lang.StringBuilder Métodos de StringBuilder (I)
Acceso (igual que para String): length(), charAt(int), ...
Desde Java 1.5, recomendado en lugar de StringBuffer (equivalente)
Conversión a String: toString()
Los caracteres de un StringBuilder sí se pueden modificar
Modificación de la cadena
Los objetos de tipo StringBuilder gestionan automáticamente su capacidad StringBuilder str = new StringBuilder ("abcdef");
– Toman
T una capacidad
id d inicial
i i i l str.setCharAt (2, 'q'); // str = "abqdef"
– La incrementan cuando es necesario str.append ("ghi"); // str = "abqdefghi"
Constructores str.insert (3, "xyz"); // str = "abqxyzdefghi"
StringBuilder() // Capacidad inicial: 16 caracteres str.insert (6, 1.23); // str = "abqxyz1.23defghi"
StringBuilder(int c) // Capacidad inicial: c caracteres str.delete (2, 10); // str = "abdefghi" (versión 1.2)
StringBuilder(String s)// Capacidad inicial: str.reverse (); // str = "ihgfedba"
// s.length() + 16 caracteres
47 48
51 52
53 54
55 56
lista.add (1, "Hola"); // lista = { 2, "Hola", 4.5 } Longitud y capacidad: size(), isEmpty(), ensureCapacity(int), trimToSize()
lista.set (0, new Character ('b')); // lista = { 'b', "Hola", 4.5 }
Conversión a array: toArray()
Eliminar elementos:
ArrayList tipado: ArrayList<Double> lista = new ArrayList<Double> ();
lista.remove (new Float (4.5)); // lista = { 'b', "Hola" }
Iteración: iterator() → Iterator
lista.remove (0); // lista = { "Hola" }
61 62
Ejemplo (I)
Tipos genéricos abstract class Figura {
abstract double area ();
}
Permiten definir clases parametrizadas por un tipo class Circulo extends Figura {
Punto2D centro;
El compilador se encarga de hacer los castings double radio;
Circulo (
(Punto2D p, double r)
) { centro = p; radio = r;
; }
Los errores se detectan en tiempo de compilación, no de ejecución double area () { return Math.PI * radio * radio; }
}
Tipos restringidos, wildcards, métodos genéricos
class Rectangulo extends Figura {
double left, top, width, height;
Rectangulo (double l, double t, double w, double h) {
left = l; top = t; width = w; height = h;
}
double area () { return width * height; }
}
67 68