Está en la página 1de 40

Representación de Datos

Repaso
Orientación a Objetos y Herencia

M. Carmen Fernández Panadero


Julio Villena Román
{mcfp, jvillena}@it.uc3m.es

Índice

1. ¿De qué estamos hablando?


2. Java es un lenguaje de programación orientado a
objetos:
– Objetos y clases
OO – Variables y métodos
– Modificadores de acceso, constructores y método main
3. Más orientación a objetos:
• Herencia
• Reescritura, sobrecarga…
4. Sintaxis del lenguaje:
• Operadores
Leng.
• Arrays
Prog.
• Strings
• Control de flujo de programa: condicionales y bucles
• Excepciones

1
1. ¿De qué estamos hablando?

Arquitectura de Fase I: Editar


Fase II: Compilar
desarrollo
Editores Compiladores

Notepad

Herramientas
de Desarrollo Grasp JDK
- Netbeans (JDK) Código
Bytecode
- Visual J++ Java
- Visual .Net Otros
- Visual Café fichero.java fichero.class
- Java Workshop
- J Builder
- Visual Age
javac fichero.java
Otros

2
Una Aplicación Básica en Java

// Aplicación de ejemplo
// “Hola Mundo”
// 1 2
class HolaMundo{
public static void main(String args[]){
System.out.println(“Hola Mundo”); HolaMundo.class
}
}
HolaMundo.java
Hola Mundo
1. Compilamos: javac HolaMundo.java

2. Ejecutamos: java HolaMundo

Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public static void main(String args[]){
System.out.println(“Hola Mundo”);
}
}
Comentarios (3 tipos)
// Para comentar una línea
/*Para comentar
una línea o más*/
/**Para documentación usando javadoc*/

3
Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public static void main(String args[]){
System.out.println(“Hola Mundo”);
}
}

Declaración de la clase
El nombre de la clase (que debe ser igual que el del
fichero fuente HolaMundo.java) se utiliza para crear
el fichero class en el mismo directorio en el que se
compila la aplicación.

Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public static void main(String args[]){
System.out.println(“Hola Mundo”);
}
}
Método main
• Es el método que busca el intérprete para
ejecutar en primer lugar.
• Se le pasa como argumento un array de
objetos String llamado args.

4
Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public
public static void main(String args[]){
System.out.println(“Hola Mundo”);
}
}
public
• Indica la accesibilidad del método. Un método
público puede ser llamado por cualquiera
incluyendo el intérprete java.

Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public static
static void main(String args[]){
System.out.println(“Hola Mundo”);
}
}
static
• Indica al compilador que main es un método de
clase, es decir se refiere a toda la clase y no a
ninguna instancia en particular. Si alguien
instancia esta clase el método main no se
instanciaría.

5
Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public static void
void main(String args[]){
System.out.println(“Hola Mundo”);
}
}
void
• Indica que el método main no devuelve ningún valor.
• Es importante indicar el valor de retorno porque java
hace una comprobación estricta de tipos.
• Los constructores son los únicos métodos sin valor
de retorno.

Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
Stringargs[]){
public static void main(String args[]
System.out.println(“Hola Mundo”);
}
}
String args[]
• Es la declaración de un array de Strings
• Son los argumentos que se pasan por la línea
de comandos.

java HolaMundo arg1 arg2 ...

6
Anatomía de una aplicación

// Aplicación de ejemplo
// “Hola Mundo”
//
class HolaMundo{
public static void main(String args[]){
System.out.println(“Hola Mundo”);
}
}
Funcionalidad
• Utiliza el método println de la clase out que
está en el paquete System.
• El método println toma como argumento una
cadena (String) y la saca por la salida estándar
(es decir por pantalla).

Arquitectura Fase III: Cargar


Fase IV: Verificar
de Ejecución Fase V: Ejecutar

Aplicaciones en formato Bytecode

Java Class Libraries


(java extension API)
Cargador de clases
Verificador de Bytecode Java Class Libraries
(Java Base API)
Java Virtual Machine

Java Interpreter JIT (Just in Time Compiler)

Java Runtime

Sistema Operativo

Hardware

