Está en la página 1de 65

POO – Java

Clase 1
 Origen, características, generalidades. Comparación con C++
 Static. Operadores, casteo.
 Constructores. Sobrecarga de métodos
 Garbage Collection
 Librerías: packages.
 Especificadores de acceso.
 Reusabilidad: herencia, composición.
 Uso de final.
 Polimorfismo. Clases y métodos abstractos.
 Interfaces. Herencia múltiple.
 Clases anidadas.
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 1
Origen de Java

• Sun Microsystems. Verano de 1995


• Derivado de C++
• Objetivo: resolver problemas por la proliferación de
arquitecturas incompatibles
• Gratuito
• Multiplataforma
• POO pura

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 2


Productos Tecnología Java
(más que un lenguaje)
• Java Platform, Standard Edition (JavaSE)
– Incluye Java Development Kit (JDK), que tiene incluido Java
Runtime Environment (JRE) el cual permite la ejecución de un
programa Java.
• Java Platform, Enterprise Edition (JavaEE)
– Enterprise/Server. Basado en J2SE
• Otros productos: Oracle Java Embedded (IoT),
JavaCard, JavaTV.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 3


Productos Tecnología Java – Java SE

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 4


Productos Tecnología Java – Java EE

j2eebundles.gif

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 5


Tecnología Java

• Independencia IDE:
– Eclipse, IntelliJ, VSCode, NetBeans (gratuitos)
• Orientación a Internet
– Servlets, JSP, JSF
• API (Interfaz de Programación de Aplicaciones) ampliamente
desarrollada
– seguridad, objetos remotos, programación concurrente, networking, etc.
• Numerosos Frameworks
– Struts, Spring, Hibernate, Vaadin, etc.
• Lenguajes que ha influido: C#, JavaScript, PHP.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 6


Comparativa con C++ - Sintaxis
Uso de bibliotecas import (no existen macros de preprocesador, como
include)

Operador de herencia extends (palabra reservada en lugar del operador ::)

Constantes static final (son variables constantes)

Métodos inline NO existen. (El cuerpo de los métodos se incluyen con su


definición, no hay prototipos)

Métodos virtuales Todos, menos los estáticos (static)

Clases amigas NO existen (relación de clases por paquete)

Condiciones expresiones booleanas en lugar de numéricas

Argumentos por defecto A partir de JSE5, argumentos variables.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 7


Comparativa con C++ - Diseño
Tipos de datos simples Los mismos, más boolean (true/false)

Punteros NO existen (prog. segura). Referencias a objeto

Vectores Son objetos. Método length(). Indices controlados

Registros y enumeraciones Desde JSE5, aparece Enum.

Elementos globales NO existen. Simuladas con static

Cuerpo de los métodos Codificados en las definiciones de las clases (no existen
archivos de cabecera .h)
Destructores NO existen (recolección automática de basura).

Arbol de herencia Unico. Todas las clases heredan de la clase Object

Herencia Simple. (NO acepta herencia múltiple. Uso de interfaces).


super.
Sobrecarga de métodos Igual

Interfaces Especie de clases abstractas con métodos abstractos


UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 8
Comparativa con C++ - Ejecución
Cadenas se convierten en objetos String, en lugar de vectores
estáticos de caracteres

Instanciación Los objetos se crean en el heap (new), nunca en la


pila (malloc). Tipos simples no permiten new (excepto
vectores)
Bibliotecas estándar Multiplataforma en su API, en lugar de bibliotecas
según plataforma

Gestión de errores Lanzamiento de excepciones

Acceso directo al hardware Restringido

Incorporaciones clases para la Web, multithreading, JavaBeans

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 9


Manipulación de objetos
• La creación de objetos es siempre dinámica (new).
• Se utiliza como identificador (handler) una referencia.
– Así se le asigna memoria (heap) para alojar el objeto y se le
asignan valores por default.
String s = new String();
s
objeto
dirección
String

