Download Introducción a la programación orientada a objetos en Java

Document related concepts
no text concepts found
Transcript
Departamento de Sistemas Telemáticos y Computación
(GSyC)
Introducción a la
programación orientada a
objetos en Java
Katia Leal Algara
2012-2013
[email protected]
http://gsyc.escet.urjc.es/~katia/
0
Introducción a Java
¿Qué es Java?
 Lenguaje de programación de propósito
general, pero orientado a objetos
 Creado por la empresa Sun MicroSystems
 Estaciones de trabajo UNIX, sistema operativo
Solaris, estándar RPC, sistema de ficheros en
red NFS, servicio de información en red NIS …
 Objetivo: tomando como referencia C++,
diseñar Java para ser pequeño, simple e
independiente de la plataforma de
ejecución
Java = lenguaje de programación +
intérprete + API
GSyC 2013 - Introducción a la POO en Java
1
Introducción a Java
¿Qué es Java?
 Programador: escribe aplicaciones en las que
podrá usar paquetes predefinidos en la API de Java
 Programa Java: se compila con el compilador de
Java generando código bytecode
 Bytecode: es interpretado por la Java Virtual
Machine (JVM)
 JVM: utiliza librerías de enlace dinámico (DLLs)
necesarias para implementar la API de Java en
cada sistema operativo y hardware concreto
 API de Java: paquetes de software predefinidos
con un gran número de funciones independientes
de plataforma
 Conectividad de redes, seguridad, acceso a bases
de datos, capacidades gráficas, etc.
GSyC 2013 - Introducción a la POO en Java
2
Introducción a Java
Carácterísticas del lenguaje Java
 ¡Realmente OO!
 Los objetos se manejan de forma pura y simple, no como
estructuras de datos disponibles para el programador
 No pueden definirse procedimientos ni funciones
 No existen las estructuras, unios o las definiciones de tipos
 Todo son clases u objetos, menos las operaciones básicas
(while, for, …) y los tipos básicos (int, float, boolean, …)
 Ofrece jerarquía de clases, herencia, encapsulación y
polimorfismo
 Independiente de plataforma
 El código fuente puede ser compilado en cualquier máquina
independientemente del fabricante o del sistema operativo
 Una vez compilada, una aplicación escrita en Java puede
ejecutarse en cualquier máquina sin necesidad de recompilar
el código fuente
 El código binario generado se denomina bytecode
GSyC 2013 - Introducción a la POO en Java
3
Introducción a Java
Carácterísticas del lenguaje Java
 Robusto y fiable
 No proporciona conversión automática de tipos, el
programador lo debe de hacer de forma explícita en el
código
 Para el programador los punteros no existen, aunque
internamente los tipos de Java se implementan como
punteros
 El acceso a los objetos de realiza declarándolos, utilizando
una referencia explícita
 Interpretado y portable
 Aunque el código interpretado se ejecuta más lentamente
que el compilado, tiene la ventaja de ser portable
 En aquellos casos en los que sea absolutamente necesario
el uso de código nativo, existen compiladores just-in-time
(JIT) que traducen el bytecode a código nativo
GSyC 2013 - Introducción a la POO en Java
4
Introducción a Java
Gestión de memoria
 No se puede reservar memoria de forma explícita,
salvo mediante la creación de nuevos objetos
 Igual que no se reserva memoria, tampoco es
preciso liberarla, de eso se encarga el recolector
de basura (Garbage Collector)
 Este proceso se ejecuta de forma automática y en
segundo plano, aunque el programador puede invocarlo
directamente en el código
 El intérprete de Java lleva la cuenta del número de
referencias a cada objeto en la memoria
 Cuando el número de referencias de un objeto es cero, en
la siguiente recolección de basura, dicho objeto será
destruido, liberándose la memoria que ocupa
GSyC 2013 - Introducción a la POO en Java
5
Introducción a Java
Aplicaciones y Applets
 Un applet es un programa dinámico e interactivo
que se ejecuta dentro de una página web:
 Tanto la página como el applet se visualizan por medio de
un navegador web con soporte para Java
 El applet, al igual que la página web, se descarga de
internet y se ejecuta de forma local en el navegador web
 El primer applet que se escribió en Java fue …
… la mascota de Java, Duke, agitando la mano.
GSyC 2013 - Introducción a la POO en Java
6
Introducción a Java
Aplicaciones y Applets

World Wind es un applet en código abierto de la NASA que hace
un uso intensivo de OpenGL para proporcionar un mapa detallado
en 3D del mundo

Desarrollado con JOGL (Java OpenGL): librería que permite
utilizar OpenGL dentro de Java
Otra librería también muy popular para Java es LWJGL
(Lightweight Java Game Library)

GSyC 2013 - Introducción a la POO en Java
7
Introducción a Java
Aplicaciones y Applets
 Una aplicación es un programa general
escrito en el lenguaje Java:
 No requiere de un navegador para ejecutarse, si
no de la JVM
 A diferencia de los applets, no tienen por qué
tener asociado un contexto gráfico y un interfaz
de usuario
GSyC 2013 - Introducción a la POO en Java
8
Introducción a Java
Java y JavaScript
 JavaScript es un lenguaje para la creación de
scripts:
 Es un lenguaje interpretado
 El código escrito en JavaScript se encuentra dentro de
documentos HTML
 Es el navegador (un intérprete de JavaScript incluido en el
mismo) el que se encarga de ejecutarlo
GSyC 2013 - Introducción a la POO en Java
9
Introducción a Java
Java y JavaScript
 JavaScript tiene una sintaxis similar a C:
 Débilmente tipado, en la declaración de las