java fichero
14

7
2. Java es un lenguaje de
programación orientado a objetos

¿Qué es un objeto?

• Los objetos son representaciones


(simples/complejas) (reales/imaginarias) de cosas:
reloj, avión empleado, etc.
• No todo puede ser considerado como un objeto,
algunas cosas son simplemente características o
atributos de los objetos: color, velocidad, etc.

8
Tipos de abstracción

• Abstracción funcional • Abstracción de datos


– Hay cosas que sabemos – Un coche tiene además
que los coches hacen, ciertos atributos:
pero no cómo lo hacen: • color
• avanzar • velocidad
• parar • tamaño
• girar a la dcha • etc.
• girar a la izda – La forma en que se
definen los atributos no
tiene importancia para el
diseño 17

Definición de objetos

Miembros públicos Miembros privados


• describen qué pueden • describen la
hacer los objetos de implementación de cómo
esa clase lo hace.
– Ej: el objeto contacto
– Qué es el objeto interacciona con el circuito
(su abstracción) eléctrico del vehículo, éste
con el motor, etc.
– Qué puede hacer – En sistemas orientados a
el objeto (métodos) objetos puros, todo el
estado es privado y sólo se
puede cambiar a través de
la interfaz pública.
– Ej: el método público frenar
puede cambiar el valor del
atributo privado velocidad.

9
Encapsulación

• Encapsulación: describe la vinculación de un


comportamiento y un estado a un objeto en
particular
• Ocultación de información: Permite definir
qué partes del objeto son visibles (públicas) y qué
partes son ocultas (privadas)

• La llave de contacto es una interfaz pública


del mecanismo de arranque de un coche
• La implementación de cómo arranca
realmente es privada y sobre ella sólo
puede actuar la llave de contacto

Acceso a variables

Los objetos encapsulan variables permitiendo


acceso a ellas sólo a través de los métodos
•Variables: Contenedores de valores
•Métodos: Contenedores de funciones

Un objeto tiene
•Estado: representado por los valores de sus variables/atributos
•Comportamiento definido por sus métodos

Normalmente:
• Los métodos son públicos
• Las variables son privadas
• Puede haber métodos privados
• Es peligroso tener variables públicas
20

10
¿Qué es una clase?

• Clase: Conjunto de objetos con estados y


comportamientos similares
• Ej: podemos referirnos a la clase “coche”
(cualquier instancia genérica de “coche”)  “Mi
coche” es un objeto, es decir una instancia
particular de la clase “coche”
• Plantilla a partir de la cual crear objetos
– Datos (atributos)
– Métodos que operan sobre los datos

Objetos vs. Clases

Una clase es una entidad abstracta


• Es un tipo de clasificación de datos
• Define el comportamiento y atributos de un grupo de
de estructura y comportamientos similar
Clase coche Nombre de la clase
Métodos: arrancar, avanzar, parar, ... Métodos (funciones)
Atributos: color, velocidad, etc. Atributos (datos)

Un objeto es una instancia o variable de una clase


• Un objeto se distingue de otros miembros de la clase
por sus atributos.
Nombre: Ferrari
Objeto Ferrari Métodos: arrancar, avanzar, parar, ...
Perteneciente a Atributos: color = “rojo”;
la clase coche velocidad 300Km/h

11
Interacciones entre objetos

• El modelado de objetos modela:


– los objetos y
– sus interrelaciones
• Para realizar su tarea el objeto puede
delegar trabajos en otro, que puede ser
parte de él mismo o cualquier otro
objeto del sistema.
• Los objetos interaccionan entre sí
enviándose mensajes

Paso de Mensajes
Interfaz Pública

Implementación
Arrancar

• Un objeto envía un mensaje a otro


– Esto lo hace mediante una llamada a sus atributos o métodos
• Los mensajes son tratados por la interfaz pública del
objeto que los recibe
– Eso quiere decir que sólo podemos hacer llamadas a aquellos
atributos o métodos de otro objeto que sean públicos o
accesibles desde el objeto que hace la llamada
• El objeto receptor reaccionará
– Cambiando su estado (es decir, modificando sus atributos)
– Enviando otros mensajes (es decir, llamando a otros atributos
o métodos del mismo objeto -públicos o privados- o de otros
objetos -públicos o accesibles desde ese objeto) 24

