¡Descarga Java: un lenguaje orientado a objetos y más Apuntes en PDF de Informática solo en Docsity!
Laboratorio de Tecnología de Objetos II-
Java: Un Lenguaje Orientado a
Objetos
Introd. a la POO 9 El lenguaje Java Estruct. Biblioteca Excepciones Colecciones Entrada y salida GUIs
Índice
¾ Introducción histórica ¾ Programas y paquetes ¾ Clases y objetos ¾ Tipos y valores ¾ Estructuras de control ¾ Control de errores ¾ Arrays ¾ Herencia ¾ Clases abstractas ¾ Interfaces ¾ Clases genéricas
Laboratorio de Tecnología de Objetos II-
Introducción a Java
- Desarrollado por Sun. Aparece en 1991
- Basado en C++ (y algo en Smalltalk) eliminando 9 definiciones de tipos de valores y macros, 9 punteros y aritmética de punteros, 9 necesidad de liberar memoria.
- Orientado a objetos con: 9 herencia simple y polimorfismo de datos, 9 redefinición de métodos y vinculación dinámica.
- Precompilado 9 ficheros fuente .java se convierten en ficheros bytecode .class
- Interpretado 9 ficheros .class son interpretados por la máquina virtual de Java (JVM)
Laboratorio de Tecnología de Objetos II-
Programa en Java
- Conjunto de clases diseñadas para colaborar en una
tarea, con una clase (pública) distinguida que contiene
un método de clase:
public static void main(String[] args)
que desencadena la ejecución del programa.
- Las demás clases pueden estar definidas ad hoc o
pertenecer a una biblioteca de clases.
Laboratorio de Tecnología de Objetos II-
Ficheros en Java
- Cada clase declarada como pública debe de estar en un fichero .java con su mismo nombre.
- Cada fichero .java puede contener varias clases pero sólo una podrá ser pública.
- Cada fichero .java debe precompilarse generando un fichero .class (en bytecodes ) por cada clase contenida en él.
- El programa se ejecuta pasando el fichero .class de la clase distinguida al intérprete (máquina virtual de Java)
Ejecución de un programa
public class HolaMundo { public static void main(String[] args) { System.out.println("Hola Mundo"); } } HolaMundo.java
HolaMundo.class
Bytecodes
javac
MacOS
Win
Solaris
java
Paquetes
- Las bibliotecas se organizan en paquetes (package): mecanismos lógicos para agrupar clases relacionadas.
- Todas las clases de un paquete deben estar localizadas en un mismo subdirectorio.
- Los paquetes del sistema cuelgan de varios subdirectorios específicos: .../java .../javax
- La variable CLASSPATH contiene una lista con todos caminos de búsqueda de los demás paquetes.
Laboratorio de Tecnología de Objetos II-
Estructura de las bibliotecas
en Java
Frontera del CLASSPATH
Paquetes
Paquetes del sistema
java
java .lang
java .util
java .io
Laboratorio de Tecnología de Objetos II-
Paquetes básicos 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 diseño gráfico e interaz de usuario ¾ java.awt.event: para gestionar eventos ¾ javax.swing: nuevo diseño de GUI ¾ java.net: para comunicaciones ¾ ...
Laboratorio de Tecnología de Objetos II-
Acceso a las bibliotecas de Java
- El nombre de cada paquete debe coincidir con el camino que va desde algún directorio del CLASSPATH (o desde /java o /javax) al subdirectorio correspondiente al paquete.
- A las clases incluidas en java.lang se puede acceder simplemente por sus nombres, p.e.: System o Math.
- Las clases de un paquete (salvo las de java.lang) sólo se pueden acceder por sus nombres desde otra clase dentro del mismo paquete; para acceder a ellas desde otro paquete hay que hacerlo precediéndolas con el nombre del paquete.
Laboratorio de Tecnología de Objetos II-
Ejemplo
- Programa para calcular el valor medio de un millón de números generados aleatoriamente, usando las clases Random del paquete java.util y 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); } }
Clases en Java
class Punto { private float x, y; public Punto() { x = y = 0; } public Punto(float a, float b) { x = a; y = b; } public float x() { return x; } public float y() { return y; } public void trasladar(float a, float b) { x += a; y += b; } public void x(float a) { x = a; } public void y(float b) { y = b; } public float distancia(Punto pto) { return (float)Math.sqrt(Math.pow(x - pto.x, 2)
- Math.pow(y - pto.y, 2)); } }
Estructura de una clase en Java
class Partícula extends Punto { final static double G = …; protected float masa; public Partícula(float m) { super(0, 0); masa = m; } public Partícula(float a, float b, float m) { super(a, b); masa = m; } public void masa(float m) { masa = m; } public float masa() { return masa; } public float atracción(Partícula part) { return (float)(G * masa * part.masa / Math.pow(distancia(part), 2)); } }
Cabecera Cte. de clase Var. de instancia Constructor
Método de instancia
Laboratorio de Tecnología de Objetos II-
Creación de objetos
- Para poder utilizar un objeto en un programa hay que crearlo a partir del texto de una clase con un estado inicial.
- La creación de un objeto supone hacer una reserva de espacio para el objeto y asignar unos valores iniciales a sus variables de estado, tiene la forma: new ()
- El operador new devuelve una referencia al objeto que crea. Esta referencia se puede asignar a una variable de objeto o se puede utilizar directamente en alguna expresión que requiera de un objeto de la clase correspondiente: pto = new Punto(3, 4); pto.distancia(new Punto());
Laboratorio de Tecnología de Objetos II-
Constructores de objetos
- Operaciones definidas en las clases con el mismo
nombre de la clase que no devuelven valor. Su misión
es habilitar espacio para un objeto de la clase y
posiblemente establecer valores iniciales para algunas
variables de estado.
- Una clase puede definir varios constructores (con
distinto número de argumentos o con argumentos de
distintos tipos) o ninguno (en cuyo caso se aplica uno
por defecto sin argumentos).
Laboratorio de Tecnología de Objetos II-
Variables de objeto
- Para poder utilizar una variable que albergue una
referencia a un objeto:
¾ Hay que fijar la clase de los objetos a los que puede referirse <n. clase> <n. objeto> Punto pto; ¾ Tras esta operación la variable no tiene valor conocido , y no referencia aún a ningún objeto. No puede recibir mensajes. ¾ Hay que asignarle un objeto <n. objeto> = new () pto = new Punto(3, 4); ¾ Estos dos pasos se pueden realizar simultáneamente: <n. clase> <n. objeto> = new () Punto pto = new Punto(3, 4); ¾ El objeto asignado a la variable puede ser el resultado de algún método.
Laboratorio de Tecnología de Objetos II-
Uso de objetos
- Manipulación o inspección de las variables de estado: ¾ A las variables de estado de un objeto se accede de la forma: .<n.variable> ¾ Para acceder desde fuera del objeto, la variable debe ser visible y puede ser una variable o expresión que devuelva una referencia al objeto. ¾ Para acceder desde un método del propio objeto, es this, y si no hay conflicto de nombres, puede suprimirse. ¾ Generalmente se supone que un objeto debe proteger su estado. El acceso directo a las variables de estado de un objeto por parte de otro no es aconsejable.
Uso de objetos
• Invocación de los métodos
¾Los métodos de un objeto, cuando son visibles, se
invocan mediante mensajes construidos de la forma
siguiente:
.<método>() pto.trasladar(2, 2);
¾El código concreto del método invocado en un
mensaje dependerá del tipo dinámico del objeto
receptor.
Uso de objetos
¾ Una variable que referencia a un objeto se puede asignar a otra de su misma clase (o de una clase ascendiente). En tal caso se copia la referencia y ambas compartirán el mismo objeto.
¾ Para duplicar un objeto se debe crear otro de la misma clase y copiar sus variables de estado, si son accesibles. ¾ También se puede incluir un método de copia en la clase correspondiente.
¾ O utilizar el método clone() de la clase Object de java.lang.
Laboratorio de Tecnología de Objetos II-
Uso de objetos (asignación)
class Segmento { private Punto origen, extremo; public Segmento(Punto pto1, Punto pto2) { origen = pto1; extremo = pto2; } ... // Otros métodos public float longitud() { return origen.distancia(extremo); } }
Laboratorio de Tecnología de Objetos II-
Uso de objetos (duplicación)
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 métodos public float longitud() { return origen.distancia(extremo); } }
Laboratorio de Tecnología de Objetos II-
Eliminación de objetos
- La eliminación de objetos en Java se realiza de forma
automática cuando se pierden las referencias a dichos
objetos.
- Se puede forzar la eliminación de un objeto anulando
su referencia: <n. objeto> = null
(en el supuesto de que no exista otra referencia).
- Se puede activar la eliminación automática
¾ invocando el método de clase gc() de la clase System.
Laboratorio de Tecnología de Objetos II-
Tipos y valores
- En Java también se utilizan valores.
- Los valores se clasifican en tipos.
- Sólo se pueden utilizar valores de los siguientes tipos: byte (entero de 8 bits) short(entero de 16 bits) int (entero de 32 bits) long(entero de 64 bits) float (decimal de 32 bits) double (decimal de 64 bits) char (Unicode de 16 bits) boolean(true , false)
- Estas representaciones son independientes de las
plataformas sobre las que se ejecuten los programas.
- No se pueden definir tipos.
Tipos y valores
- Los valores, al igual que los objetos, se pueden
manipular mediante variables.
- Los valores también 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
Conversiones de tipos y clases
- En Java se producen conversiones de tipo o de clase de
forma implícita en ciertos contextos.
Estas conversiones se producen siempre a tipos más
amplios siguiendo la ordenación:
byte -> short -> int -> long -> float -> double char ->
o a clases ascendentes en la línea de la herencia.
- También se permiten conversiones explícitas en
sentido contrario mediante la construcción:
(<tipo/clase>) <expresión>
Sólo se comprueban durante la ejecución.
Laboratorio de Tecnología de Objetos II-
Inicialización de variables
- Cuando no se les asigna un valor explícitamente ¾ Las variables de clase se inicializan automáticamente al cargar la clase. ¾ Las variables de instancia se inicializan automáticamente cada vez que se crea una instancia. ¾ Las variables locales no se inicializan de forma automática y el compilador produce un error.
- Valores de inicialización automática: false ‘\u0000’ 0 +0.0F +0.0D null
Laboratorio de Tecnología de Objetos II-
Expresiones
- Una expresión es una combinación de literales,
variables, operadores y mensajes, acorde con la
sintaxis del lenguaje, que se evalúa a un valor
simple o a una referencia a un objeto y devuelve el
resultado obtenido.
Laboratorio de Tecnología de Objetos II-
Operadores (I)
- Un operador es una función de uno, dos o tres
argumentos.
¾ aritméticos (+, -, ++, --, ++, --) (+, -, *, /, %) ¾ de relación/comparación ( >, >=, <, <=, ==, != ) ¾ lógicos ( &&, ||, !, &, |, ^ ) ¾ de asignación (=, +=, -=, *=, /=, %=, &=, |=, ^=) ¾ para la manipulación de bits ¾ Otros operadores ( ?:_ )
Laboratorio de Tecnología de Objetos II-
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.
- El orden de evaluación de las expresiones compuestas
depende de la precedencia y de la asociatividad de los
operadores que aparezcan
Precedencia de operadores
- Precedencia (en sentido decreciente) var++ var-- & ++var --var! | new (tipo)exp &&
- = += -= *= ... < > <= >= == !=
- El orden de las operaciones en una expresión siempre se puede modificar mediante el uso de paréntesis
Asociatividad de operadores
- Asociatividad ¾ Todos los operadores binarios (excepto la asignación) a igualdad de precedencia, asocian por la izquierda. ¾ La asignación asocia por la derecha
- Ejemplos de expresiones: 3 + 4 / 2 3 * (x = 5) x = y = 3 x = ++y / 2 x > 3 && y x = y++ / 2
Laboratorio de Tecnología de Objetos II-
Instrucciones/sentencias
• Existen tres clases de instrucciones o sentencias:
¾Sentencias de expresión – Se obtienen terminando
en ‘ ; ’ alguna de las expresiones siguientes:
9 asignaciones 9 incrementos/decrementos ++/-- 9 mensajes 9 creaciones de objeto
¾Sentencias de declaración de variables
¾Sentencias de control
Laboratorio de Tecnología de Objetos II-
Sentencias de declaración
- Las sentencias de declaración de variables tienen la
forma: <n. variable>
int x;
- Las declaraciones de variables del mismo tipo/clase
pueden agruparse:
int x, y, z;
- Las sentencias de declaración pueden agruparse con
las de asignación a las mismas variables:
int x = 5, y = 12, z = 213;
Laboratorio de Tecnología de Objetos II-
Sentencias de control
Las sentencias de control del flujo de ejecución se
agrupan en:
- sentencias de repetición
- sentencias de selección
- sentencias para el control de excepciones
- sentencias de salto/ramificación
Laboratorio de Tecnología de Objetos II-
Sentencias de repetición
while (<exp. booleana>)
do
while (<exp. booleana>);
for (; <exp. bool>; )
Sentencias de repetición
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.
Sentencias de selección (I)
if (<exp. bool>)
if (<exp. bool>) else
if (<exp. bool1>) else if (<exp. bool2>) ... else
? :
Ejemplo: System.out.println(“El carácter ” + car + “ es ” + (Character.isUpperCase(car)? “mayúscula” : “minúscula”));
Laboratorio de Tecnología de Objetos II-
Arrays en Java (I)
- Objetos que representan estructuras de datos de longitud fija con componentes de un mismo tipo o clase.
- Con una sintaxis particular: ¾ Declaración int [] listaEnteros; Punto [] listaPuntos; ¾ Inicialización listaEnteros = new int[10]; listaPuntos = new Punto[23]; char[] vocales = {’a’, ’e’, ’i’, ’o’, ’u’}; Punto p = new Punto(1, 1); Punto[] ap = {new Punto(2, 2), p, null};
- La longitud se guarda en una variable de instancia length que sólo se puede consultar.
componentes (^) array (^) nombre
componentes
tamaño
array literal
Laboratorio de Tecnología de Objetos II-
- Los arrays siempre comienzan por la posición 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()); }
Arrays en Java (II)
Laboratorio de Tecnología de Objetos II-
Array de arrays (I)
- Las componentes de un array pueden ser arrays.
- Al crear un array multidimensional con el operador
new solo hace falta fijar el tamaño de la primera
dimensión.
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; } }
Laboratorio de Tecnología de Objetos II-
Array de arrays (II)
String[][] familias = { {“Picapiedra”,“Pedro”,“Wilma”,“Pebbles”,“Dino”}, {“Mármol”,“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(); }
Copia de arrays (I)
• Para la copia eficiente de componentes de un
array a otro Java tiene el método arraycopy
en la clase System.
public static void arraycopy(Object arrayOrigen, int primÍndiceOrigen, Object arrayDestino, int primÍndiceDestino, int númeroDeCompCopia)
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));
Laboratorio de Tecnología de Objetos II-
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); }
Laboratorio de Tecnología de Objetos II-
Datos enumerados. enum
enum Semana {Lun,Mar,Mie,Jue,Vie,Sab,Dom};
class Ej { public static void main(String [] args) { Semana s = Semana.Lun; Semana t = Semana.valueOf(“Mie”);
for(Semana se : Semana.values()) { System.out.print(se + “ “); } } }
Lun Mar Mie Jue Vie Sab Dom
Laboratorio de Tecnología de Objetos II-
Clases anidadas
- Se definen en el cuerpo de otra clase. Pueden ser ¾ Internas 9 Definidas como cualquier atributo de una clase. Admiten cualquier modificador (public, etc.). ¾ Locales 9 Definidas dentro de un bloque. No admiten modificador ¾ Anónimas 9 Definidas como una expresión No admiten modificador
- Cualquier de ellas se puede declarar como: ¾ static: No necesitan de una instancia de la clase exterior. Pueden usar cualquier variable static de la clase exterior. ¾ No static: Necesitan de una instancia de la clase exterior. Pueden usar cualquier atributo de la clase exterior.
- Las locales y anónimas pueden usar también variables locales declaradas como final.
Laboratorio de Tecnología de Objetos II-
Clases internas estáticas
- Se construyen como un atributo más de la clase. ¾ Para acceder a ellas debe cualificarse con el nombre de la clase externa (si es visible). public class Urna { static public enum ColorBola {Blanca, Negra}; private int numBlancas, numNegras; public (^) numBlancasUrna(int nB, = nB;int nN { } numNegras^ =^ nN; publicColorBola ColorBola bolaSacada sacaBola(){ = null; if (...)bolaSacada { = Blanca; } elsenumBlancas--; { bolaSacadanumNegras--; = Negra; }return bolaSacada; }... }
... Urna.ColorBola cb = Urna.ColorBola.Negra; ...
Clases anónimas
- Se construyen extendiendo a una clase. ¾ Clase new () {} 9 Si se indican argumentos se les pasa al constructor de la clase padre. 9 Los objetos de esta clase tienen visibilidad sobre los atributos del objeto en el que viven y las variables locales definidas como final
public class MiVentana extends JFrame { ... publicaddWindowListener( MiVentana() { new WindowAdapter() { public void// windowClosing(WindowEvent acceso a las variables de e) { ventana } System.exit(0); ... }^ ); }... }
Subclases/Herencia
- En Java se pueden definir subclases o clases que
heredan estado y comportamiento de otra clase (la
superclase ) a la que amplían, en la forma:
class miClase extends superclase { ... }
- En Java sólo se permite herencia simple , por lo que
pueden establecerse jerarquías de clases.
- Todas las jerarquías confluyen en la clase Object
de java.lang que recoge los comportamientos
básicos que debe presentar cualquier clase.
Laboratorio de Tecnología de Objetos II-
class A { char a; public A(char x) { a = x; } public String f() { return g() + a; } public String g() { return "clase A: "; } }
class B extends A{ String a; public B(String y) { super('a'); a = y; } public String g() { return "clase B: "; } }
class Prueba { public static void main(String[] args) { A obj1; B obj2 = new B("contenido de B"); obj1 = obj2; System.out.println(obj1.f()); } }
SALIDA: clase B: a
Se debe invocar explícitamente un constructor de A para que no se produzca una invocación implícita al constructor A() que no existe.
Laboratorio de Tecnología de Objetos II-
Prohibiendo subclases
- Por razones de seguridad (una subclase puede sustituir a su superclase donde ésta sea necesaria y tener comportamientos muy distintos) o de diseño, se puede prohibir la definición de subclases para una clase etiquetándola con final.
- El compilador rechazará cualquier intento de definir una subclase para una clase etiquetada con final.
- También se pueden etiquetar con final: ¾ métodos, para evitar su redefinición en alguna posible subclase, y ¾ variables, para mantener constantes sus valores o referencias.
Laboratorio de Tecnología de Objetos II-
Promoviendo subclases:
Clases abstractas
- En Java se puede definir una clase como resultado de una abstracción sobre otras clases recogiendo un estado y un comportamiento básicos, aunque no tenga sentido modelar objetos propios de la abstracción.
- Estas clases se etiquetan como abstract y pueden tener métodos sin definición, también etiquetados como abstract.
- Con estas clases se pueden formar jerarquías.
- Estas clases se pueden utilizar como tipos, pero no se pueden crear instancias suyas.
- Deben tener subclases que no sean abstractas para generar objetos.
Laboratorio de Tecnología de Objetos II-
= new Figura();
abstract class Figura { protected Punto vértices[]; public void trasladar(float a, float b){ for (int i = 0; i < vértices.length; i++){ vértices[i].trasladar(a, b); } } abstract public float área(); };
Figura fig
Java
abstractprotected class static PilaEnts int {contador = 0; public static int contador() { ... } abstract public void insertar(int item); abstractabstract public voidpublic void extraer();destruir(); abstractabstract public intpublic boolean cima(); vacía(); } public class PilaEntsEstática extends PilaEnts { privateprivate int[]int tope; array; public PilaEntsEstática(int n){...} public void insertar(int d) { ... } public voidpublic void extraer()destruir() { ...{ ... }} public booleanpublic boolean vacía()llena() { ...{ ... }} public intpublic String cima() toString() { ...{ ... }} }
public class PilaEntsDinámica extends PilaEnts { static protectedint dato; class Nodo { Nodo// ... sig; } private int tamañoActual; private Nodo primero; public PilaEntsDinámica()public void insertar(int d) { ...{ ... }} public voidpublic void extraer()destruir() { ...{ ... }} public booleanpublic int cima() vacía() { ...{ ... }} }public String^ toString()^ { ...^ } PilaEnts p = new PilaEntsEstática(10);
Interfaces
- Una interfaz define un protocolo de comportamiento
que debe ser implementado por cualquier clase que
pretenda utilizar ciertos servicios, con independencia
de las relaciones jerárquicas.
- Una interfaz sólo puede ser extendida por otra interfaz.
- Una clase puede implementar varias interfaces.
Laboratorio de Tecnología de Objetos II-
Definición de interfaces
- En una interfaz sólo se permiten constantes y métodos
abstractos.
public interface miInterfaz extends interfaz1 , interfaz2 { String CAD1 = “SUN”; String CAD2 = “PC”; void valorCambiado(String producto, int val); ... }
public static final
public abstract
package , en caso de omisión
Laboratorio de Tecnología de Objetos II-
Implementación de interfaces
- Cuando una clase implementa una interfaz, ¾ se adhiere al protocolo definido en la interfaz y en sus superinterfaces, ¾ hereda todas las constantes definidas en la jerarquía, ¾ debe implementar todos los métodos, salvo que sea una clase que se quiera mantener abstracta (en cuyo caso, los métodos no implementados aparecerán como abstract).
public class miClase extends superclase implements interfaz1 , interfaz2 { ... }
Laboratorio de Tecnología de Objetos II-
public interface PilaEnts { void insertar(int item); void extraer(); void destruir(); int cima(); boolean vacía(); };
public classimplements PilaEntsEstática PilaEnts { private static int contador = 0; public static int contador() {... } privateprivate int[]int tope; array;
public PilaEntsEstática(intpublic void insertar(int d) n){...{ ... }} public voidpublic void extraer()destruir() {{ ...... }} public booleanpublic boolean vacía()llena() {{ ...... }} public intpublic String cima() toString() {{ ...... }} }
public classimplements PilaEntsDinámica PilaEnts { static protected class Nodo { intNodo dato; sig; }//^ ... private static int contador = 0; public static int contador() {... } privateprivate intNodo tamañoActual; primero; public PilaEntsDinámica() { ... } public voidpublic void insertar(int d)extraer() {{ ...... }} public voidpublic boolean destruir() vacía() {{ ...... }} public intpublic String cima() toString() {{ ...... }} } Laboratorio de Tecnología de Objetos II-
Uso de interfaces
- Una interfaz se puede usar como cualquier tipo referencia.
- Sólo se pueden usar instancias de clases que implementen la interfaz donde se requieran objetos del tipo definido por la interfaz. PilaEnts p = new PilaEntsEstática(10);
- Una clase anónima también puede extender a una interfaz new () {} ¾ Los objetos de esta clase tienen visibilidad sobre los atributos del objeto en el que viven y las variables locales definidas como final. public class MiVentana extends JFrame { JButton boton; ... public MiVentata() { boton.addActionListener( new ActionListener() { actionPerformed(ActionEvent e) { // acceso a las variables de ventana ... } }); ... } ... }
Clases genéricas
- Las clases genéricas permiten en una única definición expresar comportamientos comunes para objetos pertenecientes a distintas clases. El ejemplo más habitual de clase genérica son las clases contenedoras: listas, pilas, árboles, etc.
- Desde la versión JDK1.5.0, Java dispone de mecanismos para definir e instanciar clases genéricas mediante el uso de parámetros. ¾ Una clase o interfaz puede incorporar parámetros en su definición, que siempre representan clases o interfaces. ¾ A la hora de instanciar la clase genérica, se especifica el valor concreto de los parámetros. Éste debe ser una clase o interfaz, nunca un tipo básico. ¾ Una clase genérica puede instanciarse tantas veces como sea necesario, y los valores reales utilizados pueden variar. ¾ En la definición pueden especificarse restricciones sobre los parámetros formales, que deberán ser satisfechos por los parámetros reales en la instanciación.
public interface Pila { void insertar(T item); void extraer(); void destruir(); T cima(); boolean vacía(); };
Pila p = new PilaEstática(10); Pila q = new PilaEstática(30); Pila<Pila> r = new PilaDinámica<Pila>();
public classimplements PilaEstática Pila { private List array; private int tope; public PilaEstática(intpublic void insertar(T d)n) {{ ...... }} public void extraer() { ... } public voidpublic boolean destruir() vacía() {{ ...... }} public booleanpublic T cima() llena() {{ ...... }} }public String^ toString()^ {^ ...^ }
public classimplements PilaDinámica Pila { static protected class Nodo { T dato;Nodo sig; }//^ ... private Nodo primero; public PilaDinámica() { ... } public voidpublic void insertar(Textraer() d) {{ ...... }} public voidpublic boolean destruir() vacía() {{ ...... }} public Tpublic String cima() toString() {{ ...... }} }