Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Java: un lenguaje orientado a objetos, Apuntes de Informática

Asignatura: Laboratorio de Tecnologia de Objetos (LTO), Profesor: Francisco Duran, Carrera: I.T.I. Sistemas, Universidad: UMA

Tipo: Apuntes

Antes del 2010

Subido el 02/09/2008

klaw-2
klaw-2 🇪🇸

2 documentos

1 / 15

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Laboratorio de Tecnología de Objetos
Departamento de Lenguajes y Ciencias de
la Computación 1
Laboratorio de Tecnología de Objetos II-1
Java: Un Lenguaje Orientado a
Objetos
Introd. a la POO
9El 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-2
Introducción a Java
Desarrollado por Sun. Aparece en 1991
Basado en C++ (y algo en Smalltalk) eliminando
9definiciones de tipos de valores y macros,
9punteros y aritmética de punteros,
9necesidad de liberar memoria.
Orientado a objetos con:
9herencia simple y polimorfismo de datos,
9redefinición de métodos y vinculación dinámica.
Precompilado
9ficheros fuente .java se convierten en ficheros bytecode .class
Interpretado
9ficheros .class son interpretados por la máquina virtual de Java (JVM)
Laboratorio de Tecnología de Objetos II-3
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-4
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)
Laboratorio de Tecnología de Objetos II-5
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
Win32
Solaris
java
Laboratorio de Tecnología de Objetos II-6
Paquetes
Las bibliotecas se organizan en paquetes (package):
mecanismos lógicos para agrupar clases relacio nadas.
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.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡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

  • Asignación y copia

¾ 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.

  • Existen operadores

¾ 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() {{ ...... }} }