12
Declaración de una clase

public class Coche{


//Declaración de atributos
// (color, velocidad, etc)
//Declaración de métodos
// (arrancar, parar, etc.)
}
Coche.java
Sintaxis
Estilo
(modificadores) class NombreClase{ • Nombre fichero = nombre clase
//código de la clase • 1ª letra mayúscula
• Sin espacios en blanco ni guiones
} • Las palabras se separan con
mayúsculas MiPrimeraClase
• Indentación

25

Identificadores

• Sirven para nombrar variables, métodos, clases, objetos y


todo lo que el programador necesite identificar
• Comienzan con una letra, un subrayado o un símbolo $
• Distinguen mayúsculas y minúsculas y no tienen longitud
máxima

• Por convenio:
– Los nombres de variables, métodos y objetos comienzan
por minúscula.
– Los nombres de las clases comienzan por mayúscula
– Si contienen varias palabras se unen evitando subrayado
y separando palabras con mayúsculas deEsteModo

Los identificadores no pueden ser palabras reservadas

13
Palabras reservadas
Reservadas:
abstract double int static
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
catch float null throw
char for package throws
class goto private transient*
const * if protected try
continue implements public void
default import return volatile
do instanceOf short while
Reservadas aunque no se utilizan:
cast future generic inner
operator outer rest var

Variables
• Son las entidades sobre las que actúan los
programas
• Declarar una variable es decir su nombre y
tipo
• Usar una variable es insertarla en una
sentencia
• Podemos encontrar variables en:
– como miembros de la clase (dentro de una
clase)
– como variables locales (dentro del código de
un método)
– como parámetro de un método.

14
Declaración de variables
public class Coche{
//Declaración de atributos
String color;
int velocidad;
//Declaración de métodos
// (arrancar, parar, etc.)
}
Sintaxis Coche.java
tipo nombre; Estilo
tipo nombre1, nombre2, nombre3; • Nombres intuitivos
tipo nombre = valor; • 1ª letra minúscula
• Sin espacios en blanco ni guiones
• Las palabras se separan con
Inicialización de la mayúsculas: miVariable
variable a un valor • Indentación

29

Tipos básicos en Java

• Todas las variables son de un


determinado tipo de datos.
• El tipo de la variable determina:
– Los valores que puede tomar
– Las operaciones que se pueden realizar
• En Java existen:
– Tipos primitivos
– Tipos de referencia

15
Tipos primitivos

• Contienen un único valor


• Son los siguientes:
Tipo Tamaño/Formato Descripción
(Números enteros)
byte 8-bit complemento a 2 [-128, 127]
short 16-bit complemento a 2 [-32768, 32767]
int 32-bit complemento a 2 [-2147483648,2147483647]
long 64-bit complemento a 2 [-9223372036854775808, 9223372036854775807]
(Números en punto flotante)
float 32-bit IEEE 754 [min=1.4E-45, max=3.4028235E38]
double 64-bit IEEE 754 [min=4.9E-324, max=1.7976931348623157E308]
(Otros tipos)
char 16-bit Unicode carácter Un carácter
boolean true o false Un valor booleano

Tipos de referencia

• Su valor es una referencia (puntero) al


valor representado por la variable
• Son tipos de referencia:
– Las matrices (arrays)
– Las clases
• En particular, String
– Las interfaces

16
Constantes
• Son valores invariantes de los tipos básicos
(primitivos más el String), que pueden asignarse a
variables o usarse en operaciones
Tipo Constantes Descripción
(Números enteros)
byte, short , int , long 37 37 en notación decimal
045 37 en notación octal (base 8)
0x25 37 en notación hexadecimal (base 16)
(Números en punto flotante)
float , double 3.14159f número pi en notación coma flotante
314159E-1 número pi con base y exponente
(Otros tipos)
char ‘a’ letra a
‘\n’, ‘\\’,’\’’’,’”’ nueva línea, \, ‘ y “
boolean true, false verdadero, falso
String “hola” la cadena de caracteres hola

