Download Clase - Thrive

Document related concepts
no text concepts found
Transcript
CLASES, OBJETOS
E
INSTANCIAS
Ángel Lucas González Martínez
Jaime Ramírez
Guillermo Román
DLSIIS. Facultad de Informática
Universidad Politécnica de Madrid
48
¿Qué es un objeto?
Un objeto representa una entidad, ya sea física
o conceptual, relevante para comprender el
dominio del problema o para formular la
solución.
– Entidad física: coche, persona,..
– Entidad conceptual: buffer, árbol binario,…
49
Los objetos son abstracciones
• Toda abstracción es una simplificación que representa
ciertas características relevantes y olvida otras.
• Dependiendo del observador de un coche:
– un vendedor: modelo, precio, color . . .
– un mecánico: tipo de motor, transmisión, suspensión . .
– un ingeniero:
...
50
Características de los objetos
• Estado:
– Viene determinado por los valores de sus
atributos.
• Comportamiento:
– Define cómo reacciona un objeto a peticiones de
otros objetos.
– Viene dado como una serie de servicios que el
objeto proporciona a otros.
51
¿Cómo se define un objeto?
• Una clase es una plantilla para la creación de
objetos que comparten características comunes:
– Su estado está determinado por los mismos
atributos.
– Saben realizar las mismas operaciones (también
llamados métodos).
• Un objeto es una instancia de una clase
• Las clases deberán incluir al menos un método
constructor (casi todos los lenguajes incorporan
uno por defecto).
52
Las clases y los objetos están en
todas partes
Vehículo
Platero:Animal
Animal
Punto
Figura
(1,3)
(2,2)
(2,1)
(5,2.5)
53
Métodos y Mensajes
• Métodos: definen el comportamiento de un objeto.
Punto
Estado
x,y: float
trasladar(a,b)
distancia(pto)
Comportamiento
• Invocación de métodos: paso de mensajes.
trasladar(1,-1)
P1:Punto
X=2
Y=2
Cambia su
estado
P1:Punto
X=3
Y=1
54
Las Clases en Java
• 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, y se referencia por medio de
una variable de tipo clase
55
Ocultación de Información
• No siempre nos interesa que todos los
componentes (atributos o métodos) sean
accesibles desde fuera de la clase
– Reducimos acoplamiento
– Facilitamos las pruebas de la clase
– Únicamente publicamos los servicios que nos
interesan o que queremos proporcionar
• Los lenguajes de programación proporcionan
mecanismos para evitarlo
56
Ocultación de Información
• Modificadores para atributos o métodos
– public: Desde cualquier clase
– private: Sólo desde nuestra clase
– Java tiene otros modificadores que se verán más
adelante
• Otros modificadores
– Final: Para crear constantes
57
¿Cómo decidir que modificador
usar?
• Modificadores para métodos:
– private: si se utiliza como función auxiliar
– public: si va a ser utilizada fuera de la clase
• Los atributos deben ser privados
– Si es necesario acceder al atributo 
• Método getAtributo ()
• Método setAtributo (valor)
58
Definición de una clase en Java
[modificadoresClase] class NombreClase {
[modificadores] Tipo nombreAtributo
.............
[modificadores] TipoResultado nombreMétodo(tipo1
arg1,..., tipoN argN) {
“implementación del método o cuerpo”}
}
modificadorClase = abstract | public | final
modificador = private | public | protected | final |
static
59
Ejemplo de clase
public class Empleado {
Método de instancia
private String nombre;
observador
private double sueldo;
public String getNombre() {
return nombre;
}
Método de instancia
public double getSueldo() {
return sueldo;
selector
}
public void setNombre(String nombre1) {
nombre = nombre1;
}
public void setSueldo(double sueldo1) {
sueldo = sueldo1;
}
}
60
Ejemplo de clase
public class TestEjemplo {
Creación de una
instancia usando el
constructor por defecto
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());
}
}
61
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
62
Constructor
• El constructor se ejecuta al crear el objeto con el
new
• Al llamar a new se asigna memoria al objeto
• 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 (se verán más adelante)
63
Ejemplo 1 de constructores
public class Fecha {
private int day, month, year;
Sobrecarga
public Fecha(String date) {
String [] partes = date.split("/"); constructor
day = Integer.parseInt(partes[0]);
month = Integer.parseInt(partes[1]);
year = Integer.parseInt(partes[2]);
}
public Fecha(int dia, int mes, int anio) {
day=dia; month=mes; year=anio;
}
public String toString() {
return day + "/" + month + "/" + year;
}
}
del
64
Ejemplo 1 de constructores
public class TestFecha {
public static void main(String[] args) {
Fecha ob1, ob2;
ob1 = new Fecha(4, 11, 1996);
ob2 = new Fecha("22/10/2001");
System.out.println("La primera fecha es " +
ob1);
System.out.print("La segunda fecha es " +
ob2);
}
}
65
Ejemplo 2 de constructores
public class Fecha {
private int dia, anio;
private TMes mes;
public Fecha (int dia, int mes, int anio)
throws FechaIncorrecta{
this.dia=dia; this.anio=anio;
if (mes>0 && mes<= 12)
this.mes=TMes.values()[mes-1];
else throw new FechaIncorrecta ();
if (! esValida ())
throw new FechaIncorrecta ();}
public Fecha (int dia, TMes mes, int anio)
throws FechaIncorrecta {
this.dia=dia; this.mes=mes;this.anio=anio;
if (! esValida ())throw new FechaIncorrecta ();}
66
Ejemplo 2 de constructores
import Fecha.Fecha;
import Fecha.FechaIncorrecta;
public class TestFecha {
public static void main(String[] args) {
Fecha ob1, ob2;
try {
ob1 = new Fecha(4, 11, 1996);
ob2 = new Fecha(22,Fecha.TMes.OCTUBRE, 2001);
System.out.println("La primera fecha es " + ob1);
System.out.print("La segunda fecha es " + ob2);
} catch (FechaIncorrecta e) {
e.printStackTrace();
}
}}
67
Atributos de Clase
• Se definen anteponiendo la palabra clave static.
• Todos los objetos comparten el mismo valor en ese
atributo.
• No existe una copia de ese atributo para cada
instancia de la clase u objeto.
• USO: cuando todos los objetos de una misma clase
comparten unos mismos datos.
– Se pueden utilizar para definir constantes (final)
(véase las constantes PI y E de la clase Math)
– Para datos comunes a todos los elementos de una
clase
68
Métodos de Clase
• Se antepone static a la definición del método
• Se llaman sin necesidad de que ya haya sido
creado una instancia u objeto de la clase:
NombreClase.nombreMetodo(...);
• Sólo pueden acceder a atributos de clase, y a
métodos de clase.
• USO:
– Inicialización, modificación y consulta de atributos de
clase.
– Métodos que no necesitan atributos del objeto actual:
parseInt(), parseDouble(), etc.
69
Atributos y Métodos de Clase
public class CuentaCorriente {
/**
* Los intereses son comunes para todas las cuentas
* abiertas en el banco
*/
Permite
private static double interes = 0.5;
resolver
private double saldo;
la
ambigüedad
public CuentaCorriente (double saldoInicial){
saldo=saldoInicial;
}
public void setSaldo (double saldo){
this.saldo=saldo;
}
public static void setInteres (double interes){
CuentaCorriente.interes=interes;
}
public String toString(){
return interes + " " + saldo;
}}
70
Atributos y Métodos de Clase
public class TestCuentaCorriente {
public static void main(String[] args) {
CuentaCorriente cuenta1, cuenta2;
cuenta1 = new CuentaCorriente(23);
cuenta2 = new CuentaCorriente(40);
System.out.println(cuenta1);
//La forma correcta es CuentaCorriente.setInteres(1.5)
cuenta2.setInteres(1.5);
System.out.println(cuenta2);
System.out.println(cuenta1); // el interés de cuenta1 es
//el de cuenta2 y cuando se cambia en uno se cambia en los
//dos
//Cambiamos el interés a todas las cuentas usando el nombre
//de la clase
CuentaCorriente.setInteres(0.75);
System.out.println(cuenta2);
System.out.println(cuenta1);
}
}
71
Memoria
• Clasificaciones diferentes de la memoria:
– Memoria estática vs dinámica
– Memoria automática vs no automática
Tipo
Estática
Dinámica
Automático
Variables Globales
Parámetros Formales
Variables Locales
No automático
------Punteros
– Tendencias:
+ Complejidad -
Compilador
Programación
• Todo automático: Programación funcional, lógica,
• No automática:
– Administrada: Solicitud de memoria por el programador
y recolector de memoria no usada (Java, .Net) → GC
– No administrada: C, C++, Ada, …
73
Puntero
• Las máquinas tienen la memoria dividida en celdas,
cada celda tiene una dirección y un contenido.
• El contenido dependerá del programa:
–
–
–
–
Datos de tipo entero
Datos de tipo booleano
Datos de tipo array
Código de programa
• Clave: incluso el contenido de una celda puede ser
una dirección de memoria → Puntero
• En java todas las variables de tipo clase (instancias)
son en realidad punteros (referencias a objetos)
74
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 ();//creación e inicialización.
//obj es una referencia o puntero
//Memoria no automática
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*.
78
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 y creación de una referencia
.......
} //Eliminación de la referencia obj2
obj= null; // Eliminación de la última referencia obj
•
Entra en juego el Garbage Collector (GC)
79
Garbage Collector (GC)
• Recoge la memoria que no es accesible (basura
o memory leaks)
• Es activado de forma automática por la JVM
• Se puede “sugerir” su ejecución por medio de
System.gc()
80
Puntero this
• Todo método de instancia lleva un parámetro implícito
• Este parámetro es 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 Fecha{
.....
public Fecha(int dia, int mes, int anio) {
this.dia=dia; this.mes=mes; this.anio=anio;
}}
• Y para pasar como parámetro el objeto actual, como en
el siguiente ejemplo....
81
Puntero this
public static void main(String[] args){
Aeropuerto aeropuerto;
Avion avion;
avion = new Avion();
aeropuerto = new Aeropuerto("barajas");
avion.setDestino(aeropuerto); // this == avion
avion.aterriza(); // this == avion
}
82
Puntero this
class Avion{
private Aeropuerto destino;
private Aeropuerto origen;
public void setDestino (Aeropuerto destino) {
this.destino=destino;
}
public void aterriza () {
Pista pista;
pista = this.destino.darPista(this);
…………
}
}
83
Puntero this
class Aeropuerto {
private Pista pista;
public Pista darPista(Avion avion) {
if (puedeAterrizar(avion)) {
return pista;
} else
return null;
}
}
84
Puntero this
class Ventana {
private Ventana ventanaPadre;
public Ventana (Ventana ventanaPadre) {
this.ventanaPadre = ventanaPadre;
}
public void solicitarInformacion () {
Ventana ventanaInfo = new Ventana (this);
ventanaInfo.hacerVisible ();
}
}
85
Pasos de parámetros
• Paso por valor
– Se copia el contenido de la variable
– Se tienen 2 valores duplicados e independientes
– Los cambios en uno no afectan al otro
• Paso por referencia
– Se pasa la dirección de memoria (referencia) del dato
– Se tiene un único valor referenciado
– Cualquier acción implica cambio en los 2 valores (el
que está fuera y el que está dentro del método)
86
Paso de parámetros en Java
• El paso de parámetros en Java es por valor 
– Se hace una copia del parámetro en el contexto del
método
• OJO: También lo podemos entender como que es por
referencia
– En Java los identificadores de objetos realmente
contienen punteros a objetos
– Los cambios en los objetos afectan a todas sus
referencias
– Los cambios en las referencias dentro de un método
se pierden
87
Paso de parámetros a métodos
static void intercambiar
(Fecha d1, Fecha d2) {
Fecha aux = d1;
d1 = d2;
d2 = aux;
}
Intercambia referencias
Método de clase
static void intercambiar
(Fecha d1, Fecha d2) {
"intercambiar d1.day y
d2.day"
"intercambiar d1.month
y d2.month"
"intercambiar d1.year y
d2.year"
}
88
Igualdad y Asignación
• Distinguir asignación e igualdad entre
tipos básicos y entre instancias de
clase
• Una variable declarada como de una
cierta clase es una referencia o “alias” de
un objeto 
– Utilizando el operador de asignación varias
variables pueden referirse al mismo objeto.
89
Igualdad y Asignación
public static void main(String[] args) {
Fecha ob1, ob2, ob3;
ob1 = new Fecha (12, 4, 1996);
// ambos se refieren al mismo objeto Fecha
ob2 = ob1;
System.out.println("La primera fecha es " + ob1);
System.out.println("La segunda fecha es " + ob2);
// cambio el día por medio de ob1
ob1.setDia(10);
if (ob1==ob2) // pero siguen siendo iguales
System.out.println(“Son iguales”);
else
System.out.println(“Son distintos”);
ob3 = new Fecha(10, 4, 96);
if (ob1==ob3) // son distintos!?
System.out.println(“Son iguales”);
else
System.out.println(“Son distintos”);
}
ob1
ob2
12/4/1996
10/4/1996
ob3
10/4/1996
90
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 Fecha.
• Esta solución es la que se ha adoptado en la API (véase
la clase String)
91
Ejemplo con equals
public boolean equals (Object o) {// método
//implementado dentro de la clase Fecha
return (day==((Fecha) o).day) &&
(month==((Fecha) o).month) &&
(year==((Fecha) o).year);
}
//Programa principal en un fichero .java distinto de
//Fecha.java
public static void main(String[] args) {
Fecha ob1, ob2;
ob1 = new Fecha(12, 4, 96);
ob2 = new Fecha("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));
}
92
La clase String
• Define un array de caracteres
• Literales entre comillas dobles (“)
• Para saber el número de caracteres se ha de
usar el método length()
• Una vez creado no se puede cambiar el valor
de su contenido
• StringBuffer define Strings que pueden ser
modificados
93
La clase String
• char charAt (int pos)
• int compareTo (String con):
"hola".compareTo(nombre)
– Resultado cero son iguales
– Resultado negativo si “con” es mayor
– Resultado positivo si “con” en menor
•
•
•
•
•
int compareToIgnoreCase (String con)
boolean equals (String compara)
boolean equalsIgnoreCase (String compara)
String pruebas=String.valueOf(15);
int length()
static String valueOf (<tipo básico> valor)
94
Clases Asociadas a los Tipos Básicos
• Java proporciona clases
envoltorio para los tipos
básicos
• Necesarias para las
contenedoras y plantillas
• Java 5 conversión
automática:
Tipo Básico ↔ Clase
• Proporciona conversión
String ↔ Tipo:
– valueOf(String) -> Tipo
– toString(Tipo) -> String
Clase
Tipo básico
Boolean
Byte
Character
Double
Float
Integer
Long
Short
boolean
byte
char
double
float
int
long
short
95
Arrays de objetos
public static void main(String[] args) {
Fecha [] fechas; // declaración del array
fechas = new Fecha[3];
fechas[0]=new Fecha(1,1,06);
fechas[1]=new Fecha(2,1,06);
fechas[2]=new Fecha(3,1,06);
Se crea espacio para tres
referencias a Fecha
Se crea la primera instancia y
es referenciada por fechas[0]
for (int i=0; i<fechas.length; i++)
System.out.println(fechas[i]);
}
96
Ejercicio Concesionario
•
•
•
•
Crear una clase Persona
– Con nombre, apellidos y DNI
– Métodos de acceso al estado del objeto
Crear una clase coche
– Con marca, modelo, matrícula y propietario
– Crear matrículas de forma consecutiva y sin que se repita
– Un coche puede ser comprado por una persona que pasa a ser
su propietario y a crearse una matrícula
Crear una fábrica de coches para una marca y un modelo
– Se solicitará el número de coches que el cliente quiera
Crear un concesionario
– Que dispone de una lista de coches y de una fábrica
– Irá vendiendo coches según llegan compradores
• Cuando se quede sin coches solicitará más coches a la fábrica
97
Ejercicio Agenda
•
•
Dada la clase EntradaAgenda
– Con nombre, apellido1, apellido2, telefono, email
– Añadir un método equals() que devuelva cierto si coinciden el nombre y
los apellidos, y falso en caso contrario.
Crear una clase Agenda
– Con una secuencia de entradas (contactos)
– Un constructor que crea un vector vacío con el tamaño dado (tamaño
max de la agenda)
– Permite insertar un nuevo contacto si la agenda no está llena y no
existe otro contacto con el mismo nombre y apellidos.
– Permite buscar un contacto dados su nombre y apellidos, y devuelve
su email y su tlfo.
– Permite borrar un contacto dados su nombre y apellidos.
– Devuelve un vector de Strings con los nombres y los apellidos de todos
los contactos de la agenda.
98