Sunteți pe pagina 1din 141

Java: Un Lenguaje de Programacin Orientado un Objetos

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

1. Introduccin
Un programador debe encontrar soluciones implementables en un ordenador para problemas del mundo real
Un cerdo es 10111100 Producir leche se define como 11011000 11000001 00110000

1. Introduccin
La abstraccin permite al programador reducir la diferencia entre el modelo del mundo real y el modelo entendible por el computador. Abstraccin de datos: proceso por el que la definicin de los datos tiende un parecerse un los objetos del mundo real.
Abstraccin procedimiental: proceso por el que la definicin de funciones tiende un parecerse un tareas de alto nivel del mundo real.
5

A B S T R A C C I N O P E R A C I O N A L

Evolucin de los lenguajes de programacin


Cd.Inst.Simb. Macros Subrutinas Funciones Anidamiento Subprogramas Encapsulam. Octult. Inform. Espec - Impl Mtodos Mensajes Lenguajes Mquina / Ensamblador FORTRAN Id = Dir Mem. Manip.Total de Datos

Id. Simb. Tipos Oper. restring.


Registros Tipos definidos Gest. Din. Mem Tipo Abstracto de Datos Objetos

A B S T R A C C I N D E D A T O S

PASCAL

MODULA-2 ADA Lenguajes Orientados un Objetos

1. Qu ventajas tiene la Programacin Orientada un Objetos?


Permite una mayor abstraccin de datos
Encapsulacin Implementacin oculta

1. Qu ventajas tiene la Programacin Orientada un Objetos?


Incrementa la posibilidad de Reutilizar Cdigo.
Se conseguir mediante dos mecanismos
Composicin: un objeto contiene otros objetos. Herencia: un objeto hereda las caractersticas de otro.

Como resultado, nuestros programas sern


Ms fciles de entender. Menos propensos un errores. Ms fciles de mantener y cambiar.

