Objetos y Clases

Anuncio
Fundamentos
F
ndamentos de
Programación
Tema 2: Objetos y Clases de Objetos
Martes
23-09-2007
Jueves
25-09-2007
Dpto. de Ingeniería de Sistemas Telemáticos
http://www.lab.dit.upm.es/~fprg/
1
Índice
z Objetos
z Clases
„ Notación UML
„ Encapsulamiento
„ Convenio de nombres
z Métodos
„ referencias
„ null
z Comparación de objetos
z Composición
z Tipos enumerados
„ Declaración de colecciones cerradas de valores
z Clases predefinidas
„ Math
„ String
z Ejercicios para Casa
2
¿Qué es un objeto?
z Un
U objeto
bj t es un trocito
t it d
de programa
z Un programa es un conjunto de objetos
z Se programan cosas que pueden ser muy
complejas y para mantener esa complejidad
bajo control hay que partir el problema en
piezas controlables
„ divide y vencerás
3
¿Los objetos son objetos?
z Los
L objetos
bj t de
d programación
ió NO son objetos
bj t
materiales
z Inicialmente los objetos se inventaron para
estructurar programas de simulación viaria
„ un coche, un peatón, una calle, un semáforo, ...
z Actualmente se usan p
para estructurar objetos
j
materiales, servicios, conceptos, ..., en general
cualquier
q
abstracción mental
4
Ejemplos de objetos
z Una
U estructura
t t
algebraica
l b i (ej.
( j un grupo))
z Un ámbito de trabajo (ej. colores)
z Un objeto material (ej. un satélite)
z Un servicio inmaterial (ej. www)
z Algo muy “real”: una cuenta corriente
z ...
5
Clases de objetos
z Habitualmente
H bit l
t un programa emplea
l muchos
h
objetos de la misma clase
„ muchos
h coches,
h
muchos
h satélites,
él
muchas
h
conexiones www, muchos transistores, ...
z Los
L programadores
d
definen
d fi
clases
l
„ class Car { ... detalles ... }
z Y luego crean objetos de las clases definidas
„ Car miCoche= new Car (...);
„ Car cocheDeElisa= new Car (...);
6
Representación gráfica
una clase
nombre de la clase
atributos
características de la clase
lo que se es o cómo se está
métodos
lo que puede hacerse
con objetos de esta clase:
comportamiento
t i t posible
ibl
un objeto
nombre
nombre
nombre
nombre
... ... ...
nombre
nombre
nombre
... ... ...
nombre del objeto
j
valores
memoria o estado
particular de cada objeto
todos los objetos
j
de
una clase hacen
exactamente
l mismo
lo
i
7
class Circulo
Circulo
radio:do ble
radio:double
dameRadio:double
area:double
circunferencia:double
escala:void
class Circulo {
double radio;
Circulo (double _radio) { radio= _radio; }
double dameRadio () { return radio; }
double area () {
return Math.PI * Math.pow(radio, 2);
}
double circunferencia () {
return 2 * Math.PI * radio;
}
void escala (double proporcion) {
radio= radio * proporcion;
}
UML
unified modelling language
}
8
Encapsulamiento
z Quien
Q i programa un objeto
bj t controla
t l los
l métodos
ét d
de acceso a su estado y su comportamiento
z El programador puede (y debe)
responsabilizarse de la corrección del código
correspondiente a un objeto
„ compromiso contractual
Objeto
Métodos privados
Atributos
Métodos publicos
9
Convenios
z Para
P
id
identificar
tifi
clases
l
y objetos
bj t unívocamente,
í
t
cada uno recibe un nombre diferente
„ mayúsculas
ú l ≠ minúsculas
ú l
„ SePuedenUtilizarPequenasFrases
„ yNumerosComoDia28oAno2000
„ peroNoSePuedenUsarAcentosNiEnes
z Las clases empiezan con letra mayúscula
j
empiezan
p
con letra minúscula
z Los objetos
10
Métodos
z Constructores
C
t t
„ para crear un método
z Otros:
„ Consultas
{ extraen características del objeto
„ Modificadores
{ crean impronta en el objeto
„ Operaciones
{ hacen
h
que ell objeto
bj t evolucione,
l i
con memoria
i
11
Referencias
z Cuando
C
d se crea un objeto
bj t de
d una clase,
l
el programador se queda con una referencia
para poder
d llegar
ll
a ese objeto
bj t
Circulo c1= new Circulo(1.0);
c1
Circulo c2= new Circulo(3.5);
c2
Circulo
1.0
dameRadio
area
circunferencia
escala
Circulo
3.5
dameRadio
area
circunferencia
escala
12
Acceso
z A los
l componentes
t de
d un objeto
bj t se accede
d
„ referenciaDelObjeto
c1.dameRadio();
c2.dameRadio();
c1.area();
c2.area();
c1.escala(2.0);
c1.area();
. nombreDelComponente
→ 1.0
→ 3.5
→ 3.1416
→ 38.4846
→ 12.5664
13
Referencias compartidas
z Un
U objeto
bj t puede
d tener
t
varias
i referencias
f
i
„ alias
Circulo c1= new Circulo(1.0);
Ci l c2=
Circulo
2 c1;
1
c11
c2
Circulo
1.0
dameRadio
area
circunferencia
i
f
i
escala
c1.area();
c2.area();
// 3.1416
// 3.1416
c1.escala(2.0);
c2.area();
// 12.5664
14
null
z cuando
d una referencia
f
i no se refiere
fi
a ningún
i ú
objeto (por ejemplo, antes de crearlo)
se dice que apunta a null
ll
Circulo c1;
c1.area();
// error
c1= new Circulo(1.0);
c1.area();
// 3.1416
c1= null;
c1.area();
// error
15
Adiós
z Cuando
C
d un objeto
bj t se queda
d sin
i referencias
f
i
1. no es accesible por el programa
2. el sistema se reserva el derecho de reciclarlo
Circulo c1= new Circulo(1.0);
c1= null;
Circulo c1= new Circulo(1.0);
Circulo c2= c1;;
// reciclable
c1= null;
// aún queda c2
c2= null;
// reciclable
16
Comparación
z Se
S comparan referencias
f
i
„ cierto si ambas referencian el mismo objeto
z No se comparan los objetos
„ falso, incluso si son dos objetos iguales en todos
Circulo c1= new Circulo(1.0);
Circulo(1 0);
Circulo c2= c1;
Circulo c1= new Circulo(1.0);
Circulo(1 0);
Circulo c2= new Circulo(1.0);
c1
1 == c22
// true
c1.escala(2.0);
c1 == c2
// true
c1
1 == c22
// false
f l
17
Composición
z Un
U objeto
bj t puede
d ser parte
t integrante
i t
t d
de otros
t
z Ejemplo:
„ un rectángulo esta compuesto por 4 puntos
p1
p2
p3
p4
18
Composición
Punto
x: double
y: double
d bl
Punto:
distancia: double
Rectangulo
R
l
p1: Punto
p2: Punto
p3: Punto
pp4: Punto
Rectangulo:
R t
Rectangulo:
l
area: double
19
Composición
class Punto {
double x, y;
Punto (double _x, double _y) {
x= _x;
y= _y;
}
class Rectangulo {
Punto p1, p2, p3, p4;
Rectangulo (Punto _p1, Punto _p2,
Punto _p3, Punto _p4) {
p1= _p1; p2= _p2;
p3= _p3;
p3
p3; p4
p4= _p4;
p4;
}
void desplaza (double deltaX,
double deltaY) {
x= x + deltaX;
y= y + deltaY;
}
Rectangulo (double base, double altura) {
p1= new Punto(0.0, altura);
p2= new Punto(base, altura);
p3= new Punto(0.0, 0.0);
p4= new Punto(base, 0.0);
p4
}
double distancia (Punto Q) {
...
}
}
double area () { ... }
}
20
¿Cuándo creamos clases?
z Cuando
C
d encontremos
t
un concepto
t nuevo
„ del problema a solucionar
„ de la solución
ó al problema
z Con objetos la programación se vuelve
parsimoniosa e incluso algo contemplativa:
vamos definiendo objetos interesantes, el
programa queda muy clarito y comprensible y
“funciona solo” porque cada objeto “sabe” lo
que tiene que hacer
21
Tipos Enumerados
z Un enumerated type es un tipo de dato que contiene un conjunto
de valores constantes
z JDK 5 permite definir tipos de datos enumerados
„ C
Características
t í ti
avanzadas
d incluyen
i l
la
l capacidad
id d de
d agregar los
l
métodos y campos a los enums.
z Enums son Comparable y Serializables. Las constantes de Enum
deberían ser nombradas de manera similar que las constantes.
constantes
Enums son básicamente un nuevo tipo de Clase. Hasta el momento
no he usado Enums en mi código, es que todavía no pienso cómo
debería usarlo
z ¿Cuando debería usar Enums?
„ Tipos de enumerados naturales: días de la semana, fases de la luna,
e t ione
estaciones.
„ Otros conjuntos donde sepamos todos los valores posibles: opciones de
un menú, etc.
22
Enumerados Básicos
z Uso básico: El enumerado Coin
public enum Coin {penny, nickel, dime, quarter}
Uso:
public class PruebaCoin2 {
}
public static void main (String [] args){
Coin2 moneda = Coin2.penny;
System.out.print ("La
( La Moneda:
Moneda:" + moneda);
}
23
Enumerados: Uso
z Ficheros diferentes
Coin2.java
public enum Coin2 { penny, nickel, dime, quarter}
PruebaCoin2.java
public class PruebaCoin2 {
public static void main (String [] args){
Coin2 moneda = Coin2.penny;
System.out.print ("La Moneda:" + moneda);
}
}
z En el mismo fichero
PruebaCoin3.java
enum Coin {penny, nickel, dime, quarter}
public class PruebaCoin3 {
public static void main (String [] args){
Coin moneda = Coin.penny;
System.out.print ("La Moneda:" + moneda);
}
}
24
Enumerados: Ejecución
z public static void main (String [] args) {…}
{ }
„ Método para comenzar la ejecución
„ Nombre main
„ Delante
{
{
{
Public:
P
bli se puede
d utilizar
ili
desde
d d cualquier
l i sitio
ii
Static: no necesita crear ningún objeto
Void: no devuelve nada
{
{
{
Se le pasan los argumentos en forma de Matriz de una dimensión
conteniendo listas de Caracteres
y se llaman args – el nombre puede cambiar
„ ( String [] args)
z Ficheros diferentes
Coin2.java
PruebaCoin2.java
Javac Coin2.java
Javac PruebaCoin2.java
Aparecen Coin.class
Coin class PruebaCoin2.class
PruebaCoin2 class
Java PruebaCoin2
z En el mismo fichero
PruebaCoin3.java
Javac PruebaCoin3.java
Aparecen Con.class PruebaCoin3.class
Java PruebaCoin3
25
Enumerados Ampliados
z Uso básico: El enumerado Coin,
Coin con un campo que
representa el valor de la moneda en céntimos
public enum Coin {
penny (1), nickel (5), dime (10), quarter (25);
Coin (int value) { this.value = value; }
private final int value;
}
public int value (){ return value;}
Uso
C
Coin
Moneda
d = new Coin
C
(10)
( 0)
26
Clases predefinidas
z Incluidas en el SDK de Java.
Java
„ Documentación:
http://java.sun.com/j2se/1.5.0/docs/index.html
p //j
/j
/
/
/
„ Descargable de:
http://java.sun.com/javase/downloads/
Como J2SE 5.0 Documentation
z Analizaremos a modo de ejemplo:
j p
„ java.lang.Math
{ biblioteca de funciones matemáticas
„ java.lang.String
l
{ biblioteca de funciones para tratar cadenas de texto
27
Math
class Punto {
// teorema de Pitágoras
double distancia (Punto Q) {
double m= Q.x;
double n= Q.y;
return Math.sqrt(
q
Math.pow(m-x, 2) +
Math.pow(n-y, 2) );
}
}
<Q.x, Qy>
<x, y>
28
Math
class
l EcuacionGrado2
i G d 2{
double a, b, c;
double discriminante;
EcuacionGrado2 (double _a,
double _b,
double _c)
c) {
a= _a;
b= _b;
cc= _c;
c;
discriminante= b*b - 4*a*c;
}
bboolean
l
raicesReales
i
l () {
return discriminante >= 0;
}
boolean raicesImaginarias () {
return discriminante < 0;
}
double raiz1 () {
return (-b + Math.sqrt(discriminante))
Math sqrt(discriminante)) / (2
(2*a);
a);
}
double raiz2 () {
return (-b - Math.sqrt(discriminante)) / (2*a);
}
}
29
String
z Cadena
C d
de
d caracteres
t
„ de cualquier longitud
„ tiene su sintaxis propia
{ “una cadena normal”
{ “Jose Canas (alias \”pepon\”)”
{ “Jos\u00e9 Ca\u00f1as (alias \042pep\u00f3n\042)”
„ caracteres especiales
{ \n \r \t \” \\
{ \ooo
octal
{ \uxxxx
hexadecimal (unicode - iso10646)
30
String
z Operaciones
O
i
„ concatenación: +, +=
„ saludo.equals(nombre) o
saludo.compareTo(mensaje)
„ saludo.length()
l d l
th()
„ saludo.charAt(indice)
„ crear cadena
d
desde
d d tipo
ti primitivo
i iti
toString();
t St i ()
„ imprimir en pantalla: System.out.println(saludo)
31
String
String pedro= "Lopez
Lopez, Pedro";
Pedro ;
String perico= "Lopez, Pedro";
String manolo= "Pi, Manuel";
System.out.println(pedro);
System.out.println(perico);
y
p
(p
+ " [p
[perico]");
] );
System.out.println(perico
System.out.println(manolo);
System.out.println(manolo.substring(0, 2)); // Pi
System.out.println(manolo.length());
// 10
System.out.println(pedro.equals(perico));
System.out.println(pedro.equals(manolo));
// true
// false
System.out.println(pedro.compareTo(perico));
System.out.println(pedro.compareTo(manolo));
// 0
// < 0
32
Ejercicios
z Ejercicio n.11
„ Temas:2 L
„ Dificultad:2
„ Escriba un programa que muestre el mensaje "Hola Mundo" por pantalla.¿Cuántas clases
necesitará definir p
para conseguir
g la funcionalidad deseada? ¿Cuántos métodos habrá que
q
definir como mínimo?
í
z Ejercicio n.16
„ Temas:2 3
„ Dificultad:5
„ Escriba un programa que reciba como argumento el radio de una circunferencia y calcule (y
muestre por pantalla) la longitud de la circunferencia y el área del círculo delimitado por la
misma. Utilice 3.141592 como valor de la constante PI.
z Ejercicios complementarios
„ Método distancia de la clase punto
„ Métodos
Mét d perimetro
i t y area de
d la
l clase
l
R t
Rectangulo
l
„ Definir el Rectangulo como p3, base y latura
33
Descargar