variables no es necesario especificar su tipo
 Realiza conversión automática de tipos
GSyC 2013 - Introducción a la POO en Java
10
Entorno de desarrollo de Java
JDK: Java Development Kit




Javac: compilador de Java
Java: intérprete de Java (JVM)
Jdb: depurador de Java
Javadoc: generador automático de
documentación
 …
 Existen muchos entornos de desarrollo
integrados (IDEs), como Eclipse, que
integran distintas herramientas en un
mismo paquete: editor, compilador,
depurador, etc. Todo ello en un entorno
GSyC 2013
- Introducción a la POO en Java
gráfico.
11
Sintaxis básica de Java
Introducción
 Conceptos no específicamente ligados a la POO
 Sintaxis inspirada en C/C++: sin punteros …
 Aplicación Java: conjunto de clases e interfaces
que se agrupan en paquetes
 Las clases e interfaces se organizan en ficheros
con extensión .java
 Debe existir una clase que contenga el programa
principal, asociado a un método main que se
ejecuta cuando se inicia la aplicación
 Por último, una aplicación debe importar todas
aquellas clases, interfaces y/o paquetes que
necesite para su implementación
GSyC 2013 - Introducción a la POO en Java
12
Sintaxis básica de Java
El método main()
 Toda aplicación debe tener una clase principal con
un método main que es el primero que se ejecuta
cuando se inicia el programa
 Definición del método :
public static void main(String []args)
 public: visible en todo el programa y desde el
exterior para poder ser ejecutado por la JVM
 static: se aplica a toda la clase y no a objetos o
instancias de la misma
 void: al ser el primer método en ejecutarse no
puede devolver ningún valor, nadie lo recogerá
 args: lista de argumentos pasados por la línea de
comandos
GSyC 2013 - Introducción a la POO en Java
13
Sintaxis básica de Java
Variables
 Variables: se definen mediante un nombre, un tipo y un
ámbito
 Variables miembro o atributos
 Representan datos específicos de cada clase y diferencian
unos objetos de otros
 Los atributos comunes a todos los objetos de una clase se
denominan Variables de clase y van precedidas del
modificador static
 Variables locales a un ámbito
 Necesarias para almacenar valores intermedios
 Desaparecen una vez que el bloque o método en el que
fueron definidas deja de existir
 Variables instancia
 Se corresponden con los objetos propiamente dichos
 Resultado de declarar una variable como perteneciente a una
clase y dando valor a sus atributos
 No existen variables globales
GSyC 2013
2012 - Introducción a la POO en Java
14
Sintaxis básica de Java
Declaración de variables
int edad;
String nombre, apellido1, apellido2;
boolen esCierto = false;
GSyC 2013
2012 - Introducción a la POO en Java
15
Sintaxis básica de Java
Tipo de una variable
El tipo de una variables puede ser
El nombre de una clase
Uno de los tipos simples:
Numéricos, caracteres y booleanos
No se tratan como objetos por eficiencia y
sencillez de uso
No obstante, estos tipos también pueden
ser usados como clases al estar definidos
en la API de Java (paquete java.lang)
GSyC 2013
2012 - Introducción a la POO en Java
16
Sintaxis básica de Java
Tipos numéricos
 Enteros
byte, 1 byte [-128..127]
short, 2 bytes [-32.768..32.767]
int, 4 bytes [2.147.483.648..2.147.483.647]
long, 8 bytes
 Coma flotante
float, de 32 bits
double, de 64 bits
 La conversión automática de tipos sólo se produce
cuando el compilador determina que el destino es lo
suficientemente grande. En caso contrario, se
necesita una conversión explícita o casting
GSyC 2013
2012 - Introducción a la POO en Java
17
Sintaxis básica de Java
Tipo carácter
char
Identifica caracteres individuales
16 bits sin signo, representa
Unicode
Aunque no se utilicen como enteros,
es posible operar con ellos como si lo
fueran, sumándolos, incrementando
su valor, etc.
GSyC 2013
2012 - Introducción a la POO en Java
18
Sintaxis básica de Java
Tipo booleano
boolean
true o false
Es el resultado que devuelven
todos los operadores lógicos
GSyC 2013
2012 - Introducción a la POO en Java
19
Sintaxis básica de Java
Array
 Grupo de variables con el mismo tipo a los que nos
referimos con el mismo nombre
 Podemos declarar y luego crear el array:
int [] edades;
edades = new int[10];
 O hacer ambas cosas a la vez:
String titulos[] = new String[10];
 También podemos declarar e inicializar:
String titulos[] = {“Hamlet”, “Macbeth”,
“El Quijote”, “Drácula”};
int edades = {18, 45, 26, 3, 22, 44};
¿Dimensión del array?
GSyC 2013
2012 - Introducción a la POO en Java
20
Sintaxis básica de Java
Arrays multidimensionales
int matriz[][] = new int[10][20];
 ¿Cómo podemos acceder a los elementos
de un array?
matriz[i][j] = 0;
títulos[i+1];
GSyC 2013
2012 - Introducción a la POO en Java
21
Sintaxis básica de Java
Ámbito de una variable
 Los bloques de sentencias compuestas se
delimitan con dos llaves { }
 Las variables sólo son válidas desde el punto
donde están declaradas hasta el siguiente }
 Como se pueden anidar sentencias compuestas,
cada una puede tener su propio conjunto de
variables locales
 Un bloque interno ve las variables declaradas por
