Anda di halaman 1dari 7

Prctica 4: Herencia

Objetivos:

Como se implementa la herencia en Java (superclase - clase descendiente). Utilizar super. Redefinicin de mtodos Clase Object Clase System Clases abstractas

1. Herencia. Cuando una clase hereda de otra, la primera (descendiente) automticamente hereda las caractersticas (variables miembro) y el comportamiento (mtodos) de la segunda (superclase). Debe tenerse presente que la herencia es siempre aditiva, es decir, una clase no puede heredar de otra y obtener menos de lo que esta ltima (la superclase) tiene. En Java, la herencia se gestiona mediante la palabra clave extends. Cuando una clase hereda de otra, se considera que la clase descendiente se deriva de la superclase. Ejemplo:
public class Mamifero{ String nombre, colorOjos; private int edad; public Mamifero(String n, String c, int e) { nombre = n; colorDeOjos = c; edad = e; } }

Obsrvese que Mamifero presenta las caractersticas comunes de los mamferos.


public class Perro extends Mamifero{ String raza; public Perro(String n, String c, int e, String r) { // super(n,c,e) nombre = n; colorOjos = c; edad = e; raza=r; } } public class Hombre extends Mamifero{ boolean casado; public Hombre(String n, String c, int e, boolean c) { // super(n,c,e) nombre = n;

Pgina 1 de 7

colorOjos = c; edad = e; casado = c; } }

Una vez que Perro se deriva de Mamifero, dispone de las variables miembro y los mtodos de esta ltima. De hecho, incluso Mamifero se obtiene por herencia de otra clase. Todas las clases de Java se derivan, en ltimo trmino, de la clase Object; por tanto, si se declara una clase que no es una derivacin de otra, implcitamente se deriva de la clase Object. 2. Utilizacin de super Hay ocasiones en las que se desea crear una superclase que mantenga los detalles de su implementacin para s, es decir, que mantenga privados sus datos miembros. En ese caso no habra manera de que una subclase pudiese acceder directamente o inicializar estas variables en su declaracin. Java proporciona una solucin a este problema. Cuando una subclase necesita referirse a su superclase inmediata, lo puede hacer utilizando la palabra super. Super se puede utilizar de dos formas: La primera para llamar al constructor de la superclase. La segunda para acceder a un miembro de la superclase que ha sido ocultado por un miembro de la subclase. Dado que, a menudo, interesar llamar explcitamente al constructor de la superclase, Java cuenta con una palabra clave que facilita esa operacin. super (lista de parmetros)llama al constructor de la superclase al que se le hayan proporcionado los parmetros adecuados. Si se utiliza super, tiene que ser la primera sentencia ejecutada dentro del constructor de la subclase. Ejemplo:
class A{ int i; A(int a){ i=a; } } class B extends A{ int j; B(int a, int b){ super(a); j=b; } }

La segunda forma de utilizar super es segn el formato siguiente:


super.miembro

