Representación de Datos Todo lo que necesitas saber de Java
M. Carmen Fernández Panadero Julio Villena Román {mcfp, jvillena}@it.uc3m.es
Índice 1. ¿De qué estamos estamos hablando? hablando? 2. Java es un lenguaj lenguaje e de programaci programación ón orientado orientado a objetos: OO
– Obje Objeto tos s y clas clases es – Varia Variabl bles es y métod métodos os – Modificadore Modificadores s de acceso, acceso, construct constructores ores y método main
3. Más orientación orientación a objetos objetos:: • •
Herencia Rees Reescri critu tura ra,, sobr sobrec ecarg arga… a…
4. Sintax Sintaxis is del lengu lenguaje aje:: Leng. Prog.
• • • • •
Operadores Arrays Strings Control Control de flujo flujo de programa programa:: condic condicion ionale ales s y bucles bucles Excepciones
1
1. ¿De qué estamos hablando?
Arquitectura de desarrollo
Fase I: Editar Fase II: Compilar
Editores
Compiladores
Notepad Herramientas de Desarrollo
Grasp
JDK Código Java
- Netbean Netbeans s (JDK) (JDK)
- Visual Visual J++ - Visual Visual .Net - Visual Visual Café - Java Java Worksho Workshop p - J Build Builder er - Visual Visual Age
Bytecode
Otros fichero.java
fichero.class
javac javac fichero.jav fichero.javaa Otros
2
1. ¿De qué estamos hablando?
Arquitectura de desarrollo
Fase I: Editar Fase II: Compilar
Editores
Compiladores
Notepad Herramientas de Desarrollo
Grasp
JDK Código Java
- Netbean Netbeans s (JDK) (JDK)
- Visual Visual J++ - Visual Visual .Net - Visual Visual Café - Java Java Worksho Workshop p - J Build Builder er - Visual Visual Age
Bytecode
Otros fichero.java
fichero.class
javac javac fichero.jav fichero.javaa Otros
2
Una Aplicación Básica en Java Ja va // Aplicación de ejemplo // “Hola Mundo” // clas class s Hola HolaMu Mund ndo{ o{ pub public lic stati tatic c voi void main main(S (Str trin ing g args[ rgs[]) ]){ { System.out.println(“Hola System.out.println(“Ho la Mundo”); } }
1
2
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” // clas class s Hola HolaMu Mund ndo{ o{ 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 documentación usando javadoc 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 main(String args[]){ void 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{
public static void main(String Stringargs[]){ 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 de Ejecución
Fase III: Cargar Fase IV: Verificar Fase V: Ejecutar
Aplicaciones en formato Bytecode Java Class Libraries (java extension API)
Cargador de clases Verificador de Bytecode e n i h c a M l a u t r i V a v a J
Java Interpreter
Java Class Libraries (Java Base API)
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 que los coches hacen, pero no cómo lo hacen:
– Un coche tiene además ciertos atributos: • 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 hacer los objetos de esa clase
• describen la implementación de cómo lo hace.
– Qué es el objeto (su abstracción) – Qué puede hacer el objeto (métodos)
– Ej: el objeto contacto interacciona con el circuito eléctrico del vehículo, éste con el motor, etc. – En sistemas orientados a 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 Métodos: arrancar, avanzar, parar, ... Atributos: color, velocidad, etc.
Nombre de la clase Métodos (funciones) 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. Objeto Ferrari Perteneciente a la clase coche
Nombre: Ferrari Métodos: arrancar, avanzar, parar, ... Atributos: color = “rojo”; 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 Arrancar
a c i l b ú P z a f r e t n I
Implementación
• 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{ //código de la clase }
• Nombre fichero = nombre 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
volatile
do
instanceOf short
return
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.) }
Coche.java
Sintaxis tipo nombre; tipo nombre1, nombre2, nombre3; tipo nombre = valor; Inicialización de la variable a un valor
Estilo • Nombres intuitivos • 1ª letra minúscula • Sin espacios en blanco ni guiones • Las palabras se separan con mayúsculas: miVariable • 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 short int long
8-bit complemento a 2
[-128, 127]
16-bit complemento a 2
[-32768, 32767]
32-bit complemento a 2
[-2147483648,2147483647]
64-bit complemento a 2
[-9223372036854775808, 9223372036854775807]
(Números en punto flotante)
float double
32-bit IEEE 754
[min=1.4E-45, max=3.4028235E38]
64-bit IEEE 754
[min=4.9E-324, max=1.7976931348623157E308]
(Otros tipos)
char 16-bit Unicode carácter boolean true o false
Un carácter 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
37
37 en notación decimal
(Números enteros)
byte, short , int , long
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
‘a’
letra a
(Otros tipos)
char
‘\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 byte = 0 – variables de instancia boleanos = false – variables de clase char= ‘\0’ – variables automáticas String = null referencias = null • Las variables – 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.) }
Coche.java
Sintaxis
Estilo • Recordad que las clases (tipo) se nombran con mayúscula y 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 tipo ahora ponemos el nombre de la clase
¡¡¡Las variables se inicializan 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
} public String queColor(){ //codigo para averiguar el color return color;
} }
Coche.java
Estilo • Nombres intuitivos • 1ª letra minúscula • Sin espacios en blanco ni guiones • Las palabras se separan con 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 (param1, param2)
Método
Resultado
(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 (param1, param2)
Método
Resultado
(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 Accesible para todas las clases public Accesible sólo en la propia clase private 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 Las que • Public 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
public – Pueden ser , 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(); NombreClase.atributoEstatico; atributoEstatico;
MODIFICADORES
public a c c e s o
(friendly) protected
clase
atributo
Accesible desde cualquier otra clase Accesible sólo desde clases de su propio paquete Accesible desde la clase y sus subclases Accesibles sólo dentro de la clase
private
o t r o s
método
abstract
No se pueden instanciar Son para heredar de ellas Al menos 1 método abstracto
No tiene código Se implementa en las subclases o clases hijas
final
No se puede heredar de ellas. Es la hoja en el árbol de herencia
No se puede ocultar Es constante y no puede ser modificado en las clases hijas
No se puede cambiar su valor, es constante Se suele utilizar en combinación con static
static
Aplicable sólo a clases internas
Es el mismo para todos los objetos de la clase. Se utiliza: Clase.metodo();
Es la misma para todos los objetos de la clase.
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 Tipo de referencia Arrays
Objetos
Tipo Básico
Métodos Métodos Normales
Métodos Especiales
Constructor
Main
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 •descripcion •decirNombre() •decirDescripcion()
•nombre •descripcion •decirNombre() •decirDescripcion()
Aula
Ordenador
Aula
Ordenador
•nombre •descripcion •localizacion •decirNombre() •decirDescripcion() •decirLocalizacion()
•nombre •descripcion •sistemaOperativo •decirNombre() •decirDescripcion() •decirSistemaOp()
•localizacion •decirLocalizacion()
•sistemaOperativo •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) transporte
String nombre
= "terrestre"
convoy vehiculo
String nombre
= "turismo"
moto
String nombre
= "Ferrari"
clase “abuela" clase padre clase hija
coche
• ¿Cómo acceder a variables ocultas? – nombre (nombre del coche) – this.nombre (nombre del coche) – – – –
super.nombre (nombre del vehículo) ((vehiculo)this).nombre (nombre del vehículo) super.super.nombre (Mal) ((transporte)this).nombre (nombre del transporte)
variables clase hija: visibles Variables clases padre ocultas
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?: – – – –
arrancar() (ejecuta el método arrancar del coche) this.arrancar() (método arrancar del coche) super.arrancar() (método arrancar del vehículo) super.super.nombre (Mal)
métodos clase hija: visibles métodos clases padre: ocultos
33
¿Para qué sirve? Recurso
Recurso
•nombre •descripcion •decirNombre() •decirDescripcion()
•nombre •descripcion •decirNombre() •decirDescripcion()
Aula
Ordenador
Aula
Ordenador
•nombre •descripcion •localizacion •decirNombre() •decirDescripcion() •decirLocalizacion()
•nombre •descripcion •sistemaOperativo •decirNombre() •decirDescripcion() •decirSistemaOp()
•descripcion •localizacion •decirLocalizacion()
•sistemaOperativo •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? Aula •nombre •descripcion •localizacion •decirNombre() •decirDescripcion() •decirDescripcion(String mobiliario) •decirLocalizacion()
Son dos métodos distintos porque aunque tengan el mismo nombre tienen distintos argumentos Tienen distinta funcionalidad como ocurre 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? Recurso
La clase Recurso es abstracta porque uno de sus métodos decirDescripcion() no tiene código
•nombre •descripcion •decirNombre() •decirDescripcion()*
* El color gris claro indica que no tiene código
Todas las clases que hereden de recurso tienen que tener un método decirDescripcion() donde pongamos el código
Aula
Ordenador
•descripcion •localizacion •decirDescripcion()** •decirLocalizacion()
•sistemaOperativo •decirSistemaOp() •decirDescripcion()**
** 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
Recurso no es una clase sino una interfaz porque ninguno de sus métodos tiene código
Todas las clases que implementen Recurso tienen que tener todos los métodos de Recurso donde pongamos el código
•nombre •descripcion •decirNombre() •decirDescripcion()
Aula
Ordenador
•descripcion •localizacion •decirNombre() •decirDescripcion() •decirLocalizacion()
•sistemaOperativo •decirSistemaOp() •decirNombre() •decirDescripcion()
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%;. setenv CLASSPATH c:\PaqueteDeOtro:$CLASSPATH
(windows) (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
4. Sintaxis del lenguaje
Operadores Unarios • Unarios toman un único argumento: ++,--, etc. Pueden tener notación prefijo o sufijo. class OperadorUnario { public static void main(String[] args) { int i=0; System.out.println("i= "+(i++)); // 0: Prefijo System.out.println("i= "+(++i)); // 2 : Sufijo } //main( ) } //class OperadoreUnario
– Los operadores prefijo devuelven un valor antes de realizar la operación y los sufijo después.
41
Operadores Binarios • Binarios toman dos argumentos: =, +, etc. class OperadorBinario { public static void main(String[] args) { int a = 3; int b = a + 5; System.out.println(“b= "+ b); // 8 } //main( ) } //class OperadorBinario
– Además de realizar una operación, los operadores devuelven un valor – El valor y su tipo dependen del operador y del tipo y valor de sus operandos
Operadores Aritméticos Operador
Uso
Descripción
+
op1 + op2
Suma op1 y op2
-
op1 - op2
Resta op1 y op2
* /
op1 * op2
Multiplica op1 y op2
op1 / op2
Divide op1 y op2
%
op1 % op2
Resto de dividir op1 por op2
+ y - tienen versiones unarias para fijar el signo de un operando: Operador
Uso
Descripción
+
+ op
Indica un valor positivo
-
- op
Cambia el signo de op
42
Operadores Relacionales • Los operadores relacionales comparan dos valores y determinan la relación entre ellos Operador
Uso
Descripción
>
op1 > op2
op1 es mayor que op2
>=
op1 >= op2
op1 es mayor o igual a op2
<
op1 < op2
op1 es menor que op2
<=
op1 <= op2
op1 es menor o igual a op2
==
op1 == op2
op1 y op2 son iguales
!=
op1 != op2
op1 y op2 no son iguales
• ¡Cuidado! – El operador = asigna • Ej. var = 5 , asigna 5 a var
– El operador == compara • Ej. var == 5, devuelve true (tras la asignación anterior)
Operadores Condicionales •
•
Hay tres operadores relacionales
Operador
Uso
Devuelve true si
&&
p1 && op2
op1 y op2 son ambos true
||
op1 | | op2
op1 o op2 es true
!
! op
op es false
Se utilizan junto con los operadores relacionales para construir expresiones booleanas más complejas class Cuenta { public static void main(String[] args) { int cuenta = args.length; int max = 5;
boolean enElRango = 0 < cuenta && cuenta < max; System.out.println(“¿Está “+ cuenta + “ en el rango? “ + enElRango); } //main( ) }
43
Operadores de Asignación • El operador = asigna una valor a una variable. int cuenta = 0;
• Existen abreviaturas: i = i + 2; i += 2;
Operador
Uso
Equivale a
+=
op1 += op2
op1 = op1 + op2
-=
op1 -= op2
op1 = op1 – op2
*=
op1 *= op2
op1 = op1 * op2
%=
op1 %= op2
op1 = op1 % op2
Arrays (matrices) • Arrays • Declaración, creación e inicialización • Inserción, eliminación y localización de elementos • Arrays multidimensionales
44
Arrays (matrices) ¿Qué son?
• Colección de entidades del mismo tipo almacenadas en una unidad • El operador indexación [ ] permite el acceso a cada elemento del array • El atributo length nos permite saber el nº de elementos que contiene el array • Rango del Array – De 0 hasta length – 1 – Cuidado no sobrepasar la longitud máxima • Surge la excepción IndexOutOfBoundsException
Arrays (matrices) Declaración, Creación, Inicialización
• Declaración: Consiste en asignar un identificador al array y decir de qué tipo son los elementos que va a almacenar. tipo nombreArray[]; tipo []nombreArray; – Se puede hacer de dos formas – Después de la declaración aún no se ha asignado memoria para almacenar el array no podemos acceder a su contenido Valores por defecto:
• Creación: Consiste en reservar espacio en memoria para el array
int, short, long = 0 float, double = 0.0 boleanos = false String = null Object = null
– Es necesario utilizar new y especificar tamaño del array nombreArray[] = new tipo[numPosiciones ]; – Una vez creado el array sus elementos tienen los valores por defecto hasta que el array sea inicializado
45
Arrays (matrices) Declaración, Creación, Inicialización
• Inicialización: Consiste en dar valores a los distintos elementos del array podemos hacerlo de varias formas: – Elemento a elemento nombreArray[0] = elemento0; nombreArray[1] = elemento1; ...
– Mediante un bucle for(int i = 0; i < nombreArray.length; i++) { nombreArray[i] = elemento-i; }
– Por asignación directa nombreArray = {elem1, elem2, elem3, ...};
Ejemplos Declaración, Creación, Inicialización Arrays de tipos básicos int a[]; //Declara a = new int[3] //Crea a[0]=1; //Inicializa a[1]=2; a[2]=3;
int a[] = new int[3] //Declara y Crea a[0]=1; //Inicialización a[1]=2; a[2]=3;
int a[] = new int[3] //Declara y crea for(int i=0; i
int a[] = {1, 2, 3}; //Declaración, creación Inicialización
Arrays de objetos (Tipos de referencia) MiClase a[]; //Declara a = new MiClase[3] //Crea a[0]=new MiClase(param1); a[1]=new MiClase(param2); a[2]=new MiClase(param3);
MiClase a[] = new MiClase[3] //inicializa a[0]=new MiClase(param1); a[1]=new MiClase(param2); a[2]=new MiClase(param3);
MiClase a[] = new MiClase[3] //inicializa for(int i=0; i
MiClase[] a = {new MiClase(param1), new MiClase(param2), new MiClase(param3)};
46
Errores frecuentes Declaración, Creación, Inicialización public class EjemplosMatrices{ public static void main(String args[]){ double miMatriz[]; Sintaxis System.out.println(miMatriz[0]); } }
compilar MAL
Falla la compilación
variable miMatriz may not have been initialized
Cuando la matriz sólo ha sido declarada no podemos acceder a sus elementos: el programa no compilaría y daría un error
Errores frecuentes Declaración, Creación, Inicialización public class EjemplosMatrices2{ public static void main(String args[]){ int miMatrizDeEnteros[] = new int[10]; compilar float miMatrizDeReales[]= new float[10]; boolean miMatrizDeBooleanos[] = new boolean[10]; Ejecutar char miMatrizDeCaracteres[] = new char[10]; String miMatrizDeStrings[] = new String[10]; Object miMatrizDeObjetos[] = new Object[10]; System.out.println("Entero por defecto: " + miMatrizDeEnteros[0]); System.out.println("Real por defecto: " + miMatrizDeReales[0]); System.out.println("Booleano por defecto: " + miMatrizDeBooleanos[0]); System.out.println(“Carácter por defecto: " + miMatrizDeCaracteres[0]); System.out.println("String por defecto: " + miMatrizDeStrings[0]); System.out.println("Objeto por defecto: " + miMatrizDeObjetos[0]); Entero por defecto: 0 } Real por defecto: 0.0 } Booleano por defecto: false Carácter por defecto: Cuando la matriz sólo ha sido declarada y creada String por defecto: null pero no inicializada podemos acceder a sus Objeto por defecto: null elementos pero estos tienen su valor por defecto
47
Arrays Multidimensionales • Es un array en el que el acceso a los elementos se hace utilizando más de un índice 0 1 2 0 0 1 2
1
2
0
A B C D E F G H I
0
2
r j a
t
s l
k
a
b
t
c
b
c
l i w ñ
1
d
e
f
r z q
2
g
h
i
z
a[0][2][1]=‘l’
a[0][2]=‘C’ char a[][]; a = new char[3][3] a[0][0]=‘A’;
1
//Declara //Crea //Inicializa
char a[][][]; //Declara a = new char[3][3][3] //Crea a[0][0][0]=‘a’
...
...
Arrays Multidimensionales Ejemplos Declarar y crear directamente //Declaración y Creación String [][]miMatriz = new String[3][4]
null
null
null
null
null
null
null
null
null
null
null
null
Declarar y crear por pasos int [][] miMatriz ; // Declarar el array miMatriz = new int[numFilas][]; // Crear el array de referencia para las filas for(int i=0; i
Otros ejemplos // Matriz 3x3 inicializada a 0 int [][] a= new int[3][3]; int [][] b= {{1, 2, 3}, {4, 5, 6}};
0
0
0
0
0
0
0
0
0
1
2
3
4
5
6
int [][] c = new[3][]; c[0] = new int[5]; c[1] = new int[4]; c[2] = new int[3];
0
0
0
0
0
0
0
0
0
0
0
0
48
Cadenas (Strings)
a
b
c
• Son secuencias de caracteres implementadas en la clase String (dentro del paquete java.lang ) • Creación de Strings String vacío= new String(); String vacio= “”; String mensaje= “hola” String repeticion= mensaje;
• Concatenación de cadenas – La concatenación de cadenas se hace utilizando el operador sobrecargado +. “este” + “aquel”
// Genera “esteaquel”
“abc” + 5
// Genera “abc5”
“a” + “b” + “c”
// Genera “abc”
“a” + 1 + 2 1 + 2 + “a”
// Genera “a12” // Genera “3a”
1 + (2 + “a”)
// Genera “12a”
Comparando Cadenas
a
b
c
• Sobre Strings no funcionan los operadores relacionales (<, >, <=, <=) y de igualdad (==, !=) – Estos operadores comparan objetos y no el contenido
• En su sustitución, existen métodos de comparación en la clase String – Método equals cadenaA.equals(cadenaB) • true, si los valores de cadenaA y cadenaB son idénticos
– Método compareTo cadenaA.compareTo(cadenaB) • entero negativo, si cadenaA es menor que cadenaB • 0, si cadenaA es igual que cadenaB • entero positivo, si cadenaA es mayor que cadenaB
49
Otros métodos del tipo String
a
b
c
• Longitud de un objeto String – Usar método length() – Como length() es un método, es necesario usar paréntesis • Acceso a los caracteres individuales de un String – Usar método charAt(), con la posición • La primera posición es la posición 0 • Subcadenas – Usar método substring() • Devuelve la referencia a un nuevo String. • La llamada se realiza especificando la posición de inicio y la primera posición no incluida String saludo= “hola”; int lon = saludo.length();
// lon es 4
char ch = saludo.charAt(1); String sub = saludo.substring(2,4);
// ch es ‘0’ // sub es “la”
Conversión entre cadenas y tipos primitivos
a
b
c
• Para ello se utilizan las llamadas clases envoltorio (wrapper) que se encuentran en java.lang – Se llaman así porque “envuelven” a los tipos primitivos Integer, Double, Float, Double, Character, … – Conversión a String • toString(), doubleValue(), ... sin argumentos
– Conversión de String al valor del tipo primitivo • parseInt(), parseFloat(), ... sin argumentos
– Conversión deString a objeto de la clase envoltorio • valueOf(), … con argumento
– Conversión de a objeto de la clase envoltorio al valor del tipo primitivo • doubleValue(), intValue(), ... sin argumento
System.out.println(Integer.toString(55,2)); int x = Integer.parseInt(“75”); Double y= Double.valueOf(“3.14).doubleValue();
50
Control de flujo en Java • Java tiene diferentes sentencias de control del flujo del programa: – 3 de selección (o condicionales) (if, if/else, switch) – 3 de repetición ( while, do/while, for)
La sentencia de Selección if • Selección: elegir entre varias alternativas de cursos Pseudocódigo:
Si la nota del estudiante es mayor o igual que 5 Imprimir “Aprobado” Java:
if (notaEstudiante >= 5) System.out.println( “Aprobado” );
51
La Sentencia if/else Pseudocódigo:
Si la nota del estudiante es mayor o igual que 5 Imprimir “Aprobado” si no Imprimir “Suspenso” Java:
if (notaEstudiante >= 5) System.out.println ( “Aprobado” ); else System.out.println (“Suspenso”);
El Operador Condicional • Relacionado con if/else... Java:
System.out.println( notaEstudiante >= 5 ? “Aprobado” : “Suspenso” );
¡ En programas complejos, el ooperador condicional Es mucho más difícil de leer que la simple sentencia if/else !
52
Sentencias if/else anidadas Pseudocódigo: si la nota del estudiante es mayor o igual que 9 Imprimir “A” si no si la nota del estudiante es mayor o igual que 8 Imprimir “B” si no si la nota del estudiante es mayor o igual que 7 Imprimir “C” si no si la nota del estudiante es mayor o igual que 5 Imprimir “D” si no Imprimir “E”
Sentencias if/else anidadas Java:
if (notaEstudiante >= 9) System.out.println( “A” ); else if (notaEstudiante >= 8) System.out.println( “B” ); else if (notaEstudiante >= 7) System.out.println( “C” ); else if (notaEstudiante >= 5) System.out.println( “D” ); else System.out.println(“E”);
53
Sentencias if/else anidadas Java Mejorado:
if (notaEstudiante >= 9) System.out.println( “A” ); else if (notaEstudiante >= 8) System.out.println( “B” ); else if (notaEstudiante >= 7) System.out.println( “C” ); else if (notaEstudiante >= 5) System.out.println( “D” ); else System.out.println(“F”); Los programas indentados adecuadamente son más fáciles de entender
Sentencias Compuestas • Una sentencia compuesta puede aparecer allí donde apareca cualquier sentencia simple – Se introducen ente llaves { } – Las llaves fijan el ámbito de todo lo declarado entre las llaves Java:
if (notaEstudiante >= 5) System.out.println ( “Aprobado” ); else { System.out.println ( “Suspenso” ); System.out.println ( “Debe recuperar” ); }
54
Sentencia switch: switch • Palabra clave switch.
Tipos expresión validos:
– switch ( expresion ) { byte, short, int, long y char. ... No String } – Dentro del switch aparecen case, break, y default.
Ejemplos: • int num=5; switch(num){} • char character=‘z’; switch(character){} • String string=“cadena”; switch(cadena){}
Sentencia switch: case. • Palabra clave case. – Selecciona bloque de código que se va a ejecutar. Cada bloque acaba con break ; public class Switch{ public static void main(String[] s){ int mes=1; switch (mes){ case 1: System.out.println("Enero"); break; case 2: System.out.println("Febrero"); break;
}}}
55
Sentencia switch: break • Palabra clave break. – Sale del bloque switch, si no aparece se sigue la ejecución de los siguientes bloques hasta un break o el final del switch; public class Switch{ public static void main(String[] s){ int mes=1; switch (mes){ case 1: System.out.println("Enero"); case 2: System.out.println("Febrero"); break; }}}
Ej: Imprime los valores Enero y Febrero.
Sentencia switch: default • Uso de default: – Se ejecuta cuando la expresión no coincide con ningún selector. public class Switch{ public static void main(String[] s){ int mes=13; switch (mes){ case 1: System.out.println("Enero"); case 2: System.out.println("Febrero"); break; defaut: System.out.println("Mes desconocido");
}}}
Ej: El resultado sería “Mes desconocido”
56
Sentencia switch: semántica • Semántica switch ( expresion ) { case valor1:
==valor1
sentencias1;
break; [ case valor2: sentencias2;
break; ]
sentencias1 break ? == valor2 sentencias2
[ default: sentencias3; ]
}
break ? sentencias3
Ejemplo secuencia Switch • Problema: – Tenemos en una variable notaestudiante un valor entero con la nota numérica de cada alumno y queremos sacar para cada valor numérico un mensaje.
• Solución: – (1) Usando if’s anidados. – (2) Usando la sentencia switch.
57
Ejemplo sentencia Switch con if:
if (notaEstudiante == 10) System.out.println(“Matricula); else if (notaEstudiante == 9) System.out.println(“Sobresaliente”); else if (notaEstudiante == 8) System.out.println(“Notable alto”); else if (notaEstudiante == 7) System.out.println(“Notable bajo”); else if (notaEstudiante == 6) System.out.println(“Aprobado alto”); else if (notaEstudiante == 5) System.out.println(“Aprobado bajo”); else System.out.println(“Suspenso”);
Ejemplo sentencia Switch con switch:
switch (notaEstudiante){ case 10: System.out.println(“Matricula”); break; case 9: System.out.println(“Sobresaliente”); break; case 8: System.out.println(“Notable”); break; case 7: System.out.println(“Notable bajo”); break; case 6: System.out.println(“Aprobado alto”); break; case 5: System.out.println(“Aprobado bajo”); break; default: System.out.println(“Suspenso”); }
58
Sentencia switch: Semántica • A tener en cuenta: – Si no se ponen breaks se ejecuta el código de todos los bloques a partir del primer bloque case que se ejecute. – No hace falta colocar el código asociado a cada case entre llaves {}
Sentencias de repetición (I) • Problema: – Queremos sumar los valores de un array e indicar la suma total de los valores. public class Suma{ public static void main(String[] s) { float[] numeros ={1,2,3,4}; } }
¿cómo lo hacemos?
59
Sentencias de repetición (II) • Solución uno: Repetir suma 4 veces. public class Suma{ public static void main(String[] s) { float[] numeros ={1,2,3,4}; sumaTotal=0; sumaTotal+=numeros[0]; sumaTotal+=numeros[1]; sumaTotal+=numeros[2]; sumaTotal+=numeros[3]; System.out.println(“La suma t otal es: ”+sumaTotal); } }
Problema: ¿y si el array es de 1000000 elementos ?
Sentencias de repetición (III) • Necesito estructuras de repetición: – Java proporciona: • for(;;){ } • while( condicion){ } • do { } while(condicion); En nuestro ejemplo necesito algo que repita la suma cuatro veces y la forma de saber cuál es la vez que estamos repitiendo.
60
Sentencia for (I) for nici cialización ncremento)) for (Ini cialización; alización;Terminación; erminación;Incremento { sentencias; sentencia s; } – Inicialización: valor inicial de variables. • Ej for(int entero=1;;) for(entero=0, casa=1;;)
– Terminación: condición que termina la ejecución del bucle. • Ej for(int entero=0;entero<10;) //Se repite mientras entero sea mayor de diez
– Incremento: actualización de variables en cada iteración. • Ej: for(int entero=0; entero<10; entero ++); //
Sentencia for (II) • Ejemplo: public class Suma{ public static void main(String[] s){ float[] numeros ={1,2,3,4}; int i=0; for(i=0; i<6;i++) System.out.println(" i vale: "+i); } }
¿cuántas veces sale el mensaje por pantalla? ¿cuánto vale i en cada mensaje?
61
Sentencia for (III) • Solución dos: Usando for public class Suma { public static void main(String[] s){ float[] numeros ={1,2,3,4}; float sumaTotal=0; for(int i=0; i<4;i++){ System.out.println(“valor :”+numeros[i]); sumaTotal=sumaTotal+numeros[i]; } System.out.println("La suma total es: "+sumaTotal); } }
Problema: Hay que saber a priori el tamaño del vector.
Sentencia for (IV) • Solución tres: for + tamaño array. public class Suma { public static void main(String[] s) { float[] numeros ={1,2,3,4}; float sumaTotal=0; int hasta=numeros.length; for(int i=0; i
Nota: numeros.length nos da el tamaño del array numeros.
62
Sentencia for (V) Sintaxis: i=0;
Inicialización
for (inicial ; salida; actualización) { sentencias ....;}
i<10 si
Ej: for (int i=0; i<10; i+=2) {a+=1; no
b+=2; }
Comprabación condición salida
a+=1; b+=2;
Si aparecen varias sentencias en inicial, salida o actualización, se separan con comas. Ej: for (i=0,suma=0; i<=n; i++,suma+=n)
Sentencias
i+=2
Actualización
Sentencia for (VI) • Ejemplos int i=0;
int i=0;
int i=4;
for (i =0;i<10;)
for (i=13;i<10; i++)
for (;i<10;)
{ i=i+2;}
{ i=i+2;}
{ i=i+2;}
int i=0;
int i, suma;
for ( ; ; )
for (i =0, suma=5;i<10;suma+=i)
{ i=i+2;}
{ i=i+8;}
¿cuántas veces se ejecutan estos bucles? ¿cuál es el valor de i en cada caso al salir del bucle?
63
Sentencia for (VII) • Bucles for anidados
numeros:
1
2
3
4
5
6
7
8
9
10
11
12
public class Suma{ public static void main(String[] s){ float[][] numeros ={ {1,2,3,4}, {5,6,7,8} ,{9,10,11,12}}; } }
• ¿cómo calculo la suma total de todos los elementos de la matriz? – Necesito recorrer la matriz por filas y columnas.
Sentencia for (VIII) • Solución bucle for dentro de bucle for public class Suma{ public static void main(String[] s) { float[][] numeros ={{1,2,3,4}, {5,6,7,8},{9,10,11,12}}; float total=0; for (int i=0; i
} System.out.println("Valor total: "+total); } }
i=0 1 2
j=0
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
64
Sentencia for (IX) • Notas sobre bucles anidados – La idea básica es similar a la de ifs anidados. – La anidación de bucles ralentiza la ejecución del programa. – Se usan para recorrer estructuras en formas de matrices n-dimensionales donde cada dimensión es un bucle anidado.
Estructuras de repetición • Estructuras de repetición – for (;;){ } – while(condicion){}; – do {}while( condicion);
• ¿qué aportan que no aporte for? – Nada, todo bucle while se puede sustituir por un bucle for , pero a veces es más intuitivo usar estructuras tipo while.
65
Sentencia while (I) Sintaxis: while (condicion) { Sentencias;
}
System.in.read()!=1 si
condicion es una expresión lógica cuenta++; System.out.p
Ej: int cuenta=0; while (System.in.read() != -1) { cuenta++; System.out.println(“He leído: " + cuenta +“ veces" ); }
Sentencia while (II) • Solución cuatro: while public class Suma{ public static void main(String[] s){ float[] numeros ={{1,2,3,4}}; float total=0; int indice; while(indice
66
Sentencia while (III) • Intercambiando for y while for (expr1;expr2; expr3) statement
expr1; while(expr2){ statement
for es más compacto
expr3; }
Si no necesitamos inicialización: usaremos while Si necesitamos inicialización y o actualización: for . Muchos programadores aprovechan el hecho de que los enteros se inicializan a 0 para recorrer arrays, cuyo primer elemento está en la posición 0.
Sentencias de repetición • Estructuras de repetición: – for (;;){ } – while (condicion){ } – do{ }while(condicion);
67
Sentencia do/while (I) – Es una estructura muy parecida al while. – Difiere con while en que la comprobación se hace al final, primero se ejecuta y después se comprueba. – Siempre se ejecuta al menos una vez, el while puede no llegar a ejecutarse nunca.
Sentencia do/while (II) • Sintaxis: do { sentencias
} while (expBooleana );
c=in.read(); ...
Ejemplo int c; InputStream in; do { c = in.read(); ... } while (c != -1);
c!=-1 si
Ejemplo típico: lectura de un fichero.
68
Sentencia do/while (III) • Notas: – Entre do y while siempre van llaves. • do { } while(expresion); //siempre hay llaves.
– Después de while siempre hay un punto y coma. • do { } while(expresion); //siempre acaba en ;
– expresion es una expresión lógica. – La sentencia do{} while es muy poco usada.
Sentencia do/while (IV) • Solución seis: do{ }while public class Suma{ public static void main(String[] s){ float[] numeros ={{1,2,3,4}}; float total=0;
int indice;
do{ System.out.println("Sumando valor: "+numeros[indice]); total+=numeros[indice]; indice++; } while(indice<4); System.out.println("Valor total: "+total); } }
Problema: si no hay ningún elemento en el array, ¿qué pasa?
69
Comparativa ... • Comparativa for vs. while vs do while
• • • • •
Inic
Act
Condición
Min Ej Uso
For
Sí
Sí
Continuar
0
Alto
While
No
No
Continuar
0
Alto
do while
No
No
Continuar
1
Bajo
Inic: Posibilidad de inicialización de variables. Act: Posibilidad de actualización de variables. Condición: Indica si la condición es de continuación o salida. Min ej: número mínimo de veces que ejecuta el bloque de texto. Uso: Indica el grado de uso de la estructura de control.
Pautas para uso de for y while • Pautas de cuando usar while o for Sabemos el número de iteraciones (Ej: array) Se desconoce el número de iteraciones Incremento de variables en cada ciclo Hay que inicializar variables
for while X X X X
Ej: lectura de fichero con while. Ej: recorre matrices con for.
70
Otras sentencias ...
– break – continue
Sentencias continue, break break: cuando se ejecuta dentro de un
while, for, do/while o switch hace que se abandone la estructura donde aparece int j=0; while(j<10){ j++; break; System.out.println(“Esto nunca se ejecuta”); } System.out.println(“j vale: ”+j);
El bucle sólo se ejecuta una única vez y se imprime el mensaje “j vale: 1“.
71
Sentencias continue, break continue: si se ejecuta dentro de un bloque while, for o do/while se salta el resto de las sentencias del bucle y continúa con la siguiente iteración int j=0 while(j<10){ j++; continue; System.out.println(“Esto nunca se ejecuta”); }
Nunca se imprime el mensaje “Esto nunca se ejecuta”.
Sentencias continue, break break + etiqueta: Sirve para salir de estructuras anidadas. Sigue la ejecución en la etiqueta fuera: while(bprincipal<10){
bprincipal++; System.out.println(“Bucle principal ”+bprincipal); while(numcoche<10){ numcoche++; System.out.println(“Numcoche ”+numcoche); if (nuncoche==5) break fuera;} }
Imprime 5 veces cada uno de los dos mensajes. Y salta a la etiqueta fuera que está fuera de la estructura de los dos bucles .
72
Clases estándar Java Base API – Java.lang: Java.lang: Interfaz Interfaz y núcleo núcleo de clases – Java.util: Java.util: Clases Clases de utilidade utilidades s – Java.io: Java.io: Clases Clases de input/output input/output – Java.net: Java.net: Clases Clases de red (Basada (Basada en TCP/IP) – Java.applet: Java.applet: Clase Applet
• Java Java Stan Standa dard rd Exte Extens nsio ion n API API – JMF – J2D, J2D, J3D, J3D, etc. etc.
Excepciones • Motivación ión: Si ejecuto el programa: publ public ic class class Suma{ Suma{ public public static static void main(S main(String tring[] [] s){ s){ float[] numeros numeros ={1,2,3,4}; float valor=numeros[10]; valor=numeros[10]; } }
(Exception)) • Genera: Excepción (Exception Exceptio Exception n in thread thread “main” “main” java.lang.ArrayIndexOutOfBoundsException at Suma.main(Suma Suma.main(Suma.java: .java: 6)
73
Excepciones • ¿Por ¿Por qué qué se se ha ha gen gener erad ado? o? – Hemos tratad tratado o de acceder acceder a una posición posición no válida del array – La ha generado generado la la máquina máquina virtual virtual Java Java – La excepción excepción informa informa del del tipo de de error que se ha producido: java.lang.ArrayIndexOutOfBoundsException” “ java.lang.ArrayIndexOutOfBoundsException
Excepciones ¿qué son? • Evento que al ocurrir impide la ejecución normal del programa • Cuan Cuando do ocur ocurre re se crea crea un objeto pasa al sist sistem ema a de excepción y se pasa
control de ejecución • El siste sistema ma de de cont control rol de de ejecuc ejecución ión:: – Busca un trozo de código que maneje la excepción – Si no no lo encuent encuentra ra termina el programa
74
Excepciones: ¿Para qué sirven? • Para separar el tratamiento de excepciones del código normal (try-catch) • Para propagar errores en la pila de llamadas (throws) • Para agrupar y diferenciar diferenciar tipos tipos de errore errores s (al ser objetos pueden agruparse por clases) • Cual Cualqu quie ierr mét métod odo o tie tiene ne que: que: – tratar (catch) o – pasar (throws) cualquier excepción producida durante su ejecución
Excepciones: Tipos • Hay Hay funda fundame ment ntal alme ment nte e 3 tipo tipos: s: – De tiem tiempo po de ejecución (RuntimeException) • Ej: Arithmetic ArithmeticExce Exception ption,, NumberF NumberForma ormatExce tException ption,, IndexOutOfBoundException, IndexOutOfBoundException, NullPointerException, NullPointerException, etc.)
– De entrada y salida (IOException, FileNotFoundException, EOFException) – Defi Defini nida da por por el usuario (MyException)
• En tiem tiempo po de compil compilació ación n se compru comprueba eba que los dos últimos tipos de excepciones: – se capturen o – se declaren en los métodos en los que puedan darse
75
Excepciones: ¿Cómo usarlas? • Cómo se produce: – implicitamente (cuando se produce un error) – explícitamente throw new IOException(mensaje)
• Qué hacer: – Tratarla: • Rodear con try{} las sentencias susceptibles de lanzar excepciones • Rodear con catch(nombreException){} las sentencias que se deben ejecutar cuando se produce
– Lanzarla public void miMetodo throws IOException
• Rodear con finally{} el código que queremos que se ejecute siempre
Excepciones: Semántica • Semántica Try { Sentencias; } catch(except ) { Sentencias; } [catch(except2 ) {} ] [ finally{ } ]
• Ejemplo
excepción Tipo_de_Excepcion
try{ Array[10]; }
si no Manej1 catch
try {
Array[10]; } catch (Tipo_de_Excepción variable_e){ Manej1;
Manej2 finally
} finally { Manej2; }
76
Excepciones: Semántica • Notas: – – – –
Se encierra todo en un bloque try{ } El catch(Except ){} es obligatorio Except ha de heredar de System.exception El código del finally se ejecuta siempre. No suele ser muy usado (controversia) – Si hay varios catch en batería y uno captura una excepción a partir de entonces sólo se podrán capturar las excepciones padre de la actual (ver ejemplo)
Excepciones: Ejemplos (I) • Captura de excepción aritmética int valor; try{ for (x=0,valor=100;x<100; x++) valor /=x; } catch (ArithmeticException e){ System.out.println(“Matemáticas Locas”); } catch (Exception e) { System.out.println(“Se ha producido un error”); }
Se produce una división por cero y se genera una excepción que imprime “Matemáticas locas” y “Se ha producido un error”. Nota: ArithmeticException es subclase de Exception.
77