encima de él, pero no al contrario
public static void main(String args[])
{
int mi_variable = 1;
{
int mi_variable; // ¿error?
}
}
GSyC 2013
2012 - Introducción a la POO en Java
22
Sintaxis básica de Java
Comentarios
 De una sola línea:
// Comentario de una sola línea
 Multilínea:
/* Comentario
multilínea */
 Comentarios javadoc: en caso de que
queremos generar documentación
automática, utilizaremos
/** Comentario javadoc*/
GSyC 2013
2012 - Introducción a la POO en Java
23
Sintaxis básica de Java
Expresiones y Operadores
 Asignaciones con operadores aritméticos
x += y
x=x+y
x -= y
x=x-y
x *= y
x=x*y
x /= y
x=x/y
 Operadores aritméticos
+
Operador suma
-
Operador resta
*
Operador multiplicación
/
Operador división
%
Operador módulo
GSyC 2013
2012 - Introducción a la POO en Java
24
Sintaxis básica de Java
Expresiones y Operadores
 Operadores de comparación
==
Igualdad
!=
Distinto
>
Mayor que
<
Menor que
>=
Mayor o igual
<=
Menor o igual
 Operadores lógicos
&&
AND
||
OR
^
XOR
!
NOT
GSyC 2013
2012 - Introducción a la POO en Java
25
Sintaxis básica de Java
Expresiones y Operadores
 Operadores de bit
&
AND
|
OR
^
XOR
<<
Desplazamiento a la izqda
>>
Desplazamiento a la dcha
>>> Dpl. dcha relleno de ceros
~
Complemento a 1
GSyC 2013
2012 - Introducción a la POO en Java
26
Sintaxis básica de Java
Precedencia de operadores
operadores posfijos
op++ op--
operadores unarios
++op --op +op -op ~ !
multiplicación y división
*/%
suma y resta
+-
desplazamiento
<< >> >>>
operadores relacionales
< > <= =>
equivalencia
== !=
operador AND
&
operador XOR
^
operador OR
|
AND booleano
&&
OR booleano
||
condicional
operadores de asignación
?:
= += -= *= /= %= &= ^= |= <<= >>= >>>=
GSyC 2013
2012 - Introducción a la POO en Java
27
Sintaxis básica de Java
Operadores de Strings
 Se pueden concatenar dos cadenas de caracteres
mediante el operador ʻ+ʼ
 Como resultado se crea un nuevo String
 Si alguno de los operandos no es un String, se convierte,
siempre que se trate de un objeto perteneciente a una
clase que tenga implementado el método toString().
 También se puede utilizar el operador ʻ+=ʻ
String nombre = “Katia”;
nombre += “ Leal”;
nombre = nombre + “Leal”;
GSyC 2013
2012 - Introducción a la POO en Java
28
Sintaxis básica de Java
Estructuras de control de flujo: if - else
if (condición)
{
sentencia1;
…
sentencia_n;
}
else // Esta rama no es obligatoria
{
sentencia_x;
…
sentencia_y;
}
 Operador if-else ʻ?ʼ
variable = (expresión booleana) ? expreCierta : expreFalsa
int minimo = x<y ? x : y;
GSyC 2013
2012 - Introducción a la POO en Java
29
Sintaxis básica de Java
Estructuras de control de flujo: switch
switch( expresión ) {
case constante1:
sentencia1;
...
break;
...
case constanteN:
sentenciaN;
...
break;
default:
sentencia;
...
break
}
GSyC 2013
2012 - Introducción a la POO en Java
30
Sintaxis básica de Java
Estructuras de iteración: for
int[] enteros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int i = 0; i < 10; i ++)
{
System.out.println(enteros[i]);
}
GSyC 2013
2012 - Introducción a la POO en Java
31
Sintaxis básica de Java
Estructuras de iteración: while
boolean prueba = true;
while (prueba)
{
System.out.println("Esto lo
verás muchas
veces");
}
while (prueba)
{
System.out.println("Esto lo verás una vez");
prueba = false;
}
GSyC 2013
2012 - Introducción a la POO en Java
32
Sintaxis básica de Java
Estructuras de iteración: do-while
int numero = 4557888;
int digitos = 0;
do
{
numero /=10;
digitos++;
}
while (numero > 0);
System.out.println(digitos);
GSyC 2013
2012 - Introducción a la POO en Java
33
Sintaxis básica de Java
Sentencia break
 Cuando es necesario salir de un bucle sin esperar a que se
cumpla la condición, como en caso de error, podemos utilizar
esta sentencia
 Provoca la salida del bloque más interno que la contenga, al
bloque inmediatamente anterior
for (int i = 1; i < 5; i++)
{
for (int j = 1; j < 5; j++)
{
if (j == 3)
break; //salimos al bucle anterior
}
}
GSyC 2013
2012 - Introducción a la POO en Java
34
Sintaxis básica de Java
Sentencia continue
 Provoca que se dejen de ejecutar las sentencias de su
bloque, se regresa al punto en que se comprueba la
condición
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (j > i)
{
System.out.println(“ ”);
continue;
}
System.out.println(“ ” + (i * j));
}
}
GSyC 2013
2012 - Introducción a la POO en Java
35
Sintaxis básica de Java
Sentencia return
 Java utiliza métodos en lugar de procedimientos y funciones
 Los métodos también necesitan ser invocados y en
ocasiones tienen que devolver un valor, retornando al punto
en que fueron llamados
return value; // El método devuelve algún dato
return; // Queremos salir sin devolver valor antes
// del fin del código
GSyC 2013
2012 - Introducción a la POO en Java
36
Sintaxis básica de Java
Casting
 Convertir una variables de un tipo origen en otro