Variables
Valores por defecto:
• Hay que distinguir: números = 0
– variables de instancia byte = 0
boleanos = false
– variables de clase
char= ‘\0’
– variables automáticas String = null
• Las variables referencias = null
– pueden inicializarse en la declaración
– pueden declararse sin inicializar
– Sin inicialización tienen un valor por defecto
salvo las automáticas
• Constantes (variables que no se pueden modificar):
– usar la palabra clave final
– inicializarla obligatoriamente en la declaración

17
Declaración de variables
Objetos como atributos
public class Coche{
//Declaración de atributos
String color;
int velocidad;
Equipamiento equipamientoSerie;
//Declaración de métodos
// (arrancar, parar, etc.) Estilo
} • Recordad que las clases (tipo)
Coche.java se nombran con mayúscula y
Sintaxis los identificadores
(nombreObjeto) con minúscula
NombreClase nombre;
NombreClase nombre1, nombre2;
NombreClase nombre = new Equipamiento();
Declaración de un objeto Creación de un objeto
similar a variables, donde antes poníamos el ¡¡¡Las variables se inicializan
tipo ahora ponemos el nombre de la clase Los objetos se crean!!!

Ámbito

• Es el bloque de código dentro del cual una variable


es accesible
• Variable de instancia o de clase es accesible
dentro de las {} de la clase que la contiene, y para el
resto de las clases según los permisos establecidos
por los modificadores:
– private
– protected
– public
– friendly
• Variable local: su ámbito queda fijado por {} del
método en que se encuentra
• Parámetro: su ámbito queda fijado por {} del método
en que se encuentra

18
Métodos

• Son bloques de código que describen el


comportamiento de los objetos
• Pueden ser llamadas dentro de la clase en la
que se encuentran o desde otras clases
• En los programas sólo puede haber código
dentro de los métodos
• Métodos especiales
– El constructor
– El método main

Declaración de métodos
public class Coche{
//Declaración de atributos
private String color;
private int velocidad;
//Declaración de métodos
public void arrancar(){
//codigo para el metodo arrancar
}
public void avanzar(int velocidad){
//codigo para el método avanzar
} Estilo
public String queColor(){
//codigo para averiguar el color • Nombres intuitivos
return color; • 1ª letra minúscula
} • Sin espacios en blanco ni
} guiones
• Las palabras se separan con
Coche.java mayúsculas miMetodo()
• Indentación

19
Declaración de métodos
public class Coche{
//...
public void avanzar(int velocidad){
//codigo para el método avanzar
}
//...
} Coche.java

parámetros
Método Resultado
(param1, param2)

(modificadores) tipoRetorno NombreMetodo(tipo1 param1, tipo2 param2) {


//código del método
return expresion; //cuando el tipoRetorno es void no es necesario
}

Declaración de métodos
public class Coche{
//...
public String queColor(){
//codigo para averiguar el color
return color;
}
//... Coche.java
}
parámetros
Método Resultado
(param1, param2)
(modificadores) tipoRetorno NombreMetodo(tipo1 param1, tipo2 param2) {
//código del método
return expresion;
}

20
Declaración de métodos

• Los métodos
– tienen 0, 1 o más argumentos (parámetros)
– definen el tipo de resultado en su
declaración (¡salvo los constructores!)
– pueden tener variables locales
• En el cuerpo de un método no se pueden
declarar otros métodos.
• Si el método devuelve un resultado la
última sentencia debe ser un return

Métodos constructores
• Cuando se crea un objeto sus miembros se inicializan
con un método constructor
• Los constructores:
– llevan el mismo nombre que la clase
– no tienen tipo de resultado
• Conviene que haya al menos un constructor
• Si no existe, Java crea un constructor por defecto que
inicializa las variables a su valor por defecto
• Pueden existir varios que se distinguirán por los
parámetros que aceptan (sobrecarga)

IMPORTANTE: Si la clase tiene algún constructor,


el constructor por defecto deja de existir

42

21
El método principal (main)

• Es el método que busca el intérprete para