• Tipos primitivos: se almacenan en el stack por cuestiones de eficiencia (char,


byte, short, int, long, float, double)

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 10


Manipulación de objetos

• El identificador puede existir sin estar conectado a un


objeto
String s; //crea la referencia,
// pero no se puede enviarle un
mensaje
int largo = s.length();

s.metodo
s
null (Error ejecución)
NullPointerException

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 11


Compilación y ejecución
• El código Java es almacenado como un archivo .java. El nombre
del archivo debe ser igual al de la clase que implementa.
• El archivo . java es compilado en archivo .class (bytecodes).
Este archivo binario es interpretado en tiempo de ejecución.

Compila JVM Programa


(javac) (java) ejecutado

HolaFecha.java HolaFecha.class

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 12


Librerías externas
• Librerías de clases: packages

• Para indicar que se va utilizar una clase de una librería se utiliza


la palabra clave import

import java.util.ArrayList;
import java.util.*;

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 13


El uso de static
• Necesidad de:
– Almacenar información independientemente de la creación
de objetos (variables de clase). Los atributos no-estáticos
son llamados variables de instancia.

class StaticTest {
static int i = 47;
}
……………
StaticTest st1 = new StaticTest();
Existe un único lugar de
almacenamiento StaticTest st2 = new StaticTest();
st1.i y st2.i tienen el mismo valor ……………….

StaticTest.i++;
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 14
El uso de static
• Métodos que no están asociados a ningún objeto
– que puedan invocarse aún cuando no se ha creado un objeto
– No afectan atributos, trabajan sobre parámetros.

class StaticFun {

static void incr(){
StaticTest.i++; }
}
Los dos modos de invocarlo son correctos

StaticFun sf = new StaticFun(); StaticFun.incr();


sf.incr();
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 15
Un primer programa
import java.util.*; Uso de clases de otras librerías
(packages)
public class HolaFecha {
public static void main(String[] args) {
System.out.println("Hola, es: ");
Clase
// notación punto: objeto.metodo ejecutable
System.out.println(new Date());
/* comentario
multilinea */
Salida por
} consola
}

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 16


Comentarios y Documentación
• javadoc: mantener la documentación embebida dentro
del mismo código fuente.
– Los comandos para javadoc deben colocarse entre
/** comentario */
– Se pueden utilizar dos elementos:
• HTML embebido
• Uso de tags para clases y métodos (Ver Clase 1 – Referencias)

• Se genera documentación en formato HTML (como la


API)
http://docs.oracle.com/javase/8/docs/api/index.html
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 17
Tipos de datos
• Ocho tipos primitivos:
– Seis tipos numéricos
• Enteros: byte, short, int, long
• Punto flotante: float, double
– Un tipo char , para caracteres
– Un tipo boolean
• Tipos definidos por el usuario
– Clases (ej. String)
– Interfaces
– Arreglos
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 18
Tipos Numéricos - Longitud

Tipo Longitud Rango


(bits)
long 64 -9.223.372.036.854.775.808..
9.223.372.036.854.775.807
int 32 -2.147.483.648..2.147.483.647
short 16 -32.768 .. 32.767
byte 8 -128 .. 127
double 64 1.7e-308 .. 1.7e+308
float 32 3.4e-038 .. 3.4e+038
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 19
Conversiones de tipos (cast)
• Java automáticamente convierte un valor numérico a
otro de tipo mas grande (upcasting).

byte
short
int
long
• No realiza “downcast” automático (error compilación)
byte short int long

• Cast explícito

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 20


Operadores: Asignación de objetos
• Para los tipos primitivos la asignación es por copia valor (cada variable
tiene su espacio independiente).
• Para la asignación de objetos lo que se asigna es la referencia
(aliasing)
class Number {
int i; // Encapsulamiento? Alcance?
}
public class Asignacion {
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.i = 9; n2.i = 47;
n1 = n2; // 2 variables de referencia
// pueden referirse al mismo objeto
n1.i = 27;
System.out.println("n1:" + n1.i + " n2:" + n2.i);
}
} Mdp – Algoritmos y Estructuras de Datos II - Java
UCAECE 21
Operadores: Comparación de objetos
• El uso de los operadores = = y != puede ser confuso
con objetos!