tipo destino
 Sólo puede realizarse entre tipos básicos o en una
jerarquía de herencia
int cuenta1 = 0;
float cuenta2 = (float) cuenta1;// cuenta2 = 0.0
GSyC 2013
2012 - Introducción a la POO en Java
37
Programación orientada a objetos en Java
Introducción
 Un POO está compuesto de varios objetos
que presentan una serie de propiedades,
atributos, y unas cuantas operaciones que
saben como realizar, métodos
 Objeto = estado + comportamiento
 Una vez construido, un objeto se puede
integrar donde nos haga falta:
Encapsulación
Reusabilidad
GSyC 2013
2012 - Introducción a la POO en Java
38
Programación orientada a objetos en Java
Introducción
 Encapsulación
 Los objetos deben presentar un diseño fuerte de su
interfaz, ocultando los detalles de su implementación
 Los objetos no deben cambiar el modo en el que se
solicite realizar una determinada tarea
 Cuando aprendemos a conducir un coche, luego somos
capaces de conducir cualquiera, ¿por qué?
 La encapsulación permite que el control de errores sea más
fácil
 Los objetos conocer mejor que nadie los datos que guardan y
podrán saber si existen inconsistencias
 Un objeto de una clase jamás podrá modificar directamente
los atributos de otra, tendrá que pedírselo al objeto que los
guarda invocando el/los método/s correspondiente/s
GSyC 2013
2012 - Introducción a la POO en Java
39
Programación orientada a objetos en Java
Introducción
 Reusabilidad
 Tenemos que programar los objetos de tal
manera que solo realicen aquellas funciones
que les son inherentes
 De esta forma podremos reutilizar código
fácilmente sin tener que inventar la rueda
continuamente
 Un órgano del cuerpo humano se puede
donar puesto que realizará la misma
función en otro cuerpo
GSyC 2013
2012 - Introducción a la POO en Java
40
Programación orientada a objetos en Java
Clases
 Plantilla o molde a partir del cual se construyen los
objetos
 La clase define una serie de propiedades comunes
a todos los objetos que pertenecen a ella,
atributos
 También define el conjunto de operaciones que se
pueden realizar sobre dichos objetos, métodos
 Ejemplos de clases: un coche, una casa, un
órgano humano, un árbol …
 El valor que tomen los atributos para las distintas
instancias de una clase, objetos, es lo que
permitirá distinguirlas
GSyC 2013
2012 - Introducción a la POO en Java
41
Programación orientada a objetos en Java
Creación de una clase
modificadores_de_clase class Nombre_Clase
 Modificadores
 abstract: concepto relacionado con la herencia
 public: todas aquellas clases que pueden ser referencias
fuera de su paquete
 final: concepto relacionado con la herencia
class MiClase
{
// declaración de atributos
…
// declaración de métodos
…
}
GSyC 2013
2012 - Introducción a la POO en Java
42
Programación orientada a objetos en Java
Creación de una clase: atributos
modificadores Nombre_Clase nombre_atributo;
 Los modificadores pueden ser static y final
class MiClase
{
// declaración de atributos
Fecha fecha_de_compra;
int
año_de_compra;
}
// declaración de métodos
…
GSyC 2013
2012 - Introducción a la POO en Java
43
Programación orientada a objetos en Java
Creación de una clase: métodos
modificadores tipo_resultado nombre_método(tipo1 arg1, …, tipoN argN)
{
// Implementación del método
}
class Coche
{
// atributos
int
numero_de_puertas;
Color color;
Fecha fecha_matriculación;
String matrícula;
int
velocidad_actual;
}
// métodos
void acelerar(int incremento) {}
void frenar(int decremento) {}
void pintar(String nuevo_color) {}
int get_numero_puertas() {}
GSyC 2013
2012 - Introducción a la POO en Java
44
Programación orientada a objetos en Java
Instancias u Objetos
 Los objetos resultan de concretar el valor de los
atributos que se definen en una clase
 Así, podremos tener dos objetos de la clase Coche
que para el atributo color uno sea rojo y el otro sea
gris
 Estado de un objeto: valor concreto de los
atributos en un instante de tiempo determinado
 El estado de un objeto afecta a su comportamiento
 Si un pedido está pagado no puede aceptar nuevos
artículos
 Si es un pedido vacío no le pueden borrar artículos
puesto que no los tiene
GSyC 2013
2012 - Introducción a la POO en Java
45
Programación orientada a objetos en Java
Instancias u Objetos: Creación
Como cualquier otra variable, un objeto de una clase se crea
en dos pasos:
Declaración:
Coche mi_coche;
Inicialización o creación propiamente dicha:
mi_coche = new Coche();
Finalmente, podemos hacer ambas cosas a la vez:
Coche mi_coche = new Coche();
Para referirnos a los objetos o atributos de una clase
utilizamos el ʻ.ʼ:
mi_coche.matrícula = “0212 CGH”;
System.out.println(“Mi coche tiene ” +
mi_coche.get_numero_puertas() + “ puertas.”);
GSyC 2013
2012 - Introducción a la POO en Java
46
Programación orientada a objetos en Java
Constructor de una clase
El constructor es un método especial que tienen todas las clases
Cuando creamos una instancia de una clase y se invoca a new, lo
que hacemos es invocar a uno de los constructores de dicha clase
El constructor debe tener exactamente el mismo nombre que la clase
El método constructor realiza tareas de inicialización, como dar valor
a los atributos
Java define un constructor por defecto para todas las clases:
 Este constructor no recibe argumentos
 Los atributos se inicializan a los valores por defecto que corresponde a