Esta segunda forma de super se utiliza cuando los nombres de miembro de la subclase ocultan los miembros que tienen el mismo nombre en la superclase. Ejemplo:
class A{ int i; } class B extends A{ int i; // esta i oculta la i de A

Pgina 2 de 7

B(int a, int b){ super.i=a; //i de A i=b; // i de B } }

3. Redefinicin de mtodos En una jerarqua de clases, cuando un mtodo de una subclase tiene el mismo nombre y tipo que un mtodo de su superclase, entonces se dice que el mtodo de la subclase redefine o sobrescribe al mtodo de la superclase. Cuando se llama a un mtodo redefinido dentro de una subclase, siempre se refiere a la versin del mtodo definida por la subclase. La versin del mtodo definida por la superclase est oculta. 4. Clase Object Object es la superclase de las restantes clases de Java. Esto significa simplemente que todas las clases de Java se derivan de Object. Esta clase contiene varios mtodos importantes; entre ellos, clone, equals y toString. Cuando un objeto emplea el mtodo clone, simplemente obtiene una copia de s mismo. Para conseguirlo, se asigna memoria para la copia clnica y posteriormente se copia el contenido del objeto original al objeto clonado. Por ejemplo, supongamos que se desea obtener una copia de la clase Document que contenga las propiedades text (texto) y author(autor). Para crear una instancia de la clase Document que contenga ambas propiedades y los valores asociados al objeto, es necesario emplear el mtodo clone. El cdigo siguiente muestra cmo se llevara a cabo esta operacin.
Document document1 = new Document ("docText.txt", "Juan Garca") Document document2 = document1.clone();

El mtodo equals compara las propiedades de dos objetos del mismo tipo para determinar si los objetos son iguales. El valor booleano devuelto depende del objeto que ha llamado al mtodo y del objeto que se le ha pasado como parmetro. Por ejemplo, si un objeto llama a equals y le pasa como parmetro un objeto completamente idntico a l, equals devuelve true (verdadero). El mtodo toString devuelve una cadena que representa el valor del objeto. Para que este mtodo devuelva informacin correcta sobre los distintos tipos de objetos, debe redefinirse en la clase de cada objeto. Ejemplo. Partiendo de la clase Punto (Practica 3), definir una nueva clase Pxel, como un punto al que se le ha aadido color. La clase tiene:

Un constructor que recibe como parmetro los valores iniciales de las coordenadas x e y del punto y su color. Un mtodo que devuelve el color de un pxel Redefine el mtodo toString.

Pgina 3 de 7

public class Pixel extends Punto{ private String color; public Pixel(double xInicial, double yInicial, String colorInicial){ super(xInicial, yInicial); color=colorInicial; } public String getColor(){ return color; } public String toString(){ String s=super.toString(); return s+" "+"color="+color; } }

5. Clase System La clase System permite acceder a los recursos del sistema independientes de la plataforma. Se declara como final, por lo que no es posible obtener subclases de ella. Tambin declara sus mtodos y variables como static (esttico). De esta forma se consigue que est disponible sin instanciarla. Los mtodos de la clase System admiten varias aplicaciones. Una caracterstica importante es la posibilidad de obtener la hora actual del sistema mediante el mtodo currentTimeMillis. Tambin pueden recuperarse y modificarse recursos del sistema mediante los mtodos Get y Set Properties. El aspecto ms til de la clase System son las variables que declara. Estas variables se emplean para interactuar con el sistema. Entre ellas, se encuentran in, out, err. La variable in representa el flujo de entrada estndar del sistema, mientras que out representa el flujo de salida estndar. err es el flujo de errores estndar. Los flujos se tratan en la siguiente seccin dedicada al paquete de E/S. 5.1 Paquete I/O (E/S) El paquete java.io permite leer y escribir datos en distintos dispositivos. Las clases contenidas en l pueden dividirse en : clases InputStream (flujo de entrada), clases OutputStream (flujo de salida), clases File (archivo) y clase StreamTokenizer. En esta asignatura tan solo se hace referencia a los flujos de entrada y salida. 5.2 Clases InputStream (flujo de entrada) Los flujos de entrada se emplean para leer datos de fuentes de entrada (por ejemplo, un archivo, una cadena, la memoria, etctera). Esta definicin comprende varias clases; entre ellas: InputStream, BufferedInputStream, DataInputStream, FileInputStream y StringBufferInputStream. El mtodo bsico para leer datos mediante una clase de flujo de entrada es siempre el mismo: (1) crear una instancia de una clase de flujo de entrada y, seguidamente, (2) indicarle dnde debe leer los datos. Estas clases leen flujos continuos de bytes. Si en un momento determinado no existen datos disponibles, la clase de flujo de entrada se bloquea (espera hasta que existan datos disponibles). Adems de las clases InputStream, el paquete I/O incluye las correspondientes clases Reader (lectoras) para todas ellas (excepto para DataInputStream). Son las siguientes: Reader, BufferedReader, FileReader y StringReader. Las clases lectoras son idnticas a las de flujo de entrada, con la diferencia de que leen caracteres Unicode en lugar de bytes.

Pgina 4 de 7

InputStream es una clase abstracta de la cual se derivan las restantes clases de flujo de entrada. Proporciona la interfaz bsica para la lectura de flujos de bytes. En la siguiente tabla figuran algunos de los mtodos de InputStream y los parmetros que aceptan. Todos estos mtodos devuelven valores de tipo int, con la excepcin de close. Mtodo Acepta read () read (byte b[]) read (byte b[], int off, int len) available () skip (long) close () El primer mtodo, abstract int read, lee un byte del flujo de entrada y lo devuelve como entero (puede convertirse el tipo devuelto a char). Cuando se llega al final del flujo, devuelve -1. El segundo mtodo, int read(byte b[]), lee varios bytes y los almacena en la matriz que emplea como parmetro. Devuelve el nmero de bytes ledos o -1 cuando se llega al final del flujo. El ltimo mtodo read (lectura), int read(byte b[], int off, int len), permite a los desarrolladores establecer el nmero mximo de bytes que deben leerse y dirigirlos al lugar de la matriz donde deben almacenarse. El mtodo int available devuelve el nmero de bytes de entrada que pueden leerse sin que se produzca un bloqueo. El mtodo skip excluye del flujo el nmero de bytes que se especifique. Por ltimo, el mtodo close se emplea para crear el flujo de entrada. Normalmente, este mtodo se llama automticamente, si bien resulta ms seguro hacerlo de forma manual. En la siguiente tabla figuran algunos de los mtodos de InputStreamReader y los parmetros que aceptan.
void close() void mark(int readAheadLimit) boolean markSupported() int read() int read(char[] cbuf, int off, int len) String readLine() boolean ready() void reset() long skip(long n)

En el siguiente ejemplo se muestra cmo solicitar un dato por teclado. public class Entrada{ /* Se crea una instancia de la clase de flujo de entrada (BufferReader), la instancia se denomina leer. Y se indica donde se deben leer los datos, en este caso representa la entrada estndar (System.in) */

Pgina 5 de 7

static BufferedReader leer = new BufferedReader (new InputStreamReader(System.in)); public static String pideCadena (String mensaje) { // Se visualiza el contenido de la cadena mensaje en pantalla System.out.print (mensaje); // El mtodo readLine de la clase InputStreamReader, lee cadenas. Return leer.readLine(); } }

System.out es un miembro esttico de System y representa al dispositivo de salida estndar. Con objeto de enviar la salida al dispositivo estndar, se ha llamado al mtodo print. El objeto System.out es del tipo PrintStream, que se examina en el apartado dedicado a las clases de flujo de salida. 5.3 Clases OutputStream (flujo de salida) Las clases de flujo de salida son complementarias de las clases de flujo de entrada. Sirven para dirigir flujos de datos a los distintos dispositivos de salida. Las principales clases de este tipo que existen en Java son: OutputStream, PrintStream, BufferedOutputStream, DataOutputStream y FileOutputStream. Para dirigir un flujo de datos a un dispositivo de salida, se crea un flujo de salida y se dirigen los datos a una fuente de salida concreta. Como cabra esperar, tambin existen clases writer (escritoras). Existe una clase escritora correspondiente para todas las clases de flujo de salida, con excepcin de DataOutputStream. Dado que la clase OutputStream es la complementaria de InputStream, define los siguientes mtodos. Mtodo write write write flush close Acepta (int) (byte b[]) (byte b[], int off, int len) () ()

El mtodo flush sirve para vaciar el flujo de salida (es decir, para que los datos almacenados en bferes se dirijan al dispositivo de salida). La clase PrintStream est diseada fundamentalmente para dirigir los datos como texto al dispositivo de salida. Dispone de dos constructores: PrintStream(OutputStream) y PrintStream(OutputStream, boolean autoflush). Existe una diferencia entre ellos. Con el primero, el objeto PrintStream vaca los datos en bfer cuando se cumplen las condiciones especificadas; con el segundo, los datos se vacan cuando se encuentra un carcter de salto de lnea (if autoflush es true). Estos son algunos de los mtodos definidos por PrintStream. Mtodo checkError Acepta ()

Pgina 6 de 7

print (Object obj) print (Strings) println () println (Object obj) Los mtodos print y println se sobrecargan para distintos tipos de datos. El mtodo checkerror vaca el flujo y devuelve false si se detecta un error.

6. Clases Abstractas Es posible declarar abstracto un mtodo de una clase, lo que significa que el mtodo carece de implementacin en esa clase; no obstante, las clases derivadas de sta han de disponer de implementacin. Cuando una clase contiene un mtodo abstracto, ella tambin ha de declararse abstracta. Se deduce de esto que una clase que contenga uno o varios mtodos abstractos (y que, por tanto, sea una clase abstracta) no puede instanciarse, es decir, no pueden crearse objetos de dichas clases directamente con el operador new. Lo que si se puede crear, es una referencia de una clase abstracta. No se pueden declarar constructores abstractos, ni mtodos abstractos estticos. A continuacin, se propone el siguiente ejercicio. Se desea almacenar en un Vector diferentes figuras geomtricas (Crculo y Cuadrado). 1.- Crea las clases Crculo y Cuadrado con sus correspondientes atributos y un mtodo que calcule el rea de dicha figura. 2.- Crea una clase que tenga un atributo de tipo Vector. 2.1- Crea un mtodo que almacene un nmero determinado de figuras en un Vector. Almacena en las posiciones pares del vector los crculos y en las impares los cuadrados. 2.2.- Crea un mtodo que visualice el rea de las diferentes figuras almacenadas en el vector. 3.- Crea el mtodo main que solicite por teclado el nmero de figuras a almacenar.

Pgina 7 de 7

Anda mungkin juga menyukai