empezar a ejecutar el programa
• Los parámetros del main (String args[ ]) son
un array de Strings que guarda los
argumentos que escribimos en la línea de
comandos al ejecutar el programa.
java HolaMundo arg1 arg2 ...
• void indica que no devuelve ningún tipo de
datos
• static indica que este método se refiere a
toda la clase, es decir no hay un método
main por cada objeto.

Ejemplo (I)
Declaración de atributos y métodos

• Crear una clase Empleado que tenga:


– dos atributos:
• nombre
• DNI
– dos métodos:
• decirNombre();
• decirDNI();
• Rellenar el cuerpo de los métodos que
tienen los comportamientos para que
imprima por pantalla

22
Ejemplo (II)
Invocación de atributos y métodos

• Crear una clase PruebaEmpleado con


un método main para comprobar el
correcto funcionamiento de la clase.

Acceso a miembros

Modificadores de acceso
Miembros (Variables y métodos)
(friendly) Accesible sólo desde clases que estén en el mismo paquete
public Accesible para todas las clases
private Accesible sólo en la propia clase
protected Accesible para la propia clase y todas las que hereden de ella.

Otros Modificadores
• abstract
• static
• final

23
Acceso a miembros
Accesos a clases

• Dos opciones: “friendly” o “public”


• Friendly: por defecto (sin nada)
– Todas las demás clases del paquete tienen
acceso, pero para las demás es privada
• Public: la clase es accesible por cualquier
otra clase, independientemente de su
ubicación
– Sólo podemos tener una clase public por unidad
de compilación (fichero)
– El nombre de la clase public debe ser
exactamente igual al del fichero

Acceso a miembros
Accesos a elementos de una clase
(Elementos: variables o métodos de una clase)
• Friendly
• Public Las que
utilizaremos
• Private de momento
– Nadie puede acceder a los elementos privados
de una clase, excepto ella misma (ni siquiera las
clases del mismo paquete)
• Protected
– Similar a private, pero permite el acceso a
clases derivadas de ésta.
– Además, también es friendly (permite acceso a
clases del mismo paquete)

24
Acceso a miembros
Constantes definidas por el usuario

• Se definen con la designación static final


– static: variable global
– final: su valor no se altera
– Pueden ser public, private o protected
• Dependiendo de la accesibilidad que se desee
– Suelen aparecer como todo en MAYÚSCULAS

class Circunferencia {
private static final float PI = 3.14159;
private float radio;
private float area;
public Circunferencia (float radio) {
area= 2 * PI * radio;
}//constructor
} //class OperadoreUnario

Acceso a miembros
Miembros estáticos

• Modificador static
• Sólo existen una vez por clase,
independientemente del número de
instancias (objetos) de la clase que hayamos
creado y aunque no exista ninguna
• Se puede acceder a los miembros estáticos
utilizando el nombre de la clase
• Un método estático no puede acceder a
miembros no estáticos directamente, tiene
que crear primero un objeto

25
Acceso a miembros
Algunas reglas

– Los miembros estáticos se invocan con:


NombreClase.metodoEstatico();
NombreClase.atributoEstatico;
– Para acceder a los miembros no estáticos necesitamos
disponer de una instancia (objeto) de la clase
NombreClase nombreObjeto = new NombreClase();
– Los miembros no estáticos se invocan con:
nombreObjeto.metodoNormal();
nombreObjeto.atributoNormal;
– Cuando invocación (llamada) a un miembro estático de la
clase se realiza dentro de la propia clase se puede omitir el
nombre de la misma. Es decir podemos escribir:
metodoEstatico(); en vez de: NombreClase.metodoEstatico();
atributoEstatico; NombreClase.atributoEstatico;

MODIFICADORES clase método atributo


public Accesible desde cualquier otra clase
acceso

(friendly) Accesible sólo desde clases de su propio paquete

protected Accesible desde la clase y sus


subclases
private Accesibles sólo dentro de la clase
No se pueden No tiene código
abstract instanciar Se implementa en las
Son para heredar de subclases o clases
ellas hijas
Al menos 1 método
abstracto
otros