su tipo (a cero los números, a null los objetos, a false los booleanos y al
carácter nulo ʻ\0ʼ los caracteres)
Suele resultar interesante tener varios constructores a medida
En muchas ocasiones, la primera línea de un constructor suele
invocar a otros constructores de la clase: this
this: entre otras cosas, actúa como sustituto del nombre del
constructor de una clase
GSyC 2013
2012 - Introducción a la POO en Java
47
Programación orientada a objetos en Java
Constructor de una clase
class Cliente
{ // atributos
String nombre_cliente;
int
numero_cuenta;
int
compras_efectuadas = 1;
int
bonus_acumulado;
// constructores
Cliente (String nombre)
{
this(nombre, Cuenta.obtener_nuevo_numero());
}
Cliente (String nombre, int num_cuenta)
{
nombre_cliente = nombre;
numero_cuenta = num_cuenta;
}
// métodos
public void apuntar_compra()
{
compras_efectuadas = compras_efectuadas + 1;
}
public void bonificar(int bonus)
{
bonus_acumulado = bonus_acumulado + bonus;
}
public String get_nombre()
{
return nombre_cliente;
}
}
GSyC 2013
2012 - Introducción a la POO en Java
48
Programación orientada a objetos en Java
Destructor de una clase
En contraposición a los constructores, el método
finalize() se ejecuta cuando un método es
eliminado de la memoria por el recolector de basura
No lleva asociada ninguna acción por defecto
Deberá ser sobreescrito por aquellas clases que
necesiten un proceso de finalización especial
Por ejemplo:
 La clase FileInputStream utiliza el método
finalize() para cerrar el Stream
 La clase DatagramSocket sobreescribe el método
finalize() para añadir un proceso adicional necesario
para cerrar el socket
GSyC 2013
2012 - Introducción a la POO en Java
49
Programación orientada a objetos en Java
This
this se utiliza para referirse al objeto
actual
1.Cuando queremos llamar a un método
pasándole como parámetro el objeto
actual
2.Para resolución de variables dentro de un
ámbito: diferenciar parámetros de los
atributos de la clase con el mismo
identificador
3.Para invocar, dentro de un constructor, a
otro constructor de la misma clase
GSyC 2012
2013 - Introducción a la POO en Java
50
Programación orientada a objetos en Java
This
class Cliente
{
int codigo_cliente;
Cliente(int codigo_cliente)
{
this.codigo_cliente = codigo_cliente;
}
public void apuntarCompra(Pedido P){…}
…
} // class
class Pedido
{
Cliente c;
int codigo_pedido;
public void asignarAlCliente()
{
c.apuntarCompra(this);
}
} // class
GSyC 2012
2013 - Introducción a la POO en Java
51
Programación orientada a objetos en Java
Paquetes
 Las clases e interfaces en Java se
organizan en paquetes a modo de
librería
Las estructuras de paquetes siguen
un esquema de árbol que garantiza la
unicidad en el nombre de los paquetes
Cuando una clase no pertenece a un
paquete, se asocia al paquete por
defecto, el cuál está asociado al
directorio que contiene ese código
GSyC 2013
2012 - Introducción a la POO en Java
52
Programación orientada a objetos en Java
Paquetes: cómo escribir un paquete
 En Java no son necesarios los
ficheros de cabecera
Para indicar que una clase o interfaz
pertenece a un paquete, hay que poner
al comienzo del fichero fuente:
package nombre_paquete;
Si en un mismo fichero se escriben
varias clases o interfaces, sólo uno de
ellos puede ser declarado como público
GSyC 2013
2012 - Introducción a la POO en Java
53
Programación orientada a objetos en Java
Paquetes: uso de un paquete
 Para hacer referencia a un elemento de un
determinado paquete, tenemos dos opciones:
 Escribir el nombre completo del paquete y del
elemento en cuestión
java.awt.event.ActionEvent
 Importar el paquete para poder referenciar al
elemento sin tener que anteponer todo el
nombre del paquete que lo contiene
import java.awt.event.ActionEvent;
import java.awt.event.*;
GSyC 2013
2012 - Introducción a la POO en Java
54
Programación orientada a objetos en Java
Paquetes: cómo localiza el compilador los paquetes
 Todos los ficheros de un paquete deben localizarse
dentro de un subdirectorio que concuerde con el
nombre del paquete
 Los subdirectorios pueden colgar de cualquier
directorio contemplado en la variable de entorno
CLASSPATH
java.util : c:\jdk.x.y.z\lib ==> \java\util
(paquete)
(CLASSPATH)
(subdirectorio)
GSyC 2013
2012 - Introducción a la POO en Java
55
Programación orientada a objetos en Java
Modificadores
 Palabras reservadas que se anteponen al
nombre de una clase, método o atributo
 Su objetivo es el de imponer un
comportamiento o cualidades de las que
carecen por defecto
 A continuación veremos modificadores de
métodos y de atributos
GSyC 2013
2012 - Introducción a la POO en Java
56
Programación orientada a objetos en Java
Modificadores de acceso
 La manera en la que desde fuera se
puede referenciar a los métodos o
atributos de una clase, depende de los
modificadores que anteceden al propio
método o atributo
 Modificadores de acceso:
 public
 private
 protected
GSyC 2013
2012 - Introducción a la POO en Java
57
Programación orientada a objetos en Java
Modificadores de acceso: public
 Cuando declaramos un método o