public class QueHago { static final int MAX_SIZE = 50; public static void main (String [] args){ Scanner sc; double [] sequence = new double [MAX_SIZE]; int tam = 0; System.out.println (Introduzca secuencia de nmeros (acaba en 0):\n"); sc = new Scanner(System.in); do { sequence[tam] = sc.nextDouble(); tam++; }while (tam < MAX_SIZE && sequence[tam-1] != 0); for(int i = 1; i<tam; i++) for (int j = i; j>0; j--) de (sequence[j] < sequence[j-1]){ double aux = sequence[j]; sequence[j]=sequence[j-1]; sequence[j-1] = aux; } for(int i = 0; i<tam; i++) System.out.println(sequence[i]); } }
9

public class QueHago { public static void main (String [] args){ List<Double> sequence = new ArrayList<>();

System.out.println (" Introduzca secuencia de nmeros (acaba en 0):\n "); leerSecuencia(sequence);


Collections.sort(sequence); mostrarSecuencia(sequence);

}
private static void leerSecuencia(List<Double> seq){ double number; Scanner sc = new Scanner(System.in); do { number = sc.nextDouble(); seq.add(number); }while (number != 0); } private static void mostrarSecuencia(List<Double> seq){ for(Double number : seq) System.out.println(number); } }
10

1. Introduccin
Java es un Lenguaje de Programacin Orientado un Objetos

Habr que aprender nuevos conceptos y mecanismos:


Clases, objetos, mtodos, mensajes

Herencia, redefinicin de mtodos, composicin


Polimorfismo de Datos, vinculacin dinmica.

Clases abstractas, interfaces.


11

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

12

2. Clases y objetos
Qu es una clase? Una descripcin de un grupo de objetos del mundo real que tienen similar
Apariencia: Qu caractersticas utilizamos para describir un objeto? Comportamiento: Qu puede hacer un objeto?

Qu es un objeto? Una instancia de una determinada clase.


13

2. Clases y Objetos
VEHCULO ANIMAL

PUNTO

(1, 3)
FIGURA (2, 2) (5, 2.5)

(2, 1)

14

Detectando clases
Queremos desarrollar una aplicacin para gestionar las notas de los alumnos matriculados en una determinada asignatura. La asignatura se imparte en distintos grados (INFORMATICA, SW y COMPUTADORES), cada uno de los cuales tiene diferentes grupos de alumnos (A, B y C). Cada alumno tiene un nombre y dos notas: una obtenida en el examen terico (notaTeora) y otra obtenida en el examen prctico (notaLab). Las posibles calificaciones son MH, SOBRESALIENTE, NOTABLE, APROBADO y SUSPENSO.

15

2.1 Mtodos y Mensajes


Mtodos: funciones que definen el comportamiento
de un clase
Punto x, y: double Estado -> Cmo es un objeto? Comportamiento -> Qu hace un objeto?

trasladar(a, b) distancia(pto)

Cmo llamamos a un mtodo?

mensaje(obj, args) ?

16

2.1 Mtodos y Mensajes


Mtodos: funciones que definen el comportamiento
de un clase
Punto x, y: double Estado -> Cmo es un objeto? Comportamiento -> Qu hace un objeto?

trasladar(a, b) distancia(pto)

Cmo invocamos un mtodo?


Como un mensaje enviado a un objeto
pto.trasladar(1, -1)
(Punto) x=2 1 y=2 3

mensaje(obj, args) ?
obj.mensaje(args)

pto
17

Puede recibir un objeto cualquier mensaje?


Cualquier mensaje enviado a un objeto de la clase C debe
corresponderse con un mtodo definido en C.
Punto x, y: double trasladar(a, b) distancia(pto) (Punto) x=2 y=2

trasladar(0,3) dibujar()

La correspondencia entre un mensaje y el mtodo apropoiado


se establece en base a la signatura del mtodo:
Nombre (Tipo1, Tipo2, , TipoN)

El tipo de salida no se tiene en cuenta.


18

Qu ocurre si enviamos un mensaje incorrecto?

En lenguajes O.O. con comprobacin de tipos esttica,


como Java, la emisin de un mensaje a un objeto que no tiene definido el mtodo correspondiente se detecta en tiempo de compilacin.

Si el lenguaje no realiza comprobacin de tipos, los


errores en tiempo inesperados. de ejecucin pueden ser

19

Tipos de mtodos
Punto x, y: double Punto(a,b) numPuntos() : int trasladar(a, b) distancia(pto)

Constructores

Mtodos para crear objetos

Mtodos de clase No tienen sentido para objetos en particular (global) Mensaje enviado a la clase

Mtodos de instancia Mensaje enviado a los objetos


20

Clases en Java
Estructuras que encapsulan datos y mtodos
class Punto { CONSTRUCTORES private double x, y; public Punto() { x = y = 0; } public Punto(double a, double b) { x = a; y = b;} public double abscisa() {return x;} public double ordenada() {return y;} public void abscisa(double a){x = a;} class <Nombre> public void ordinada(double b){y = b;} { public void trasladar(double a, double b){ <Attributos> x += a; y += b; <Mtodos> } public double distancia(Punto pto) { } return Math.sqrt(Math.pow(x - pto.x, 2) + Math.pow(y - pto.y, 2)); } } 21 MTODOS VARIABLES DE ESTADO

Point.java

Java
Punto x y

class Punto { private double x, y;

1 4 1 0

pto

public Punto(double a, double b) { x = a; y = b; } public void move(double a, double b) { x += a; y += b; } public double distancia(Punto p) { }

};

Punto pto = new Punto(1,1);

pto.trasladar(3,-1);
22

2.2 Variables y mtodos de instancia


Cada objeto tiene sus propias variables de instancia (no son compartidas). Las variables de instancia no existen en memoria hasta que el objeto se crea.

Punto x, y: double trasladar(a, b) distancia(pto)

new Punto(2,2)

(Punto) x=2 y=2

23

2.2 Variables y mtodos de instancia


Cmo se utilizan las variables y mtodos de instancia? <objeto>.<nombre variable de instancia> <objeto>.<nombre mtodo> (<argumentos>)
<objeto> es el nombre de una variable que guarda la

referencia a un objeto.

Los mtodos de instancia tienen acceso a


Variables de instance del objeto receptor del mensaje. Variables de clase.
24

2.3 Mtodos y variables de clase


Variables de clase
Variables compartidas por todos los objetos de la clase (global).

Mtodos de clase
Enviados a las clases (se necesita informacin global). No pueden utilizar variables de instancia.

Se declaran como static.


25

2.3 Mtodos y variables de clase


Cmo se utilizan los mtodos y variables de clase? <Clase> . <nombre mtodo> ( <argumentos>) <Clase> . <nombre variable>
class Example { static int un = 0; int b; static void increment(){ Example.a++; Example.a += b; } ... } ERROR. b no es static public class ExUser { ... int readA(){ return Example.a; } void oneMore(){
Example.increment();}

} ExUser.java
26

2.4 Reglas de visibilidad


Un mtodo/atributo es siempre visible desde mtodos dentro de la misma clase. Cuatro niveles de visibilidad para clases, variables y mtodos que necesitan ser utilizados por mtodos no definidos en la misma clase. Same package Subclass Other NO NO YES YES YES YES YES YES Other package Subclass Other NO NO YES YES NO NO YES NO
27

+ ~

private public package

# protected

Ejemplo
public class Vuelo {

static private int sigVuelo = 1; private String localizadorVuelo;


static public int nuevoIdentificador() { int vuelo = sigVuelo; sigVuelo++; return vuelo; } public Vuelo(String lin) { localizadorVuelo = lin + _ + nuevoIdentificador(); } ...

Vuelo v1 = new Vuelo(Iberia); Vuelo v2 = new Vuelo(Lufhtansa); Vuelo v3 = new Vuelo(Iberia);

// Iberia_1 // Lufhtansa_2 // Iberia_3

28

2.5 Objetos
Qu es un objeto? La instancia de una clase. Durante la ejecucin de un programa
Se crean objetos que interaccionan y cooperan (a travs de mensajes)
Los objetos innecesarios se destruyen automticamente (recolector de basura)
29

2.5.1 Variables de objeto


El tipo de la variable es un clase (o un interfaz)
Punto pto; //Declaracin pto Guarda la referencia a un objeto. Nunca contiene un objeto. Debe inicializarse antes de enviarle un mensaje.

Asignacin de objetos a variables:


pto = new Punto(3, 4); Punto pto = new Punto(3, 4); Punto pto2 = pto;

30

3.5.1 Creacin de objetos


Un objeto debe crearse antes de su utilizacin
Se reserva espacio en memoria. Se asignana valores iniciales a las variables de instancia (tarea de los constructores)

new <constructor>(<argumentos>)
new devuelve una referencia al objeto creado, el cual
Se puede asignar a una variable
pto = new Punto(3, 4); Se puede usar en una expresin pto.distancia(new Punto(2,3));
31

2.5.2 Constructores
Mtodos para crear objetos. No tienen tipo de salida y su nombre coincide con el de la clase.

Una clase puede tener varios constructores


Con diferente nmero de argumentos. Con argumentos de distinto tipos.

Si una clase no define ningn constructor, Java asume uno por defecto (constructor sin argumentos)
Si uno o ms constructores existen, el constructor por defecto no se crea.
32

2.5.3 Utilizando objetos


Cmo se manipulan variables de instancia ? Cmo se invoca un mtodo de instancia?
<nombre instancia>.<variable/llamada a mtodo>
Punto pto = new Punto(3,4); pto.trasladar(2, 2); Punto copia = new Punto(pto.x,pto.y);

Si el mtodo o variable no es visible no se puede utilizar. Si lo hacemos, obtendremos un error en tiempo de compilacin.
34

2.5.4 La pseudo-variable this


this es una variable predefinida que puede utilizarse dentro de un mtodo. Hace referencia al objeto que recibe el mensaje.
public float distancia(Punto pto) { return Math.sqrt(Math.pow(this.x - pto.x, 2) + Math.pow(this.y - pto.y, 2)); }

Si no hay confusin de nombres, this no es necesaria.


public float distancia(Punto pto) { return Math.sqrt(Math.pow(x - pto.x, 2) + Math.pow(y - pto.y, 2)); }
35

2.5.5 Ocultando informacin


Un objeto debe proteger su estado.
El acceso directo a las variables de instancia de un objeto por parte de un objeto en una clase diferente no es aconsejable.

Las variables de instancia deben privadas, siempre que sea posible.

definirse

Se deben proporcionar mtodos pblicos para


obtener (get) el valor de las variables de instancia. Asignar (set) un valor determinado a las variables de instancia.
37

2.5.6 Eliminando objetos


Los objetos se destruyen automticamente en Java cuando todas las referencias a ellos han sido eliminadas.
Cmo eliminamos una referencia? <nombre variable> = null; Si queremos asegurarnos de que el proceso de destruccin comienza sin dilacin
Se debe utilizar el mtodo de clase gc(), de la clase System
39

2.5.7 Asignacin vs Copia


Asignacin de objetos ( = )
El mismo objeto es referenciado por varias variables (objeto compartido).

Copia = duplicacin de objetos


Se debe definir un mtodo para copiar objetos de la clase (normalmente un constructor de copia).
public Punto (Punto pto1){}

Alternativa: clone() en Object (java.lang)


40

2.5.7 Asignacin vs Copia


Punto x, y: double trasladar(a, b) distancia(pto)
end origin

Segmento

trasladar(a, b) longitud()

(3,2)
1,41421 longitud()

(1,1)
trasladar(2,1)

(2,1)

(0,0)
41

Ejemplo. Asignacin
public class Segmento { private Punto origen, extremo; public Segmento(Punto pto1, Punto pto2) { origen = pto1; extremo = pto2; } ... // Otros mtodos public double longitud() { return origen.distancia(extremo); } }

42

Ejemplo. Duplicacin
public class Segmento { private Punto origen, extremo; public Segmento(Punto pto1, Punto pto2) { origen = new Punto(pto1.x(), pto1.y()); extremo = new Punto(pto2.x(), pto2.y()); } ... // Otros mtodos public double longitud() { return origen.distancia(extremo); } }
Solo se utiliza en caso de no querer que los objetos componentes sean accesibles desde otros objetos. En este caso hay que asegurarse de que ninguno de los mtodos de acceso van a proporcionar referencias a estos componentes.
43

Clases vs Objetos (resumen)


CLASE = MDULO + TIPO
o Criterio de estructuracin del cdigo o Nuevo tipo para la aplicacin o Entidad esttica (en general) o Estado(Atributos) + Comportamiento(Mtodos)

OBJETO = Instancia de una CLASE


o Objeto (Clase) = Valor (Tipo)

o Entidad dinmica (creada en ejecucin) o Cada objeto tiene su propio estado(identidad) o Objetos de una clase comparten su comportamiento

45

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

46

3.1 Programas en Java


Un programa ya no es una secuencia de tareas, sino un grupo de clases(objetos) interaccionando unos con otros, cooperando para realizar una tarea.
trasladar(1,0)
Punto x, y: double trasladar(a, b) end distancia(pto) trasladar(a, b) longitud()
origin

(Segmento) trasladar(1,0) (Punto) x=0 origen y=0 extremo


trasladar(1,0) (Punto) x=2 y=2
47

Segmento

3.1 Programas en Java


El punto de partida es el mtodo de clase main:
public static void main(String[] args)

main se define en una clase pblica distingida, escogida por el programador.

48

3.2 Ficheros en Java


Cada clase pblica debe estar en un fichero .java diferente.
Nombre Fichero == Nombre clase pblica
public class FirstClass { public static void main(String[] args) { System.out.println(Starting the program"); } } class SecondClass{ } FirstClass.java

Cada fichero .java puede contener varias clases, pero slo una clase pblica.
49

3.3 Ejecucin de un programa


public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } HelloWorld.java

Win32
Bytecodes HelloWorld.class

java
MacOS

javac

Se Precompila
y se Interpreta
Solaris
50

3.3 Ejecucin de un programa


La precompilacin de cada fichero .java produce un fichero .class (que contiene bytecodes) por cada clase que aparece en el fichero fuente.
javac FirstClass.java

FirstClass.class SecondClass.class

Ejecucin de un programa (conjunto de fiehcros .class): Pasar el fichero .class que contiene la clase con el mtodo main a la mquina virtual de Java.
java FirstClass.class
51

3.4 Paquetes
Las clases se organizan en paquetes. estructuras lgicas que contienen todas las clases relacionadas (biblioteca de clases).

Clases pertenencientes al mismo paquete se deben localizar en la misma carpeta del disco duro.

52

3.4 Paquetes
Los paquetes del sistema se pueden encontrar en carpetas especficas:
.../java .../javax

La variable CLASSPATH contiene una lista con todos caminos de bsqueda de los dems paquetes.

53

Estructura de las bibliotecas en Java

Frontera del CLASSPATH java java.lang java.util Paquetes del sistema

java.io

Paquetes

54

Paquetes bsicos del sistema


java.lang: para funciones del lenguaje
java.util: para utilidades adicionales java.io: para entrada y salida java.text: para formato especializado java.awt: para diseo grfico e interaz de usuario

java.awt.event: para gestionar eventos


javax.swing: nuevo diseo de GUI java.net: para comunicaciones

...
55

3.4.3 Usando bibliotecas de Java


Dnde busca Java los paquetes? Utiliza una ruta formada por:
Un directorio en CLASSPATH (o una de las carpetas /java /javax) El nombre del paquete (coincide con el de la carpeta donde est el paquete)
java.util myUtils Paquete de sistema con utilidades Paquete de usuario en <CLASSPATH>/myUtils
56

myUtils.video Paquete de usuario en <CLASSPATH>/myUtils/video

3.4.3 Usando bibliotecas de Java


Cmo utilizar una clase ya definida?
Por su nombre simplemente (si pertenece a java.lang) System o Math Para una clase A que no est en java.lang se usa 1. su nombre (en clases en el mismo paquete que A) 2. <nombre paquete>.<nombre clase> (fuera del paquete que contiene a A)
57

Ejemplo
Programa para calcular el valor medio de un milln de nmeros generados aleatoriamente, usando las clases
Random del paquete java.util System del paquete java.lang
public class TestAleatorio { public static void main(String[] args) { java.util.Random rnd = new java.util.Random(); double sum = 0.0; for (int i = 0; i < 1000000; i++) { sum += rnd.nextDouble(); } System.out.println(media = + sum / 1000000.0); } }

58

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

59

4.1 Tipos y valores


En Java hay tipos bsicos.
Llamamos valores a los datos de estos tipos.

Slo existen los siguientes tipos bsicos:


byte int float char (entero de 8 bits) (entero de 32 bits) (decimal de 32 bits) (Unicode de 16 bits) short long double boolean (entero de 16 bits) (entero de 64 bits) (decimal de 64 bits) (true, false)

No se pueden definir ms tipos bsicos.

60

4.1 Tipos y valores


Los valores, al igual que los objetos, se pueden manipular mediante variables. Las variables de tipos bsicos contienen a los valores, no los referencian. Los valores tambin se pueden manipular directamente, usando sus representaciones literales
int 56, 0123, 0xaf long 8456l, 33456L double 4.66, 23.7e3, 35.213d, 23.2D float 67.345f, 34.122F, 21.34e2f char a, $, \t, \u0061 boolean true, false int 1_000_000 0b1001_1100 (desde Java1.7)

61

Java

4.1 Tipos bsicos versus clases


Variables de tipos bsicos Almacenan el valor Variables de objetos Almacenan la referencia al objeto Esto tiene consecuencias en la manipulacin de referencias y valores.
Punto x

Punto pto = new Punto(1, 3);


y

pto

62

Java

4.1 Tipos bsicos versus clases


Punto

Punto pto = new Punto(1, 3);

1 3

pto

Punto pt1 = new Punto(1, 3); Punto pt2 = new Punto(2, 5); Segmento sg = new Segmento(pt1, pt2);
Punto Segmento origen destino

x
y

1 3
Punto

pt1

sg

x y

2 5

pt2

63

4.1 Conversiones de tipos y clases


Se producen conversiones de tipo o de clase de forma implcita en ciertos contextos.
Siempre a tipos ms amplios siguiendo la ordenacin:
byte short char int long float double

o a clases ascendentes en la lnea de la herencia.

Se permiten conversiones explcitas en sentido contrario mediante la construccin: (<tipo/clase>) <expresin> Slo se comprueban durante la ejecucin.

64

4.1 Conversiones implcitas: contextos


La conversin implcita se produce en los siguientes contextos: Asignaciones (el tipo de la expresin se promociona al tipo de la
variable de destino)

Invocaciones de mtodos (los tipos de los parmetros


actuales se promocionan a los tipos de los parmetros formales)

Evaluacin de expresiones aritmticas (los tipos de los


operandos se promocionan al del operando con el tipo ms general y, como mnimo se promocionan a int)

Concatenacin de cadenas (los valores de los argumentos se


convierten en cadenas)
65

4.2 Constantes
Una variable se puede declarar como constante precediendo su declaracin con la etiqueta final: final int NUM_BARCOS = 10; La inicializacin de una variable final se puede hacer en cualquier momento posterior a su declaracin. Cualquier intento de cambiar el valor de una variable final despus de su inicializacin produce un error en tiempo de compilacin.

66

4.3 Identificadores
Un identificador (nombre) es una secuencia arbitraria de caracteres Unicode: letras, dgitos, subrayado o smbolos de monedas. No debe comenzar por dgito ni coincidir con alguna palabra reservada.
int nmero;

Los identificadores dan nombre a: variables, mtodos, clases e interfaces.

Por convenio:

Nombres de variables y mtodos en minsculas. Si son compuestos, las palabras no se separan y comienzan con mayscula.

long valorMximo;
Nombres de clase igual, pero comenzando con mayscula.

class PilaNat ...


Nombres de constantes todo en maysculas. Si son compuestos, las palabras se separan con subrayados.

final int CTE_GRAVITACIN

67

4.4 mbito de una variable


Un identificador debe ser nico dentro de su mbito. El mbito de una variable es la zona de cdigo donde se puede usar su identificador sin cualificar. El mbito determina cundo se crea y cundo se destruye espacio de memoria para la variable. Las variables, segn su mbito, se clasifican en las siguientes categoras:
Variable de clase o de instancia Variable local Parmetro de mtodo Parmetro de gestor de excepciones
68

4.4 mbitos
class MiClase { ...
Variables de clase

static public void mtodo(...) { Parmetros y Variables de instancia


Variables locales

{... }

catch(...) {
Parmetros catch

} }

}
69

4.5 Inicializacin de variables


Las variables de clase se inicializan automticamente al cargar la clase. Las variables de instancia se inicializan automticamente cada vez que se crea una instancia. Las variables locales no se inicializan de forma automtica y el compilador produce un error si no se hace manualmente.

Valores de inicializacin automtica:


false \u0000 0 +0.0F +0.0D null

71

4.6 Expresiones
Una expresin es una combinacin de
literales, variables, operadores y mensajes,

acorde con la sintaxis del lenguaje, que se


evala a un valor simple o a una referencia a un objeto y

devuelve el resultado obtenido.


72

4.7 Operadores (I)


Un operador es una funcin de uno, dos o tres argumentos. Existen operadores
aritmticos (+_, -_, _++, _--, ++_, --_) (_+_, _-_, _*_, _/_, _%_) de relacin/comparacin ( >, >=, <, <=, ==, lgicos ( &&, ||, !, &, |, ^ ) de asignacin (=, +=, -=, *=, /=, %=, &=, |=, para la manipulacin de bits Otros operadores ( _?_:_ )

!=

^=)

73

4.7 Operadores (II)


Con un operador y sus argumentos se construyen expresiones simples.
3 * 5 x += 7.3 a <= 45

Las expresiones simples se pueden combinar dando lugar a expresiones compuestas.


3 * 5 + x += 7.3 y *= x += 7.3

El orden de evaluacin de las expresiones compuestas depende de:


La precedencia y La asociatividad

de los operadores que aparezcan


74

4.7 Precedencia de operadores


Precedencia (en sentido decreciente) var++ var-& ++var --var ! | new (tipo)exp && * / % || + = += -= *= ... < > <= >= == != El orden de las operaciones en una expresin siempre se puede modificar mediante el uso de parntesis

75

4.7 Asociatividad de operadores


Asociatividad
Todos los operadores binarios (excepto la asignacin) a igualdad de precedencia, asocian por la izquierda. La asignacin asocia por la derecha

Ejemplos de expresiones:
3 + 4 / 2 x = y = 3 x > 3 && y 3 * (x = 5) x = ++y / 2 x = y++ / 2

76

4.8 Instrucciones/sentencias
Existen tres clases de instrucciones o sentencias:
Sentencias de expresin Se obtienen terminando en ; alguna de las expresiones siguientes:
asignaciones incrementos/decrementos ++/-mensajes creaciones de objeto

Sentencias de declaracin de variables Sentencias de control


77

4.8.1 Sentencias de declaracin


Las sentencias de declaracin de variables tienen la forma: <tipo> <n. variable>
int x;

Las declaraciones de variables del mismo tipo/clase pueden agruparse:


int x, y, z;

Las sentencias de declaracin pueden agruparse con las de asignacin a las mismas variables:
int x = 5, y = 12, z = 213;
78

4.8.2 Sentencias de control


Las sentencias de control del flujo de ejecucin se agrupan en: sentencias de repeticin sentencias de seleccin sentencias para el control de excepciones sentencias de salto/ramificacin

79

4.8.2.1 Sentencias de repeticin


while (<exp. booleana>) <sentencia> do <sentencia> while (<exp. booleana>); for (<exp1>; <exp. bool>; <exp2> <sentencia>

80

4.8.2.1 Sentencias de repeticin


Ejemplos:
for (int i = 0; i < 20; ++i) { ... } for (int i = array1.length; --i >= 0){ ... } for ( ; ; ) { ... }

Existe una sintaxis de for especial para arrays y colecciones.


81

4.8.2.2 Sentencias de seleccin (I)


if (<exp. bool>) <sentencia>

if (<exp. bool>) <sentencia1> else <sentencia2>


if (<exp. bool1>) <sentencia1> else if (<exp. bool2>) <sentencia2> ... else <sentenciaN> <exp bool> ? <exp1> : <exp2>
Ejemplo:
System.out.println(El carcter + car + es + (Character.isUpperCase(car) ? mayscula : minscula));

82

4.8.2.2 Sentencias de seleccin (II)


switch (<exp>) { case <exp ent1>: <sentencia1>; break; ... default: <sentenciaN>; break; } exp puede se cualquier numerable o String (desde Java 1.7)

Ejemplo:
int mes; ... switch (mes) { case 1: System.out.println(Enero); break; case 2: System.out.println(Febrero); break; ... case 12: System.out.println(Diciembre); break; }
83

4.8.2.2 Sentencias de seleccin (III)


int ao, mes, numDas; ... switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDas = 31; break; case 4: case 6: case 9: case 11: numDas = 30; break; case 2: if ... else ... }

84

4.9 Bloques
Grupo de cero o ms sentencias, encerradas entre llaves, dando lugar a una sentencia compuesta.
{ <sentencia1> ... <sentenciaN> }

Un bloque se puede usar en cualquier parte donde se necesite una sentencia simple.

85

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

86

5. Cadenas de caracteres. Clase String


Secuencia de caracteres Unicode
Los valores se encierran entre comillas dobles ( ) Ejemplo de una cadena de caracteres

La clase String tiene constructores y mtodos para crear y manipular cadenas:


String myStr = hola; myStr = adis; String saludo = new String(hola y adis);

87

5. Mtodo toString()
Devuelve una cadena que representa el estado actual del objeto
class Punto { private double x, y; public String toString() { return ( + x + , + y + ); } }

88

Ejercicio. Implementar una clase


La clase Persona describe objetos que guardan informacin sobre personas que trabajan o estudian en la Universidad. Cada persona tiene un nombre (String), un dni (String), una edad (int), y un email(String) y una direccin (String). Se ha de definir un constructor para la clase y los mtodos necesarios para acceder y modifcar los atributos privados.
89

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

90

6.1 Arrays en Java (I)


componentes array nombre

Objetos que representan estructuras de datos de longitud fija con componentes de un mismo tipo o clase. Con una sintaxis particular: Declaracin int [] listaEnteros; Punto [] listaPuntos; componentes Inicializacin tamao listaEnteros = new int[10]; listaPuntos = new Punto[23]; char[] vocales = {a, e, i, o, u}; array literal Punto p = new Punto(1, 1); Punto[] ap = {new Punto(2, 2), p, null}; La longitud se guarda en la constante length.
91

6.1 Arrays en Java (II)


Los arrays siempre comienzan por la posicin 0
for (int i = 0; i < listaEnteros.length; i++){ listaEnteros[i] = i; } for (int i = 0; i < listaPuntos.length; i++){ listaPuntos[i] = new Punto(i, i); } String[] cadenas = {CAD1, CAD2, CAD3}; for (int i = 0; i < cadenas.length; i++) { System.out.println(cadenas[i].toLowerCase()); }

92

6.2 Array de arrays (I)


Las componentes de un array pueden ser arrays. Al crear un array multidimensional con el operador new slo hace falta fijar el tamao de la primera dimensin.
int[][] matriz = new int[4][]; for (int i = 0; i < matriz.length; i++) { matriz[i] = new int[i + 5]; for (int j = 0; j < matriz[i].length; j++) { matriz[i][j] = i + j; } }

93

Ejercicio
Cul es el contenido del array creado con el siguiente trozo de cdigo?
int [][] array1 = new int[2][3];

for (int row = 0; row< array1.length; row++) for(int column =0; column < array1[row].length; column++) array1[row][column] = row;

94

Ejercicio
Cul es el contenido del array creado con el siguiente trozo de cdigo?
int [][] array1 = new int[2][]; array1[0] = new int[5]; for (int i = 0; i< array1[0].length; i++) array1[0][i] = i-3; array1[1] = new int[2]; array1[1][0] = 500; array1[1][1] = -500;
95

6.3 Array de arrays (II)


String[][] familias = { {Picapiedra,Pedro,Wilma,Pebbles,Dino}, {Mrmol,Pablo,Betty,Bam Bam}, {Simpson,Homer,Marge,Burt,Lisa,Maggie} }; for (int i = 0; i < familias.length; i++) { System.out.print(familias[i][0] + : ); for (int j = 1; j < familias[i].length; j++) { System.out.print(familias[i][j] + ); } System.out.println(); }

96

6.4 Copia de arrays (I)


Para la copia eficiente de componentes de un array a otro Java tiene el mtodo arraycopy en la clase System.
public static void arraycopy( Object arrayOrigen, int primndiceOrigen, Object arrayDestino, int primndiceDestino, int nmeroDeCompCopia)

97

6.4 Copia de arrays (II)


char[] arrayOrigen = {d,e,s,c,a,f,e,i,n,a,d,o}; char[] arrayDestino = new char[7]; System.arraycopy(arrayOrigen, 3, arrayDestino, 0, 7); System.out.println(new String(arrayDestino));

Si el array de destiono no es suficientemente grande obtendremos un error del tipo ArrayIndexOutofBoundsException

98

6.4 Copia de arrays (III)


Utilizar la documentacin de la API de Java
Online: http://docs.oracle.com/javase/7/docs/api/ Download:http://www.oracle.com/technetwork/java/javase /documentation/java-se-7-doc-download-435117.html

para aprender la funcin de los mtodos: copyOf (T[] original, int newLength) copyOfRange (T[] original, int from, int to) de la clase java.util.Arrays
99

Recorridos en arrays
char[] arrayOrigen = {d,e,s,c,a,f,e,i,n,a,d,o};
for (int i = 0; i < arrayOrigen.length; i++){ System.out.println(arrayOrigen[i]); }

Es posible utilizar una sintaxis alternativa


for( char c : arrayOrigen) { System.out.println(c); }

100

Mostrar un array
El siguiente segmento de cdigo
int[] ar = {1, 3, 5, 7, 9}; System.out.println(java.util.Arrays.toString(ar));

mostrar en la salida estndar


[1, 3, 5, 7, 9]

La clase Arrays est en java.util y se estudiar ms adelante. Tiene muchas ms funcionalidades como algoritmos de bsqueda, ordenacin, etc.
101

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

102

7.1 Tipo Enumerado


Tipo de datos compuesto por un conjunto fijo de valores.
enum Cardsuit { Clubs, Diamonds, Spades, Hearts };

Los valores son identificadores que se utillizan como constantes de clase (<Clase>.<ValorEnumerado>) Una variable de tipo enumerado puede recibir cualquiera de los valores enumerados del tipo.
Cardsuit favourite = Cardsuit.Diamonds;
103

7.1 Tipo enumerado


enum Week {Mon,Tue,Wed,Thur,Fri,Sat,Sun};

clase Example { public static void main(String [] args) { Week s = Week.Mon; Week t = Week.valueOf(Wed);// Week.Wed
for(Week se : Week.values()) { System.out.print(se + ); } }

Mon Tue Wed Thu Fri Sat Sun


104

Clases anidadas
Clases definidas dentro del cuerpo de otra clase. Se pueden distinguir diversos tipos (internas, locales, annimas), dependiendo del mbito en el que se declaren. Estudiaremos las clases internas estticas Se definen como las variables de clase de la clase externa (static). Para acceder a ellas debe cualificarse con el nombre de la clase externa (si es visible).
105

Clases internas estticas


Un ejemplo de clase interna esttica son los datos enumerados.
public class Urna { static public enum ColorBola {Blanca, Negra}; private int numBlancas, numNegras; public Urna(int nB, int nN) { numBlancas = nB; numNegras = nN; } public ColorBola sacaBola() { ColorBola bolaSacada = null; if (...) { bolaSacada = ColorBola.Blanca; numBlancas--; } else { bolaSacada = ColorBola.Negra; numNegras--; } ... return bolaSacada; } Urna.ColorBola cb = Urna.ColorBola.Negra; ... ...
106

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

107

8.1 Composicin
Mecanismo que permite la creacin de nuevos objetos a partir de otros ya implementados. Responde a una relacin de tipo tiene o est compuesto por.

As, por ej., un segmento tiene dos puntos (origen y extremo)


Tambin podemos decir que los puntos origen y extremo forman parte del segmento, o que el segmento est compuesto por dos puntos
Punto x, y: double trasladar(a, b) extremo distancia(pto) trasladar(a, b) longitud()
origen

Segmento

108

8.1 Composicin
public class Segmento { private Punto origen, extremo; public Segmento(double x1, double y1, double x2, double y2) { origen = new Punto(x1, y1); extremo = new Punto(x2, y2); } ... // Otros mtodos public double longitud() { return origen.distancia(extremo); } }

Para calcular la longitud de un segmento se utiliza el mtodo distancia de la clase Punto

109

8.1 Otros ejemplos de composicin


Otros ejemplos:
Un vector puede implementarse con un punto que representa el extremo del vector cuyo su origen est en el origen de coordenadas.
El vector tiene un punto.
Vector(5, 2)

Una recta podra implementarse con un vector y un punto. El punto es uno cualquiera de la recta y el vector proporciona la direccin de la misma.
La recta tiene o est definida por un punto y un vector
Vector(5, 2)

Punto(-3, 4)
110

8.1 Ms ejemplos de composicin


La composicin de una clase depender del uso que se haga con sus objetos.
Una persona tiene una edad (que se representa con un entero) y un nombre (que se representa con un String). Una persona tiene un nombre (que se representa con un String) y un DNI (que se representa con otro String) Una persona tiene edad, DNI, curso, asignaturas, etc. Un coche tiene un modelo (que se representa por un String) y un precio (que se representa con un float) Un coche est compuesto por un motor, 4 puertas, 4 ruedas, chasis, etc.

111

8.2 Herencia
Nueva posibilidad para reutilizar cdigo.
Algo ms que:
incluir ficheros, o importar mdulos
Polgono
Elipse

FiguraCerrada

Permite clasificar las clases en una jerarqua Responde a la relacin es un

Pentgono

Cuadriltero

Crculo

Rectngulo

Rombo

112

8.2 Herencia
Padres / Ascendientes / Superclase
Punto

Una subclase dispone de los atributos y mtodos de la superclase, y puede aadir otros nuevos.

La subclase puede modificar el comportamiento heredado (por ejemplo, redefiniendo algn mtodo heredado) .
Partcula

La herencia es transitiva. Los objetos de una clase que hereda de otra pueden verse como objetos de esta ltima.
113

Hijos / Descendientes / Subclase

public class Partcula extends Punto { protected double masa; final static double G = 6.67e-11; public Partcula(double m) { Se refiere a this(0, 0, m); Partcula(double, double, } double) public Partcula(double a, double b, double m) { super(a, b); Se refiere a masa = m; Punto(double, double) } public void masa(double m) { masa = m; } public double masa() { return masa; } public double atraccin(Partcula part) { double d = this.distancia(part); return G * masa * part.masa() / (d * d); } }
114

Son los mtodos heredados adecuados para la subclase?


Una subclase que hereda un mtodo de una superclase puede redefinirlo, es decir, cambiar su implementacin. De esa manera la subclase adapta su comportamiento a sus necesidades.
Suma de distancias entre puntos consecutivos

Polgono

Cuadrado lado: double

permetro( ): double

Resultado = 4 * lado

permetro( ): double

La redefinicin puede impedirse mediante el uso del calificador final.


115

8.3 Herencia vs. composicin


Mientras que la herencia establece una relacin de tipo es-un, la composicin responde a una relacin de tipo tiene o est compuesto por. As, por ejemplo, una partcula es un punto (con masa), mientras que un segmento tiene dos puntos (origen y extremo)
Partcula masa: double atraccin(part)

Punto
x, y: double

origen

Segmento

trasladar(a, b) extremo distancia(pto)

trasladar(a, b) longitud()

116

8.4 Herencia en Java


En Java se pueden definir subclases o clases que heredan estado y comportamiento de otra clase (la superclase) a la que pueden ampliar aadiendo nuevos mtodos y atributos: class MiClase extends Superclase { ... } En Java slo se permite herencia simple, por lo que pueden establecerse jerarquas de clases. Todas las jerarquas confluyen en la clase Object de java.lang que recoge los comportamientos bsicos que debe presentar cualquier clase.
117

8.4.1 Herencia y constructores


Los constructores no se heredan. Cuando se define un constructor se debe proceder de alguna de las tres formas siguientes:
1. Invocar a un constructor de la misma clase (con distintos argumentos) mediante this:
Por ejemplo: public Punto() { this(0, 0);
}

La llamada a this debe estar en la primera lnea

118

8.4.1 Herencia y constructores


2. Invocar algn constructor de la superclase mediante super:
Por ejemplo: public Partcula(double a, double b, double m){ super(a, b); masa = m; } La llamada a super debe estar en la primera lnea.

3. De no ser as, se invoca por defecto al constructor sin argumentos de la superclase (:


Por ejemplo: public Partcula() { // Se invoca el constructor por defecto Punto() masa = 0; }

119

8.4.2 Herencia y mtodos de instancia


Un mtodo de instancia de una clase puede redefinirse en una subclase.
Salvo si el mtodo est declarado como final (o la clase).

El mtodo redefinido queda oculto en la subclase por el nuevo mtodo. Una redefinicin puede ampliar la visibilidad de un mtodo.

Si se desea acceder al redefinido, se debe utilizar la sintaxis


super.<nombre del mtodo>(<argumentos>)

120

Cul es la salida del siguiente programa?


public class B{ public void m(){ System.out.println(En A."); } } public class A{ public static void main(String[] args){ B obj = new B(); B obj2 = new C(); obj.m(); obj2.m(); } } } public class C extends B{ public void m(){ System.out.println(En B."); super.m(); }

121

8.5.3 Prohibiendo subclases


Por razones de seguridad o de diseo, se puede prohibir la definicin de subclases para una clase etiquetndola con final.
Recordad que una subclase puede sustituir a su superclase donde sta sea necesaria y tener comportamientos muy distintos

El compilador rechazar cualquier intento de definir una subclase para una clase etiquetada con final. Tambin se pueden etiquetar con final:
mtodos, para evitar su redefinicin en alguna posible subclase. variables, para mantener constantes sus valores o referencias.
122

8.6.1 Polimorfismo sobre los datos Un lenguaje tiene capacidad polimrfica sobre los datos si
una variable declarada de un tipo (o clase) determinado tipo esttico puede hacer referencia en tiempo de ejecucin a valores (objetos) de tipo (clase) distinto tipo dinmico .

La capacidad polimrfica de un lenguaje no suele ser ilimitada, y en los LOOs est habitualmente restringida por la relacin de herencia:
El tipo dinmico debe ser descendiente del tipo esttico.

Punto pto = new Partcula(3, 5, 22);

Tipo esttico de pto

Tipo dinmico de pto


123

Polimorfismo sobre los datos


Una variable puede referirse a objetos de clases distintas de la que se ha declarado. Esto afecta a:
asignaciones explcitas entre objetos, paso de parmetros, devolucin del resultado en una funcin.

La restriccin dada por la herencia permite construir estructuras con elementos de naturaleza distinta, pero con un comportamiento comn:

124

Java

Punto pto = new Punto(); Partcula part = new Partcula(2);


pto = part; // Asignacin correcta part = pto; // Asignacin incorrecta part = (Partcula) pto; // Peligroso

part

pto
(Partcula)

(Partcula)
x=0 y=0 m=2

(Punto) x=0 y=0

x=0 y = 0 m = ??

125

8.6.2 Vinculacin dinmica


La vinculacin dinmica es el complemento indispensable del polimorfismo sobre los datos y consiste en que:

La invocacin del mtodo que ha de resolver un mensaje se retrasa al tiempo de ejecucin, y se hace depender del tipo dinmico del objeto receptor.
Qu significa vinculacin esttica? La invocacin de un mtodo que resuelve el mensaje queda fijada en tiempo de compilacin. En este caso, el compilador selecciona el mtodo adecuado consultando la clase que se utiliz en la declaracin del objeto.
126

8.6.2 Vinculacin dinmica


Polgono obj; if () obj = new Cuadrado(); else obj = new Polgono(); obj.permetro(); Polgono
permetro{^...}

:Polgono obj : Polgono :Cuadrado

Square
permetro{^4*side}

Cmo traduce el compilador la expresin obj.permetro() ? (1) Comprueba que el tipo esttico de obj (la clase Polgono) acepta el mensaje permetro(), (i.e. se asegura de que existe al menos una definicin para el mtodo) (2) Se utiliza la vinculacin dinmica para, en tiempo de ejecucin, elegir la versin del mtodo a ejecutar (en el ejemplo permetro() de la clase Cuadrado)
127

public class PuntoAcotado extends Punto { private Punto esquinaI, esquinaD; public public public public public PuntoAcotado() { } PuntoAcotado(Punto eI, Punto eD) { } double ancho() { } double alto() { } void trasladar(double a, double b) {

super.trasladar(a, b); if (abscisa() < esquinaI.abscisa()) abscisa(esquinaI.abscisa()) if (abscisa() > esquinaD.abscisa()) abscisa(esquinaD.abscisa()) if (ordenada() < esquinaI.ordenada()) ordenada(esquinaI.ordenada()) if (ordenada() > esquinaD.ordenada()) ordenada(esquinaD.ordenada())

}
}
128

pac PuntoAcotado PuntoAcotado V public class Punto { x =0 2 x= I private double x, y; y =0 5 y= N public Punto() { } pto C U public void trasladar(double a, double b) { L x += a; y += b; A } C public double distancia(Punto p) { } I } N Punto eI = new Punto(0, 0);
D I N M I C A

Punto eD = new Punto(5, 5); Punto pto; PuntoAcotado pac = new PuntoAcotado(eI, eD); pto = pac; pto.trasladar(2, 7);
129

8.6.3 Herencia, variables y mtodos


Los mtodos y variables de clase, y las variables de instancia se resuelven mediante vinculacin esttica. Los mtodos de instancia: Se resuelven mediante vinculacin dinmica super se resuelve mediante vinculacin dinmica, pero la bsqueda comienza en la superclase de la clase donde aparece super.

130

SALIDA: Ejemplo1.java clase A { char c = 'A'; } clase B extends A { char c = 'B'; } public clase Ejemplo1 { public static void main(String[] args) { A p = new A(); B s = new B(); A t = s; System.out.println(p.c); System.out.println(s.c); System.out.println(t.c); } }

A B A

131

public class Uno { public int test() { return 1; } public int resultado1() { return this.test(); } } public class Dos extends Uno { public int test() { return 2; } }

SALIDA: obj3.test() = 2 obj3.resultado2() = 2 obj3.resultado3() = 2 obj4.resultado1() = 4 obj4.resultado2() = 4 obj4.resultado3() = 2

public class Tres extends Dos { public int resultado2() { return this.resultado1(); } public int resultado3() { return super.test(); } }
public class Cuatro extends Tres { public int test() { return 4; } } public class Prueba { public static void main(String[] args) { Tres obj3 = new Tres(); Cuatro obj4 = new Cuatro(); System.out.println("obj3.test() System.out.println("obj3.resultado2() System.out.println("obj3.resultado3() System.out.println("obj4.resultado1() System.out.println("obj4.resultado2() System.out.println("obj4.resultado3() } }

= = = = = =

" " " " " "

+ + + + + +

obj3.test()); obj3.resultado2()); obj3.resultado3()); obj4.resultado1()); obj4.resultado2()); obj4.resultado3());


132

public class Uno { public int test() { return 1; } public int resultado1() { return this.test(); } } public class Dos extends Uno { public int test() { return 2; } }

SALIDA: obj3.test() = 3 obj3.resultado2() = 3 obj3.resultado3() = 2 obj4.resultado1() = 4 obj4.resultado2() = 4 obj4.resultado3() = 2

public class Tres extends Dos { public int resultado2() { return this.resultado1(); } public int resultado3() { return super.test(); } public int test() { return 3; } } class Cuatro extends Tres { public int test() { return 4; } } public class Prueba { public static void main(String[] args) { Tres obj3 = new Tres(); Cuatro obj4 = new Cuatro(); System.out.println("obj3.test() System.out.println("obj3.resultado2() System.out.println("obj3.resultado3() System.out.println("obj4.resultado1() System.out.println("obj4.resultado2() System.out.println("obj4.resultado3() } }

= = = = = =

" " " " " "

+ + + + + +

obj3.test()); obj3.resultado2()); obj3.resultado3()); obj4.resultado1()); obj4.resultado2()); obj4.resultado3());


133

public class Uno { public int test() { return 1; } public int resultado1() { return this.test(); } } public class Dos extends Uno { public int test() { return 2; } }

SALIDA: obj3.test() = 3 obj3.resultado2() = obj3.resultado3() = obj4.resultado1() = 4 obj4.resultado2() = 4 obj4.resultado3() = 2

public class Tres extends Dos { public int resultado2() { return this.resultado1(); } public int resultado3() { return super.test(); } public int test() { return 3; } } public class Cuatro extends Tres { public int test() { return 4; } } public class Prueba { public static void main(String [] args) { Uno obj3 = new Tres(); Tres obj4 = new Cuatro(); System.out.println("obj3.test() = System.out.println("obj3.resultado2() = System.out.println("obj3.resultado3() = System.out.println("obj4.resultado1() = System.out.println("obj4.resultado2() = System.out.println("obj4.resultado3() = } }

" " " " " "

+ + + + + +

obj3.test()); obj3.resultado2()); obj3.resultado3()); obj4.resultado1()); obj4.resultado2()); obj4.resultado3());


134

C.java clase A { SALIDA: static void f() { System.out.println(A); } void g() { this.f(); } } clase B extends A { static void f() { System.out.println(B); } } public clase C { public static void main(String[] args) { A un = new B(); a.g(); a.f(); } }

A A

135

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. Introduccin Clases y objetos Programas y paquetes Elementos bsicos Cadenas de caracteres Arrays Clases anidadas Composicin y herencia Clases abstractas e interfaces

136

9.1 Clases abstractas


Clases de las que no se pueden crear instancias
Pueden declarar mtodos sin implementar
Mtodos abstractos

Las subclases estn obligadas a implementar dichos mtodos

Se pueden declarar variables cuyo tipo esttico sea una clase abstracta. Con ello podrn referirse a objetos de las diversas clases descendientes
137

Java

CLASE ABSTRACTA
abstract public class Polgono { private Punto vrtices[]; public void trasladar(double a, double b){ for (int i = 0; i < vrtices.length; i++) vrtices[i].trasladar(a, b); } public double permetro() { double per = 0; for (int i = 1; i < vrtices.length; i++) per = per + vrtices[i - 1].distancia(vrtices[i]); return per + vrtices[0].distancia(vrtices[vrtices.length]); } abstract public double rea(); } MTODO ABSTRACTO

Polgono pol = new Polgono();


138

Clases abstractas
Las clases abstractas definen un protocolo comn en una jerarqua de clases. Obligan a sus subclases a implementar los mtodos que se declararon como abstractos.
De lo contrario, esas subclases se siguen considerando abstractas.

En Java, adems de clases abstractas se pueden definir interfaces (que se pueden considerar clases completamente abstractas).
139

public abstract class Polgono { protected Punto[] vrt; public Polgono(Punto[] vs) { vrt = vs; } public void trasladar(double a, double b) { for (Punto pto : vrt) pto.trasladar(a,b); } public double permetro() { Punto ant = vrt[vrt.length]; double res = 0; for (Punto pto : vrt) { res + = pto.distancia(ant); ant = pto; } return res; } abstract public double rea(); // No sabemos calcularla } public class Cuadrado extends Polgono { public class Rectngulo extends Polgono { public Cuadrado() {} public double rea() { return lado() * lado(); } public double lado() { return vrt[0].distancia(vrt[1]); } public String toString() {}
public Rectngulo() {} public double rea() { return base() * altura(); } public double base() { return vrt[0].distancia(vrt[1]); } public double altura() { return vrt[1].distancia(vrt[2]); } } public String toString() {}
140

9.2 Interfaces
Define un protocolo de comportamiento, es decir un contrato que las clases debern respetar.
Las clases pueden implementar la interfaz respetando el contrato. Se utilizarn cuando se demande el contrato.

Una interfaz slo puede ser extendida por otra interfaz. Una interfaz puede heredar de varias interfaces. Una clase puede implementar varias interfaces.
142

Definicin de interfaces
En una interfaz slo se permiten constantes y mtodos abstractos.
public static final package, en caso de omisin

public interface miInterfaz extends interfaz1, interfaz2 { String CAD1 = SUN; String CAD2 = PC; void valorCambiado(String producto, int val); ... }
public abstract
143

Implementacin de interfaces
Cuando una clase implementa una interfaz,
se adhiere al contrato definido en la interfaz y en sus superinterfaces, hereda todas las constantes definidas en la jerarqua, Adherirse al contrato quiere decir que debe implementar todos los mtodos
(salvo que sea una clase que se quiera mantener abstracta en cuyo caso, los mtodos no implementados aparecern como abstract).
public class MiClase extends Superclase1 implements Interfaz1, Interfaz2,... { ... }
144

public interface SecuenciaEnteros { void insertar(int pos, int elem); void eliminar(int pos); int mximo(); boolean pertenece(int elem); boolean esVaca(); int tamao(); }

public class SecuenciaEntEsttica

implements SecuenciaEnteros { private numElementos = 0; int[] secuencia; public SecuenciaEntEsttica(int tam) { secuencia = new int[tam]; numElementos = 0; } public public public public public public public void insertar(int p, int e) {} void eliminar(int p) {} int mximo() {} boolean pertenece(int e) {} boolean esVaca() {} int tamao() {} String toString() {}

public class SecuenciaEntDinmica

implements SecuenciaEnteros { static protected class Nodo { int dato; Nodo siguiente; } private Nodo primero; public SecuenciaEntDinmica() {} public public public public public public public void insertar(int p, int e) {} void eliminar(int p) {} int mximo() {} boolean pertenece(int e) {} boolean esVaca() {} int tamao() {} void aadir(SecuenciaEnteros sec)

{} }

public String toString() {}

145

Uso de interfaces
Se pueden declarar variables y parmetros de tipo una interfaz. Se requieren instancias de clases que implementen la interfaz.
Interfaz SecuenciaEnteros sec; sec = new SecuenciaEntEsttica(100); // Inserciones mltiples sobre la secuencia Objeto de clase que implementa la interfaz

if (sec.tamao() == 100) { SecuenciaEnterosDinmica sec1; sec1 = new SecuenciaEnterosDinmica(); sec1.aadir(sec); sec = sec1; } // Nuevas inserciones

El mtodo aadir tiene como argumento formal la interfaz

146

Qu debera saber?
1. La diferencia entre
a) b) c) d) e) Clase y objeto Mtodo y mensaje Composicin y herencia Vinculacin esttica y dinmica Clase abstracta e interfaz

2. Para qu se utiliza la herencia? 3. Qu significa polimorfismo sobre los datos? 4. Utilizar el lenguaje Java para escribir programas sencillos que utilicen los elementos y mecanismos de la programacin orientada a objetos.
147

S-ar putea să vă placă și