No se puede heredar No se puede ocultar No se puede cambiar su


final de ellas. Es la hoja en Es constante y no valor, es constante
el árbol de herencia puede ser modificado Se suele utilizar en
en las clases hijas combinación con static
Aplicable sólo a clases Es el mismo para Es la misma para todos
static internas todos los objetos de la los objetos de la clase.
clase. Se utiliza:
Clase.metodo();

26
Ejemplo (III)
Modificadores de acceso

• Modificar la clase empleado para que:


– Los dos atributos sean privados
– Tenga dos métodos que devuelvan el
valor de los atributos:
• getNombre();
• getDNI();
• Rellenar el cuerpo de los métodos que
tienen los comportamientos

Ejemplo (IV)
Invocación cuando hay modificadores de acceso

• Modificar el método main de la clase


PruebaEmpleado para realizar la
comprobación de su correcto
funcionamiento

27
Ejemplo (V):
Uso de constructores

• Modificar el código de la clase


empleado para que contenga un
constructor con los siguientes
parámetros:
– nombre, DNI
• De este modo nadie podrá crear un
objeto de la clase empleado sin
asignarle un nombre y un DNI

Ejemplo (VI):
Método main

• Copia el método main de la clase


PruebaEmpleado a la clase empleado
• Elimina la clase PruebaEmpleado
• Ejecuta de nuevo tu aplicación
– ¿Sigue funcionando programa?
– ¿Dónde es mejor poner el main?
• En la misma clase: Empleado
• En una clase independiente: PruebaEmpleado

28
Resumen

Programa

Clases (ficheros.java)

Miembros

Atributos Métodos

Tipo de Tipo Métodos Métodos


referencia Básico Normales Especiales

Constructor Main
Arrays Objetos

3. Más orientación a objetos

29
Herencia

• Permite definir a partir de una clase otras


clases relacionadas que supongan una:
– Especialización de la clase dada (ej: la clase
“coche” es una especialización de la clase
“vehículo”)
– Generalización de la clase dada (ej: la clase
“vehículo” es una generalización de la clase
“coche”).
• Si definimos la clase coche a partir de la clase
vehículo se dice que:
– “coche” hereda las variables y métodos de
“vehículo”, “coche” extiende de “vehículo”
– “coche” es subclase de “vehículo”
– “vehículo” es superclase de “coche”.
59

¿Para qué sirve?


Recurso Recurso
•nombre •nombre
•descripcion •descripcion
•decirNombre() •decirNombre()
•decirDescripcion() •decirDescripcion()

Aula Ordenador Aula Ordenador


•nombre •nombre •localizacion •sistemaOperativo
•descripcion •descripcion •decirLocalizacion() •decirSistemaOp()
•localizacion •sistemaOperativo
•decirNombre() •decirNombre()
•decirDescripcion() •decirDescripcion()
•decirLocalizacion() •decirSistemaOp() public class Aula extends Recurso
public class Ordenador extends Recurso
Los atributos y métodos que aparecen en azul en la clase padre se repiten
en las clases hijas (a la izquierda)
No es necesario repetir el código, basta con decir que una clase extiende a
la otra o hereda de ella (a la derecha)

30
Ejemplo (VII):
Clase derivada

• Crear una clase gerente que extienda a


empleado y tenga:
– Nueva variable:
• Salario
– Un constructor:
• Con 3 parámetros: nombre, DNI y salario
– Dos métodos:
• getSalario();
• setSalario(salario);
• Rellenar el cuerpo de los métodos que tienen
los comportamientos

Ejemplo (VIII):
Otra clase derivada

• Crear una clase comercial que extienda a empleado y


tenga:
– Dos nuevas variables:
• comision
• ventasMes
– Un constructor:
• Con 3 parámetros: nombre, DNI y comisión
– Los métodos:
• getComision();
• setComision(comision);
• sumarVenta(venta);
• getVentas();
• setVentas(ventas);
• inicioMes();
• Rellenar el cuerpo de los métodos que tienen los
comportamientos

31
Ejemplo (IX):
Método main

• Programar una pequeña aplicación que