atributo como público, estamos
permitiendo que desde cualquier otra
clase puedan referenciarlo directamente
 Desde otra clase podemos
incrementar el número de compras de
un Cliente sin más:
mi_cliente.compras_efectuadas++;
GSyC 2013
2012 - Introducción a la POO en Java
58
Programación orientada a objetos en Java
Modificadores de acceso: private
 Cuando declaramos un método o atributo
como privado, no podremos acceder al
atributo ni invocar al método desde ninguna
otra clase
mi_cliente.compras_efectuadas++; // ¿error?
GSyC 2013
2012 - Introducción a la POO en Java
59
Programación orientada a objetos en Java
Modificadores de acceso: protected
 Los atributos y métodos así
declarados son accesibles directamente
sólo desde la clase en que se
definieron, de las subclases de esta y
las clases que se encuentran dentro de
su mismo paquete
 Éste es el modificador por defecto, el
que toma un atributo o método cuando
no se especifica ningún otro
GSyC 2013
2012 - Introducción a la POO en Java
60
Programación orientada a objetos en Java
¿Qué tipo de modificador es mejor?
 Un programa que pretende ser OO debe declarar
todos los atributos de todas las clases private
 Métodos get y set
 Para que una interfáz sea fuerte, los métodos tipo
get y set serán declarados:
 public, si queremos invocarlos desde cualquier clase
 protected, si sólo queremos que sean invocados por
las clases hijas
 private, cuando no nos interesa que puedan ser
invocados desde el exterior (método que hace saltar una
alarma)
 Cuando quereamos incrementar las compras de un
Cliente, lo mejor es invocar al método apropiado:
mi_cliente.apuntarCompra();
GSyC 2013
2012 - Introducción a la POO en Java
61
Programación orientada a objetos en Java
Otros modificadores para atributos
static: un atributo así declarado se asocia
con la clase, tomando el mismo valor para
todos los objetos de dicha clase
 Una variable de este tipo se denomina variable
de clase y funciona de forma similar a las
variables globales
final: una variables con este modificador
es en realidad una constante y debe ser
inicializada antes de poder ser referenciada
private static final int BASE = 300;
public static final int SCHEDULE_NOW = BASE + 0;
System.out.println(Tag.SCHEDULE_NOW);
GSyC 2013
2012 - Introducción a la POO en Java
62
Programación orientada a objetos en Java
Otros modificadores para métodos
static: identifica a un método de clase
que sólo puede actuar y acceder sobre
métodos estáticos
 Se pueden ejecutar sin tener que crear una
instancia de la clase
y = Math.pow(x, a);
final: un método de este tipo no puede
ser sobreescrito por las subclases de la clase
a la que pertenece
 Sólo los métodos static pueden ser final
abstract: lo veremos en el apartado de
Herencia
GSyC 2013
2012 - Introducción a la POO en Java
63
Programación orientada a objetos en Java
Metodología del main
 Como el método main(…) supone un
artificio dentro de la POO, pueden surgir
algunos problemas
 La forma más recomendada de emplear el
main consiste en crear una clase que
represente a nuestra aplicación y que sólo
contenga el método main
public class MiAplicacion
{
public static void main (String args[])
{
Cliente mi_cliente;
…
}
}
GSyC 2013
2012 - Introducción a la POO en Java
64
Programación orientada a objetos en Java
Paso de parámetros en Java
 Aunque los objetos son referencias,
un método no puede cambiar el valor de
sus parámetros
 Como siempre, hay que recurrir a los
métodos de ese objeto para modificar su
estado
 Java no puede asociar a un objeto
otro diferente
GSyC 2013
2012 - Introducción a la POO en Java
65
Programación orientada a objetos en Java
Acceso protegido y clonación
 Cuando se copia una variable, el origen y la
copia son referencias al mismo objeto
Empleado pepe = new Empleado(“Pepe”, 2000, new
Fecha(2013, 25, 1), “TIC”);
Empleado mi_empleado = pepe;
mi_empleado.cambiarDepartamento(“Marketing”);
 Si lo que queremos es crear un objeto
idéntico a otro con la idea de que más
adelante sea independiente de él, hay que
utilizar el método java.lang.Object.clone()
GSyC 2013
2012 - Introducción a la POO en Java
66
Programación orientada a objetos en Java
Acceso protegido y clonación
 Para poder clonar un objeto, es necesario:
 Que la clase implemente el interfaz Cloneable
 Si la implementación que ofrece Object del
método clone no se adapta a nuestras
necesidades, habrá que redefinir dicho método
 La copia se realiza bit a bit, por lo que si el
objeto molde tiene atributos que no sean tipos
simples, el método clone no funcionará
correctamente puesto que origen y copia
seguirán teniendo variables comunes
GSyC 2013
2012 - Introducción a la POO en Java
67
Programación orientada a objetos en Java
Herencia
 En
el mundo real los objetos se relacionan unos
con otros de una manera jerárquica, compartiendo:
 características de estructura y
 comportamiento, pero
 añadiendo especialidad respecto a sus semejantes
 Cada clase define unas propiedades y un
comportamiento. Las clases que pertenecen a la
primera los compartirán, pudiendo añadir sus
cualidades particulares
 A estas clases se las conoce como subclases,
clases hijas o clases derivadas
 A la clase de la que heredan se la denomina
superclase o clase padre
GSyC 2013
2012 - Introducción a la POO en Java
68
Programación orientada a objetos en Java
Herencia
 En la POO existen dos tipos
fundamentales de herencia:
 Herencia de implementación,