public class Equivalencia {


public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);

System.out.println(n1 == n2);

System.out.println(n1 != n2);
}
}

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 22


Operadores: Comparación de objetos
• Si se desea comparar objetos se debe usar el método equals()
public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
}}

• Se recomienda implementarlo en clases propias.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 23


Autoboxing
• Boxing
– El compilador automáticamente añade el código para convertir
un tipo primitivo en su clase "wrapper" correspondiente
(ej. int – Integer)
• Unboxing
– El proceso opuesto, convertir un objeto (tipo Integer) en un valor
primitivo (un int)

// auto-boxing
Integer iObject = 1; // equivale a new Integer(1)
// auto-unboxing
int i = iObject; // equivale a iObject.intValue()
// lanza NullPointerException si iObject es nulo

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 24


Autoboxing - Precauciones
– Las operaciones de los tipos primitivos estarían disponibles para
las clases wrapper, aunque realmente se aplica autoboxing. Tener
en cuenta costo computacional adicional.

Integer iObject = 0; Integer iObject1 = 1;


Integer iObject2 = iObject + iObject1;

– Con el operador "==". sólo hay autounboxing cuando uno de los


operandos es primitivo, en caso contrario se comparan objetos.

Integer iObjeto1 = 1000; Integer iObjeto2 = 1000;


if(iObjeto2 == iObjeto1)
System.out.println(“Referencias iguales”);

– Cuando hay sobrecarga de métodos, la resolución se basa en los


argumentos. Con autoboxing se pueden dar casos de ambigüedad.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 25


El uso de “+” con String
• Es un ejemplo de operador sobrecargado.
• Si una operación empieza con un String entonces todos los
operandos deben ser Strings, o los convierte.
– Es un ejemplo de cómo un operador puede cambiar el valor de los
operandos

........
int x = 0, y = 1, z = 2;
String sString = "x, y, z";
System.out.println(sString + x + y + z);
..........

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 26