permita comprobar el correcto
funcionamiento de las clases
anteriores:
public class Test {
public static void main (String[] args) {
...
}
}

Ocultación de variables
(shadowing)
• Si definimos en una subclase una variable
del mismo nombre y tipo que en la
superclase, la de la superclase queda oculta
• Podemos acceder a la variable de la
subclase o de la superclase utilizando this y
super
– Ej: “coche” extiende de “vehiculo” y “vehiculo”
extiende de transporte
– Definimos en las tres clases la variable String
nombre
– ¿Cómo sabemos si nos estamos refiriendo al
nombre del transporte, al nombre del vehículo o al
nombre del coche?

32
Ocultación de variables
(shadowing)
clase “abuela" transporte String nombre = "terrestre"

clase padre convoy vehiculo String nombre = "turismo"

clase hija moto coche String nombre = "Ferrari"

• ¿Cómo acceder a variables ocultas? variables


– nombre (nombre del coche) clase hija:
– this.nombre (nombre del coche) visibles
– super.nombre (nombre del vehículo)
Variables
– ((vehiculo)this).nombre (nombre del vehículo)
clases padre
– super.super.nombre (Mal)
ocultas
– ((transporte)this).nombre (nombre del transporte)

Redefinición (overriding)

• Si definimos en una subclase un método del


mismo nombre y tipo que en la superclase el
de la superclase queda oculto
• Si ponemos el modificador final a un método
no lo podemos redefinir
• ¿Cómo acceder a métodos ocultos?:
métodos
– arrancar() (ejecuta el método arrancar del coche) clase hija:
– this.arrancar() (método arrancar del coche) visibles

– super.arrancar() (método arrancar del vehículo) métodos


clases padre:
– super.super.nombre (Mal) ocultos

33
¿Para qué sirve?

Recurso Recurso
•nombre •nombre
•descripcion •descripcion
•decirNombre() •decirNombre()
•decirDescripcion() •decirDescripcion()

Aula Ordenador Aula Ordenador


•nombre •nombre •descripcion •sistemaOperativo
•descripcion •descripcion •localizacion •decirSistemaOp()
•localizacion •sistemaOperativo •decirLocalizacion()
•decirNombre() •decirNombre()
•decirDescripcion() •decirDescripcion()
•decirLocalizacion() •decirSistemaOp() this.descripcion
public class Aula extends Recurso super.descripcion
public class Ordenador extends Recurso
67

Modificador Final

• En argumentos: Dentro del método no


podemos cambiar el valor de ese argumento:
public class Prueba {
void Inutil(final Objeto o) {
o = new Objeto(); // Ilegal: o es final
o.adios();
}
}

• En métodos:
– Las clases derivadas no podrán sobrescribir el
método
– Además aporta eficiencia: el compilador convierte
llamadas al método en llamadas “inline”

34
Modificador Final (2)

• En clases:
– Impido la extensión de la clase (no es posible
“heredar” de ella)
final class Dinosaurio {
void andar() {

};
}
class Velociraptor extends Dinosaurio {}

¡¡Error!!

Sobrecarga (overloading)

• Podemos definir una clase con dos métodos


con el mismo nombre si los argumentos
son distintos
• Se utiliza mucho para los constructores
• Sabemos cuál de los dos métodos tenemos
que ejecutar por los parámetros que le
pasamos cuando le llamamos
• En este caso no hay ocultación de la
información, se puede acceder a los dos
métodos

35
¿Para qué sirve?

Son dos métodos distintos porque


Aula
•nombre
aunque tengan el mismo nombre
•descripcion tienen distintos argumentos
•localizacion
•decirNombre() Tienen distinta
•decirDescripcion()
funcionalidad como ocurre
•decirDescripcion(String mobiliario)
•decirLocalizacion()
en el caso que se muestra
en el ejemplo

describe el aula en general

describe el mueble que se encuentra


en el aula y que le pasamos como
parametro

Conversión de tipos (casting)