extends
 Herencia de interfaz,
implements
GSyC 2013
2012 - Introducción a la POO en Java
69
Programación orientada a objetos en Java
Herencia de implementación
 Consiste en establecer una jerarquía de
clases de modo que la clase hija hereda los
atributos y métodos de la clase padre
pudiendo añadir métodos y atributos propios
 La subclase hará las cosas como su padre:
podemos invocar a métodos no definidos en
ella pero sí en algunas de las clases que la
preceden en la jerarquía
 El compilador ascenderá niveles en la jerarquía
hasta encontrar el método invocado
GSyC 2013
2012 - Introducción a la POO en Java
70
Programación orientada a objetos en Java
Herencia de implementación
 Si una subclase necesita hacer las cosas
de forma diferente a su clase padre, podrá
redefinir los métodos necesarios
 Todos los Animales respiran, pero los
Mamíferos lo hacen por medio de pulmones y
los Peces por medio de branquias. Podemos
redefinir el método respirar() en cada una de
ellas para contemplar esta particularidad
GSyC 2013
2012 - Introducción a la POO en Java
71
Programación orientada a objetos en Java
Herencia de implementación
 No
debe utilizarse este tipo de herencia a menos
que todos los atributos y métodos tengan sentido
 No es conveniente que existen jerarquías de
herencia de muchos niveles (más de cuatro)
 Al igual que C++, no permite la herencia múltiple
class MiClaseHija extends MiClasePadre
{
// atributos propios de la clase hija
// métodos propios de la clase hija
// métodos redefinidos
}
GSyC 2013
2012 - Introducción a la POO en Java
72
Programación orientada a objetos en Java
Herencia de implementación
 Por defecto, todas las clases heredan de la
superclase Object, definida en el paquete
java.lang
 Es posible asignar un objeto subclase a
una variable perteneciente a la superclase
Empleado primer_empleado;
Directivo jefe = new Directivo(…);
primer_empleado = jefe;
GSyC 2013
2012 - Introducción a la POO en Java
73
Programación orientada a objetos en Java
Herencia de implementación: super
 Se utiliza en una clase hija para
referenciar métodos y atributos de una
clase padre
super.atributo;
super.metodo(…);
 El uso más generalizado se realiza
desde el constructor de la clase hija
GSyC 2013
2012 - Introducción a la POO en Java
74
Programación orientada a objetos en Java
Herencia de implementación: super
class Empleado
{
String nombre;
int sueldo;
Fecha fecha_contrato;
public Empleado(String nombre, int salario, Fecha alta)
{
this.nombre = nombre;
sueldo = salario;
fecha_contrato = alta;
}
public void despedir(…)
{
}
}
class Directivo extends Empleado
{
String nombre_secretaria;
public Directivo(String nombre, int salario, Fecha alta)
{
super(nombre, salario, alta);
nombre_secretaria = “”;
}
}
GSyC 2013
2012 - Introducción a la POO en Java
75
Programación orientada a objetos en Java
Herencia de implementación: final
 Si
por motivos de seguridad no nos interesa que
una clase pueda tener descendencia, la podemos
declarar con final
final class MiClaseSinHijos
{
// atributos
// métodos
}
 Si queremos evitar que una clase hija redefina un
método implementado por la clase padre, tenemos
que añadir final a la declaración del método
 Por defecto, en una clase final todos los métodos
son finales
GSyC 2013
2012 - Introducción a la POO en Java
76
Programación orientada a objetos en Java
Herencia de implementación: private Vs protected
 Los atributos presentes en una clase
padre, ¿deben declararse private o
protected?
 Aun en una jerarquía de herencia, el
acceso a los atributos de la clase padre
se debe llevar a cabo a través de
métodos get y set
GSyC 2013
2012 - Introducción a la POO en Java
77
Programación orientada a objetos en Java
Herencia de interfaz
 La herencia de interfaz según la POO
consiste en establecer una jerarquía en al que
las clases superiores e intermedias definen un
comportamiento que se concretará en la clase
situada en el nivel más inferior
 Los métodos se declaran en las clases
padres y se implementan en las hijas
 Las clases así definidas no están
destinadas a tener instancias de sí mismas
 Se trata más bien de plantillas o patrones
para crear clases más específicas
GSyC 2013
2012 - Introducción a la POO en Java
78
Programación orientada a objetos en Java
Herencia de interfaz: abstract
clase declarada como abstract posee al
menos un método abstracto
 Un método abstracto es un método que no se
implementa en la clase que lo declara, obligando a
que sean las clases hijas quienes lo hagan
 Una
modificador_de_acceso abstract class MiClaseAbstracta
{
// atributos
// métodos implementados
// métodos abstractos
modificador_acceso abstract tipo_resultado metodo1(…);
} // class
GSyC 2013
2012 - Introducción a la POO en Java
79
Programación orientada a objetos en Java
Herencia de interfaz: abstract
 Implementación
de la clase MensajeEscrito que
hereda de Mensaje
public class MensajeEscrito extends Mensaje
{
int longitud_mensaje;
String texto;
MensajeEscrito(String mensaje, String remite)
{
super(remite);
texto = mensaje;
}
public void reproducir()
{
System.out.println(texto);
}
} // class
GSyC 2013
2012 - Introducción a la POO en Java
80
Programación orientada a objetos en Java
Herencia de interfaz: interfaces
 La
forma más adecuada de implementar la
herencia de interfaz es por medio de interfaces
 Un interfaz es similar a una clase pero:
 No tiene atributos
 Contiene declaraciones de métodos sin implementar
 Un interfaz define un comportamiento
 Una clase puede heredar de múltiples