Operadores
• Un error común:
while(x = y) { ....
En C++ produce un loop infinito. En Java, un error de
compilación.
• Java no tiene el operador sizeof()
• Precedencia de operadores y palabras reservadas
(ver Clase 1 – Referencias)

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 27


Control de Flujo en Java
• Un bloque de sentencias se agrupa por medio del uso
de { }.
• Cada bloque se ejecuta como una sentencia simple
dentro de la estructura de control de flujo.
• Cada bloque determina el alcance de las variables.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 28


Sentencias de control de flujo

• Estas sentencias son tomadas de C++


• Se evalúan expresiones booleanas, en lugar de
expresiones enteras (C++)
• switch: desde Java SE7 se puede usar un objeto String
en la expresión
public static int getMonthNumber(String month) {
switch (month.toLowerCase()) {
case "january": monthNumber = 1; break;
case "february": monthNumber = 2; break;

}

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 29


Constructor
class Rock {
Rock(int i) {
System.out.println(
"Creando Rock número " + i);
}
}
public class SimpleConstructor {
public static void main(String[] args) {
for(int i = 0; i < 10; i++)
new Rock(i);
}
}
• Es un método que no devuelve nada y no se declara como void.
– Si se lo declarara como void, no se ejecutará al crear un objeto
• Si no se implementa se asume uno por defecto (sin parámetros)
• Una clase puede tener todos los constructores que necesite
UCAECE Mdp(sobrecarga)
– Algoritmos y Estructuras de Datos II - Java 30
El uso de la referencia this
• Se lo usa en los métodos de instancia para hacer
referencia al objeto con el que se invoca el método.
public class Movie {
private String title;
private String rating; this
public void setRating(String rating) {
this.rating = rating;
}
title : null
void anyMethod() {
mov1 rating: “PG”

Movie mov1 = new Movie();


title: null
Movie mov2 = new Movie(); rating: null
mov2
mov1.setRating("PG"); …

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 31


El uso de la referencia this
public class PruebaThis {
private int i = 0;
PruebaThis increment() {
i++;
return this;
}
void print() {
System.out.println("i = " + i);
}
public static void main(String[] args) {
PruebaThis x = new PruebaThis();
x.increment().increment().increment().print();
}
Method chaining ó Fluent Interface
}
(variante de patrón Builder)
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 32
Garbage Collector
• Java no implementa destructores. Utiliza un “recolector
de basura” a fin de recuperar la memoria que los
objetos ya no usan.
• Es automático. Libera al programador de la tarea de
“devolución” de memoria solicitada.
• Un objeto es elegible para la recolección de basura
cuando no existen más referencias a ese objeto.
– Las referencias que se mantienen en una variable
desaparecen de forma natural cuando la variable sale de su
ámbito.
...
– O cuando se borra explícitamente CPrueba c = new CPrueba();
...
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 33
c = null;
Garbage Collector - funcionamiento
• El gc funciona en un thread (hilo) de baja prioridad y funciona
tanto síncrona como asíncronamente dependiendo de la
situación y del sistema.
• El gc se ejecuta síncronamente cuando el sistema funciona fuera
de memoria o en respuesta a una petición de un programa Java.
• Un programa Java le puede pedir al gc que se ejecute en
cualquier momento mediante System.gc(). Esto no
garantiza que todos los objetos sean recolectados.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 34


Librerías de clases: Packages
• Premisa POO: separar las cosas que cambian de las que
permanecen estables.
• Herramientas: Packages y Especificadores de acceso
• El uso de packages permite unir a varias clases dentro de un
mismo namespace.(carpeta o directorio)

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 35


Especificadores de acceso
• Se colocan delante de la definición de una clase, variable o
método, controlando el acceso a ese elemento específico.
• Pueden ser:
– public, private, protected
– “friendly” o package access (por defecto)
• Implica que las clases pueden ser accedidas por los
miembros del mismo package.
• No tiene un modificador (palabra clave) explícito

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 36


Especificadores de acceso - Constructores
class Cucurucho {
private static Cucurucho instancia;
private Cucurucho() {...}
public static Cucurucho hacerUnCucurucho() {
if (instancia == null)
instancia = new Cucurucho();
return instancia;
} }
public class Helado {
public static void main(String[] args) {
//! Cucurucho x = new Cucurucho();
Cucurucho x = Cucurucho.hacerUnCucurucho();
} }
• ¿Por qué no se puede instanciar Cucurucho utilizando directamente
su constructor?
• ¿Se justifica ocultar el constructor? (patrón de diseño Singleton)
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 37
Especificadores de acceso:
¿cómo elegirlos?

• Apuntar a usar el nivel más restrictivo. Usar private, a


menos que se tenga una buena razón para no hacerlo.
• Evitar los atributos public, excepto que sean
constantes.
– Los campos public tienden a limitar la flexibilidad en los
cambios de código, por acoplar a una implementación en
particular. Violación del principio de Encapsulamiento

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 38


El uso de final

• En general expresa que algo no puede cambiarse.


• Puede aplicarse a:
– Datos
– Métodos
– Clases
• No confundir con static
– Variables y métodos de clase. No hay necesidad de
instanciar la clase

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 39


final con datos
• Permite declarar constantes. Pueden ser inicializadas en tiempo
de ejecución o en tiempo de compilación.
• Cuando se aplica a objetos (clases no primitivas) lo que se hace
constante es la referencia, su contenido puede cambiarse.
public class FinalData {
// Constantes con valor en tiempo de compilación
final int i1 = 9;
static final int VAL_DOS = 99;
public static final int VAL_TRES = 39;
// Constantes con valor en tiempo de ejecución:
final int i4 = (int)(Math.random()*20);
static final int i5 = (int)(Math.random()*20);
………………………
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 40
final con métodos
• Existen dos razones para declarar métodos como final:
– “Bloquear” el método para evitar que su comportamiento sea modificado
por las subclases que lo hereden.
– Una aparente razón de perfomance, dado que el compilador cambiará
cada llamado al método por el código. Esto puede ser válido para
métodos pequeños
• Cualquier método declarado como private es implícitamente
final.
• Se debe tener especial precaución de no usar final en métodos
de clases de propósito general o en librerías

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 41


final con clases
– Definir una clase como final previene que sea
heredada.
– Implica que todos los métodos de la clase sean final.
– Dentro de una clase no final puede haber métodos
final.

final class Dinosaurio {... }

class Elefante extends Dinosaurio { ... }

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 42


Reusabilidad
• Reusar código: no crear nuevas clases usando
“cut&paste” sino usando clases ya definidas y
testeadas.
• Se proveen dos estrategias:
– Composición: crear clases compuestas de otras clases. Se
trata de reusar la funcionalidad de las clases que se incluyen
en la nueva clase, no la interfaz.

– Herencia: Se crea un nuevo tipo. Se toma la interfaz de una


clase ya conocida y se le adiciona algo.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 43


Composición (o agregación)
Reusar la implementacion
• Construir objetos basándose en otros ya existentes.
• En general, obedece a una relación “tiene un”.
• Brinda flexibilidad: permite cambiar la implementación del objeto
miembro sin tocar la clase que lo contiene.
• No sufren restricciones en tiempo de compilación (cosa que sí
sucede con herencia).
• Es más simple y flexible.

Auto Motor

(Ver ejemplo en Clase 1 – Referencias)


UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 44
Herencia: reusar la interfaz
• En general. obedece a una relación “es un” o “es como un”
• Si se cambia la clase base o padre, este cambio afecta a las
subclases.
• Cuando se modifica un método de la clase base en la derivada,
se puede invocar al de la clase base con super
• El especificador protected permite que un miembro
esté disponible para las demás clases del mismo Figura
package y además para las que hereden esa clase.
• Cualquier componente declarada como protected es
automáticamente “friendly”
Triángulo

(Ver ejemplo en Clase 1 – Referencias)


UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 45
Upcasting
• Es lo que permite trabajar con la clase derivada como si fuera
una clase base.
• Un objeto derivado de una clase puede utilizarse en cualquier
lugar en el que sea aceptado un objeto de la clase base
Animal
• Se puede referenciar con una variable de tipo Animal una instancia
de tipo Vaca
Animal unAnimal = new Vaca(); Vaca

• Se puede pasar como parámetro actual una Vaca cuando el


parámetro formal espera un Animal
Vaca unaVaca = new Vaca();
miGranja.vender(unaVaca);
//invocando a Granja.vender(Animal a)
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 46
Polimorfismo
Instrumento
void tocar ()
string queEs()
void ajustar()

extends extends extends

Viento Percusion Cuerdas


void tocar () void tocar () void tocar ()
string queEs() string queEs() string queEs()
void ajustar() void ajustar() void ajustar()

extends
extends

VientoMadera VientoMetal
void tocar () void tocar ()
string queEs() string queEs()
void ajustar() void ajustar()

(Ver ejemplo en Clase 1 – Referencias)


UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 47
Herencia: Cómo diferenciar la superclase de la
subclase (I) - Extensión
• Agregar métodos en la subclase: extender el comportamiento

Figura
draw( )
erase( )
move()
getcolor()
setColor() “es como un”

Circulo Rectángulo Triángulo

flipVertical( )
flipHorizontal( )

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 48


Herencia: Cómo diferenciar la superclase de la
subclase (II) – Herencia pura
• La subclase respeta la interfaz pero cambia el comportamiento:
overriding.
• La clase base puede recibir cualquier mensaje de la clase
derivada porque la interfaz es idéntica. Se maneja con
polimorfismo.
Figura
draw( )
erase( )
move()
getcolor()
setColor()
“es un”

Circulo Rectángulo Triángulo

draw() draw() draw()


erase() erase() erase()

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 49


Herencia pura vs Extensión
• Al hacer upcast, la clase base no puede utilizar la parte
extendida de la clase derivada, y si esa parte es la más
importante, entonces se está cometiendo un error de diseño.
• Una vez que se hace el upcast puede presentarse la situación de
necesitar “redescubrir” el tipo de la subclase:, mediante el
operador instanceof o mediante el método
getClass() combinado con la variable de clase class

public void unMetodo(ItemInventario i) {


. . .
if (i instanceof VideoReproductor)
((VideoReproductor)i).ejecutarCassette();
}

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 50


Clases abstractas. Métodos abstractos
• Al declarar una clase como abstract, se expresa solamente
una interfaz común para las subclases (ej: Figura) y no tiene
sentido crear objetos de esa clase.
• Una clase abstracta no puede instanciarse.
• También se puede declarar métodos abstractos, los que son
métodos incompletos, porque tienen definición pero no tienen
cuerpo: NO están implementados.

public abstract class Instrumento {


...
public abstract void tocar();
}

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 51


Clases y métodos abstractos
• Si una clase contiene métodos abstractos, entonces la clase
debe definirse como abstracta.
• Si una clase hereda de una clase abstracta y se desea crear
objetos de esa clase, entonces deben implementarse todos los
métodos declarados como abstractos en la superclase.
• Por el contrario, se puede crear una clase abstracta sin métodos
abstractos . Esto se hace cuando no tiene sentido crear métodos
abstractos y al mismo tiempo no se desean instancias de esa
clase.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 52


Interfaces
• Provee una clase abstracta en extremo: no provee ninguna implementación
de métodos.
• Permite implementar un concepto que no es natural en Java: herencia
múltiple.
• Ofrece un contrato, una “interfaz” API (abstracción pura)
– Conceptualmente: “esto es lo que todas las clases que implementen esta interface
deberán proveer”.
– Establecer la forma de una clase: nombre de métodos, tipos de parámetros y
retorno.
• Puede contener atributos, pero son implícitamente static y final.
• Desde JSE8 se permite “default methods”, una implementación en la interface
utilizada en aquellas clases que no provean una implementación para ese
método.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 53


Interfaces
• Para crear una interface, se usa la palabra clave interface
en lugar de class.
• Se puede declarar como public (si el nombre del archivo es
igual al de la interface), o se puede dejar como friendly.
• Los métodos son implícitamente abstractos y públicos. Cuando
se implementan deben declararse como públicos a fin de que
puedan heredarse
• Una interface puede extender de otra.

public interface DoItPlus extends DoIt { . . . }

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 54


Interfaces: definición e implementación
public interface Dirigible {
int MAXGIRO = 45;
void doblaIzq(int grados);
void doblaDer(int grados);
}

public class Yate extends Bote implements Dirigible {


public void doblaIzq(int grados) {…}
public void doblaDer(int grados) {…}
}

public class Auto extends Vehículo implements Dirigible {


public void doblaIzq(int grados) {…}
public void doblaDer(int grados) {…}
}
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 55
Interfaces: razones de uso
• Razón de fondo: hacer upcast a más de una clase superior.
• Definir lo que una clase exporta sin implementarlo.
• Declarar constantes globales en un package, atributos son
automáticamente static y final) (similar a enum en C)

• ¿Qué usar: interface o clase abstracta?


– Primero definir como interface. Si en la clase base requiere definir variables
de instancia o implementar métodos, entonces definirla como clase abstracta
o concreta.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 56


Herencia múltiple en Java
• A partir de que las interfaces no proveen implementación, es
posible combinarlas.
• Existen situaciones en las cuales se desea expresar que x es un
A y un B y un C
• Una clase puede implementar muchas interfaces , pero puede
extender solamente una clase.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 57


Herencia Múltiple: Ejemplo

Class Accion interface Comando interface Nadador interface Volador

combatir() combatir() nadar() volar()

extends implements implements implements

Class Heroe

nadar()
volar()

(Ver ejemplo en Clase 1 – Referencias)


UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 58
Interfaces
Un uso interesante
AdministradorDB.registrar toma como parámetro objetos de clases que implementen la interfaz Grabable

<<interface>>
IGrabable

Persona +grabar() Comprobante

Cliente Empleado FacturaVenta Recibo

+grabar() +grabar() +grabar() +grabar()

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 59


Clases anidadas
• Clase definida dentro de otra. Existen 2 categorías: estáticas y
no estáticas (inner classes).
– Pueden declararse con cualquier modificador de acceso.
– La inner class tiene acceso a todos los miembros de la clase externa, la
static no.
– La inner class no puede definir miembros estáticos.

public class EjOuterClass {


...
static class EjStaticNestedClass {
...
}
class EjInnerClass {
...
}
}
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 60
Clases anidadas: razones de uso
• Agrupar lógicamente clases utilizadas en un sólo lugar
– Mantenerla embebida y junta a la clase externa.
• Incrementar el encapsulamiento
– La clase interna puede ser ocultada al mundo exterior.
• Conducir a código mas legible y mantenible
– Facilitar el uso de las clases.
• Existen 2 tipos adicionales de inner class:
– Local: se declara dentro del cuerpo de un método.
– Anónima: clase interna local sin nombre. Muy utilizada por manejadores de eventos de GUI de Java.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 61


Anotaciones
• Las anotaciones son meta información, información sobre el
código (información). “Metaprogramación”
• Permiten asociar información, en forma de pares atributo-valor
(miembros), a los elementos de programación (paquetes, tipos,
métodos, campos, parámetros, etc).
• Las anotaciones no modifican la ejecución de un programa, por
lo que sólo tienen sentido para programas o herramientas que
las extraigan e interpreten (compilador, etc)
• Las anotaciones, por norma general, se colocan justo antes de
los modificadores de los elementos del lenguaje. Normalmente
en la línea anterior a la del elemento.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 62


JSE5-Anotaciones: uso
• Información para el compilador: usada para detectar errores o
suprimir advertencias.
• Proceso en tiempo de compilación o implementación: para
generar código, archivos XML, etc.
• Proceso en tiempo de ejecución: algunas están disponibles para
ser examinadas en runtime.
• Reemplazo de documentación: hecha con comentarios.
• Implementación de Frameworks: Hibernate, Spring, etc.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 63


JSE5-Anotaciones: ejemplos
• Override: avisa al compilador que el método al que acompaña
sobreescribe un método de la superclase.
– Así consigue evitar errores de programación peligrosos, como equivocarse
en el nombre del método a sobreescribir. Anotación marcador solo aplicable
a métodos.
@Override
public String toString() {....}

• Deprecated: avisa al compilador que un elemento es obsoleto, que


se desaconseja su uso.
– El compilador lanzará un warning, cuando se esté usando un elemento
obsoleto en código no obsoleto. Anotación marcador aplicable a cualquier
elemento.
@Deprecated
public enum FormatoAudio {..
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 64
JSE5-Anotaciones: ejemplos
• SuppressWarnings: indica al compilador qué tipo de warnings no
debe lanzar de las generadas en el elemento anotado.
– Se utiliza cuando el programador es consciente de que esta haciendo una
práctica desaconsejada pero por circunstancias es necesario.
– Algunos identificadores implementados son:all, deprecation, checked,
fallthrough, path, serial, finally.

@SuppressWarnings({"checked","finally"})
public enum FormatoAudio {..

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 65

También podría gustarte