• Sintaxis: (tipo)identificador
• Dos tipos de casting:
– widening: Una subclase se utiliza como instancia
de la superclase (ej: llamamos a un método de la
clase padre que no ha sido sobreescrito). Es
implícito.
– narrowing: La superclase se utiliza como
instancia de una subclase. Conversión explícita.
• Sólo se puede hacer casting entre clases
padre e hija no entre clases hermanas

36
Clases abstractas

• Aquellas que tienen algunos métodos


abstractos (sin código) y otros no
• No podemos crear objetos de una clase
abstracta
• Las clases y métodos abstractos llevan la
palabra clave abstract
• No pueden llevar el modificador abstract:
– los constructores
– los métodos estáticos
– los métodos privados

¿Para qué sirve?

La clase Recurso es abstracta porque Recurso


•nombre
uno de sus métodos •descripcion
decirDescripcion() no tiene código •decirNombre()
•decirDescripcion()*
* El color gris claro indica que no tiene código

Todas las clases que hereden de Aula Ordenador


recurso tienen que tener un método •descripcion •sistemaOperativo
decirDescripcion() donde pongamos el •localizacion •decirSistemaOp()
código •decirDescripcion()** •decirDescripcion()**
•decirLocalizacion()

** La “negrita” indica que tiene código

public abstract class Recurso


public class Aula extends Recurso
public class Ordenador extends Recurso
74

37
Interfaces

• Clase en la que todos los métodos son


abstractos
– Las variables en las interfaces son public
– Los métodos en las interfaces no tienen
modificadores de acceso
• El acceso a una interfaz es publico
• Los interfaces son implementados por clases
– una clase implementa una interfaz definiendo los
cuerpos de todos los métodos.
– una clase abstracta implementa una interfaz
rellenando el cuerpo de algunos métodos.
– una clase puede implementar una o más interfaces
(herencia múltiple)
75

¿Para qué sirve?

Recurso no es una clase sino una Recurso


•nombre
interfaz porque ninguno de sus •descripcion
métodos tiene código •decirNombre()
•decirDescripcion()

Aula Ordenador
Todas las clases que implementen •descripcion •sistemaOperativo
Recurso tienen que tener todos los •localizacion •decirSistemaOp()
métodos de Recurso donde •decirNombre() •decirNombre()
•decirDescripcion() •decirDescripcion()
pongamos el código
•decirLocalizacion()

public interfaz Recurso


public class Aula implements Recurso
public class Ordenador implements Recurso
76

38
Paquetes

• Un paquete agrupa clases e interfaces


• Las jerarquías de un paquete se corresponden
con las jerarquías de directorios
• Para referirse a miembros y clases de un
paquete se utiliza la notación de separarlos por
puntos.
• Ej: Cuando hacemos una aplicación e
importamos la clase Vector que nos
proporciona Java
import java.util.Vector;
• La clase java.util.Vector está en el directorio
java/util

Paquetes

• ¿Cómo utilizar paquetes creados por otros?


– Incluimos en el CLASSPATH la dirección de la carpeta que da
nombre al paquete por ej: PaqueteDeOtro
set CLASSPATH=c:\PaqueteDeOtro;%CLASSPATH%;. (windows)
setenv CLASSPATH c:\PaqueteDeOtro:$CLASSPATH (linux)
– En la clase que queramos utilizarlo ponemos antes de la
declaración de la clase la sentencia import correspondiente
import PaqueteDeOtro.*;
• ¿Cómo crear mis propios paquetes?
– Almaceno mis clases en un directorio
con el nombre del paquete
– Pongo al principio de todas las clases que pertenezcan al
paquete la siguiente instrucción:

package MiPropioPaquete;
78

39
OO: Resumen I

• Clase (concreta)
– tiene todos los métodos implementados
• Clase abstracta
– Sólo algunos métodos implementados
– modificador abstract
• Interfaz
– Ningún método implementado
– palabra reservada: interface

OO: Resumen II

• Clase (concreta o abstracta)


– puede extender (extends) a una sola clase
(herencia simple)
– puede implementar (implements) uno o más
interfaces (herencia múltiple)
• palabra reservada: extends
• Interfaz
– puede extender (extends) a uno o más interfaces
• Paquetes
– Agrupan clases e interfaces

40