interfaces: un objeto se puede comportar de varias
maneras
 Una persona puede ser informático y también
puede jugar al baloncesto
 Para la declaración de un interfaz se utiliza la
palabra reservada interface
GSyC 2013
2012 - Introducción a la POO en Java
81
Programación orientada a objetos en Java
Herencia de interfaz: interfaces
 La forma más adecuada de implementar la herencia de
interfaz es por medio de interfaces
 Un interfaz es similar a una clase pero:
 No tiene atributos
 Contiene declaraciones de métodos sin implementar
 Un interfaz define un comportamiento
 Una clase puede heredar de múltiples interfaces: un
objeto se puede comportar de varias maneras
 Una persona puede ser informático y también puede jugar
al baloncesto
 Para la declaración de un interfaz se utiliza la palabra
reservada interface
 Una clase que hereda de un interfaz utiliza la palabra
reservada implements
GSyC 2013
2012 - Introducción a la POO en Java
82
Programación orientada a objetos en Java
Herencia de interfaz: interfaces
public interface Mensaje
{
public void reproducir();
public String getRemitente();
}
public class MensajeEscrito implements Mensaje
{
String texto;
String remitente;
MensajeEscrito(String mensaje, String remite)
{
remitente = remite;
texto = mensaje;
}
public void reproducir()
{
}
public String getRemitente()
{
return remitente;
}
} // class
GSyC 2013
2012 - Introducción a la POO en Java
83
Programación orientada a objetos en Java
Herencia de interfaz: extends
 Jerarquía de herencia por interfaz
 Cada interfaz que se añade a la cadena declara los
métodos que añade
 Es responsabilidad de la clase que hereda del último
interfaz la implementación de todos los métodos declarados
en la jerarquía
public interface Interfaz1
{
public void método1(parámetros);
}
public interface Interfaz2 extends Interfaz1
{
public void método2(parámentros);
}
GSyC 2013
2012 - Introducción a la POO en Java
84
Programación orientada a objetos en Java
Herencia de implementación Vs Herencia de interfaz
 Aunque no existe una respuesta universal, las tendencias
en POO se inclinan hacia la herencia de interfaz
 Los interfaces favorecen la reusabilidad: con elllos el grado
de especialización de un objeto se alcanza únicamente en él
mismo, no tomando carácterísticas de otras clases
precedentes en la jerarquía
 Nuevo mensaje, MensajeAudiovisual
 Los interfaces son robustos frente a los cambios: cuando
en un programa tenemos algoritmos que cambian con relativa
frecuencia, tendremos bien aislados los puntos sensibles y
sabremos que no interaccionan con los demás
 Empleado implementa el método subirSueldo() y tiene dos
clases hijas, Directivo y Programador. Si a los directivos se
les sube el sueldo con un criterio diferente al resto de
empleados, tendremos que reescribir el método en la
subclase Directivo teniendo cuidado de las llamadas a super
GSyC 2013
2012 - Introducción a la POO en Java
85
Programación orientada a objetos en Java
Herencia de implementación Vs Herencia de interfaz
 Los interfaces permiten que un objeto presente
varios comportamientos de manera simultánea
 Cuando se usan interfaces, la llamada a los
métodos en tiempo de ejecución se realiza a través
de una búsqueda dinámica
Mensaje m = new MensajeEscrito();
m.reproducir();
 Los interfaces obligan al programador a escribir
más código, pero a la larga compensa en términos
de reusabilidad y de mantenimiento de las
aplicaciones
GSyC 2013
2012 - Introducción a la POO en Java
86
Programación orientada a objetos en Java
Casting
 Convertir una variable de un tipo origen en otro destino
 El casting sólo puede realizarse entre tipo básicos o en una
jerarquía de herencia
int cuenta1 = 4;
float cuenta2 = (float) cuenta1; // cuenta2 = 4.0
 En una jerarquía de herencia solo se puede realizar de una clase
hija a la clase padre
Directivo jefe = new Directivo(…);
Empleado mi_empleado = (Empleado)jefe;
 Mentir en un casting generará una excepción en tiempo de
ejecución
 Para saber si un objeto está en la jerarquía de herencia de otro
se utiliza la palabra reservada instanceof
Empleado e1 = new Empleado();
if (e1 instanceof Directivo)
{
jefe = e1;
}
GSyC 2013
2012 - Introducción a la POO en Java
87
Programación orientada a objetos en Java
Sobrecarga
 Concepto que permite que un método tenga múltiples
implementaciones que se seleccionan en virtud del número y
tipo de los parámetros que recibe el método, lo cual se
conoce como sobrecarga del método
class Perro
{
public void oler(Comida c)
{
System.out.println(“¡Me gusta la comida!”);
}
public void oler(Gato g)
{
System.out.println(“¡Odio a los gatos!”);
}
} // class
GSyC 2013
2012 - Introducción a la POO en Java
88
Programación orientada a objetos en Java
Polimorfismo
 Posibilidad de enviar un mensaje a un grupo de
objetos cuya naturaleza puede ser heterogénea
 La clase Animal tiene el método abstracto
mover() que se implementa de forma distinta en
cada una de las subclases Pez y Ave. Entonces, un
tercer objeto puede enviar el mensaje mover() a un
grupo de objetos Pez y Ave por medio de una
variable de referencia de clase Animal, haciendo
así un uso polimórfico de dichos objetos respecto
del mensaje mover()
GSyC 2013
2012 - Introducción a la POO en Java
89