La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

 En Java, como en otros lenguajes de programación orientados a objetos, las clases pueden derivar desde otras clases. La clase derivada (la clase que.

Presentaciones similares


Presentación del tema: " En Java, como en otros lenguajes de programación orientados a objetos, las clases pueden derivar desde otras clases. La clase derivada (la clase que."— Transcripción de la presentación:

1

2  En Java, como en otros lenguajes de programación orientados a objetos, las clases pueden derivar desde otras clases. La clase derivada (la clase que proviene de otra clase) se llama subclase. La clase de la que está derivada se denomina superclase.

3  De hecho, en Java, todas las clases deben derivar de alguna clase. Lo que nos lleva a la cuesti ó n ¿ D ó nde empieza todo esto?. La clase m á s alta, la clase de la que todas las dem á s descienden, es la clase Object, definida en java.lang. Object es la ra í z de la herencia de todas las clases.

4  Las subclases heredan el estado y el comportamiento en forma de las variables y los m é todos de su superclase. La subclase puede utilizar los í tems heredados de su superclase tal y como son, o puede modificarlos o sobreescribirlos. Por eso, seg ú n se va bajando por el á rbol de la herencia, las clases se convierten en m á s y m á s especializadas.

5  Definici ó n: Una subclase es una clase que desciende de otra clase. Una subclase hereda el estado y el comportamiento de todos sus ancestros. El t é rmino superclase se refiere a la clase que es el ancestro m á s directo, as í como a todas las clases ascendentes.

6  Crear Subclases  Se declara que un clase es una subclase de otra clase dentro de La declaraci ó n de Clase. Por ejemplo, supongamos que queremos crear una subclase llamada SubClase de otra clase llamada SuperClase. Se escribir í a esto.

7  class SubClass extends SuperClass { ..........  }  Esto declara que SubClase es una subclase de SuperClase. Y tambi é n declara impl í citamene que SuperClase es la superclase de SubClase.

8  Una subclase tambi é n hereda variables y miembros de las superclases de su superclase, y as í a lo largo del á rbol de la herencia. Para hacer esta explicaci ó n un poco m á s sencilla, cuando nos referimos a la superclase de una clase significa el ancestro m á s directo de la clase as í como a todas sus clases ascendentes.

9  Una clase Java s ó lo puede tener una superclase directa. Java no soporta la herencia m ú ltiple.

10  Crear una subclase puede ser tan sencillo como incluir la cl á usula extends en la declaraci ó n de la clase. Sin embargo, normalmente se deber á realizar alguna cosa m á s cuando se crea una subclase, como sobrescribir m é todos, etc...

11  ¿ Qu é variables miembro hereda una subclase?

12  Regla: Una subclase hereda todas las variables miembros de su superclase que puedan ser accesibles desde la subclase (a menos que la variable miembro est é oculta en la subclase).

13  Esto es, las subclases.  heredan aquellas variables miembros declaradas como public o protected  heredan aquellas variables miembros declaradas sin especificador de acceso (normalmente conocidas como "Amigas") siempre que la subclase est é en el mismo paquete que la clase

14  no hereda las variables miembros de la superclase si la subclase declara una variable miembro que utiliza el mismo nombre. La variable miembro de la subclase se dice que oculta a la variable miembro de la superclase.  no hereda las variables miembro private

15  Ocultar Variables Miembro  Las variables miembros definidas en la subclase ocultan las variables miembro que tienen el mismo nombre en la superclase.

16  Como esta caracter í stica del lenguaje Java es poderosa y conveniente, puede ser una fuente de errores: ocultar una variable miembro puede hacerse deliberadamente o por accidente. Entonces, cuando nombres tus variables miembro se cuidadoso y oculta s ó lo las variables miembro que realmente deseas ocultar.

17  Una caracter í stica interesante de las variables miembro en Java es que una clase puede acceder a una variable miembro oculta a trav é s de su superclase. Considere este pareja de superclase y subclase.

18  class Super {  Number unNumero;  }  class Sub extends Super {  Float unNumero;  }

19  La variable unNumero de Sub oculta a la variable unNumero de Super. Pero se puede acceder a la variable de la superclase utilizando.  super.unNumero

20  super es una palabra clave del lenguaje Java que permite a un m é todo referirse a las variables ocultas y m é todos sobreescritos de una superclase.

21  ¿Qué métodos hereda una Subclase?  La regla que especifica los métodos heredados por una subclase es similar a la de las variables miembro.  Regla: Una subclase hereda todos los métodos de sus superclase que son accesibles para la subclase (a menos que el método sea sobreescrito por la subclase).

22  Esto es, una Subclase.  hereda aquellos m é todos declarados como public o protected  hereda aquellos m é todos sin especificador de acceso, siempre que la subclase est é en el mismo paquete que la clase.  no hereda un m é todo de la superclase si la subclase declara un m é todo que utiliza el mismo nombre. Se dice que el m é todo de la subclase sobreescribe al m é todo de la superclase.  no hereda los m é todos private.

23  Sobreescribir M é todos Sobreescribir M é todos  La habilidad de una subclase para sobreescribir un m é todo de su superclase permite a una clase heredar de su superclase aquellos comportamientos "m á s cercanos" y luego suplementar o modificar el comportamiento de la superclase.  Una subclase puede sobreescribir completamente la implementaci ó n de un m é todo heredado o puede mejorar el m é todo a ñ adi é ndole funcionalidad.

24  Reemplazar la Implementación de un Método de una Superclase  Algunas veces, una subclase querría reemplazar completamente la implementación de un método de su superclase. De hecho, muchas superclases proporcionan implementaciones de métodos vacías con la esperanza de que la mayoría, si no todas, sus subclases reemplacen completamente la implementación de ese método.

25  Un ejemplo es el método run() de la clase Thread. La clase Thread proporciona una implementación vacía para el método run(), porque por definición, este método depende de la subclase. La clase Thread posiblemente no puede proporcionar una implementación medianamente razonable del método run().

26  Para reemplazar completamente la implementación de un método de la superclase, simplemente se llama a un método con el mismo nombre que el del método de la superclase y se sobreescribe el método con la misma firma que la del método sobreescrito.

27 class ThreadSegundoPlano extends Thread { void run() {... } }  La clase ThreadSegundoPlano sobrescribe completamente el método run() de su superclase y reemplaza completamente su implementación.

28  Métodos que una Subclase no Puede Sobrescribir  Una subclase no puede sobrescribir métodos que hayan sido declarados como final en la superclase (por definición, los métodos finales no pueden ser sobrescritos). Si intentamos sobrescribir un método final, el compilador mostrará un mensaje similar a este y no compilará el programa. FinalTest.java:7: Final methods can't be overriden. Method void iamfinal() is final in class ClassWithFinalMethod. void iamfinal() { ^ 1 error

29  Una subclase tampoco puede sobrescribir métodos que se hayan declarado como static en la superclase. En otras palabras, una subclase no puede sobrescribir un método de clase.  Métodos que una Subclase debe Sobrescribir  Las subclases deben sobrescribir aquellos métodos que hayan sido declarados como abstract en la superclase, o la propia subclase debe ser abstracta.

30  Escribir Clases y Métodos Finales  Se puede declarar que una clase sea final; esto es, que la clase no pueda tener subclases. Existen dos razones por las que se querría hacer esto: razones de seguridad y de diseño.  Seguridad: Un mecanismo que los hackers utilizan para atacar sistemas es crear subclases de una clase y luego sustituirla por el original. Las subclases parecen y sienten como la clase original pero hacen cosas bastante diferentes, probablemente causando daños u obteniendo información privada. Para prevenir esta clase de subversión, se puede declarar que la clase sea final y así prevenir que se cree cualquier subclase.

31  La clase String del paquete java.lang es una clase final s ó lo por esta raz ó n. La clase String es tan vital para la operaci ó n del compilador y del int é rprete que el sistema Java debe garantizar que siempre que un m é todo o un objeto utilicen un String, obtenga un objeto java.lang.String y no alg ú n otro string. Esto asegura que ning ú n string tendr á propiedades extra ñ as, incosistentes o indeseables.  Si se intenta compilar una subclase de una clase final, el compilador mostrar á un mensaje de error y no compilar á el programa. Adem á s, los bytescodes verifican que no est á teniendo lugar una subversi ó n, al nivel de byte comprobando que una clase no es una subclase de una clase final.

32  Diseño: Otra razón por la que se podría querer declarar una clase final son razones de diseño orientado a objetos. Se podría pensar que una clase es "perfecta" o que, conceptualmente hablando, la clase no debería tener subclases.  Para especificar que una clase es una clase final, se utiliza la palabra clave final antes de la palabra clave class en la declaración de la clase.

33 class Mamifero { String especie, color; } class Gato extends Mamifero { int numero_patas; } public class Herencia { public static void main(String[] args) { Gato bisho; bisho = new Gato(); bisho.numero_patas = 4; bisho.color = "Negro"; System.out.println(bisho.color); } }

34  Como vemos en el ejemplo, el objeto bisho no s ó lo tiene la propiedad numero_patas, tambi é n color que es una propiedad de Mamifero. Se dice que Mamifero es la clase padre y Gato la clase hija en una relaci ó n de herencia. Esta relaci ó n se consigue en Java por medio de la palabra reservada extends.  Pero, adem á s de heredad la funcionalidad de la clase padre, una clase hija puede sobreescribirla. Podemos escribir un m é todo en la clase hija que tenga el mismo nombre y los mismos par á metros que un m é todo de la clase padre:

35  class Mamifero { String especie, color; public void mover() { System.out.println("El mam í fero se mueve"); } }  class Gato extends Mamifero { int numero_patas; public void mover() { System.out.println("El gato es el que se mueve"); } }  public class Herencia { public static void main(String[] args) { Gato bisho = new Gato(); bisho.mover(); } }

36  Al ejecutar esta nueva versión veremos que se escribe el mensaje de la clase hija, no el del padre.  Conviene indicar que Java es una lenguaje en el que todas las clases son heredadas, aún cuando no se indique explícitamente. Hay una jerarquía de objetos única, lo que significa que existe una clase de la cual son hijas todas las demás. Este Adán se llama Object y, cuando no indicamos que nuestras clases hereden de nadie, heredan de él. Esto permite que todas las clases tengan algunas cosas en común, lo que permite que funcione, entre otras cosas, el recolector de basura.

37 class Empleado { String nombre; int numEmpleado, sueldo; static private int contador = 0; Empleado(String nombre, int sueldo) { this.nombre = nombre; this.sueldo = sueldo; numEmpleado = ++contador; } public void aumentarSueldo(int porcentaje) { sueldo += (int)(sueldo * aumento / 100); } public String toString() { return "Num. empleado " + numEmpleado + " Nombre: " + nombre + " Sueldo: " + sueldo; } }

38  class ProductoLimpieza {  private String s = new String("Producto de Limpieza");  public void aniadir(String a) { s += a; }  public void diluir() { aniadir(" diluir() " ) ; }  public void aplicar ( ) { aniadir ( " aplicar ( ) " ) ; }  public void frotar ( ) { aniadir ( " fregar ( ) " ) ; }  public void escribir( ) { System.out.println(s); }  public static void main(String[] args) {  ProductoLimpieza x = new ProductoLimpieza();  x.diluir ( );  x.aplicar ( );  x.frotar ( );  x.escribir ( ) ; } }

39  public class Detergente extends ProductoLimpieza {  // Cambiar un método:  public void frotar ( ) {  aniadir ( " Detergente. frotar ( ) " ) ;  super.frotar ( ); }// Llamar a la versión de la clase base  // Añadir métodos al interfaz:  public void aclarar ( ) { aniadir ( " aclarar ( ) " ) ; }  // Probar la nueva clase:  public static void main(String[] args) {  Detergente x = new Detergente();  x.diluir ( );  x.aplicar ( );  x.frotar ( );  x.aclarar ( );  x.escribir ( );  System.out.println("Probando la clase base: " ) ;  ProductoLimpieza.main(args); } }

40  Esto demuestra un gran número de aspectos. En primer lugar, en el método aniadir( ) de la clase ProductoLimpieza, se concatenan Cadenas de caracteres a s utilizando el operador +=, que es uno de los operadores (junto con '+') que los diseñadores de Java "sobrecargaron" para que funcionara con Cadenas de caracteres.

41  Segundo, tanto ProductoLimpieza como Detergente contienen un método main( ). Se puede crear un método main( ) por cada clase que uno cree, y se recomienda codificar de esta forma, de manera que todo el código de prueba esté dentro de la clase. Incluso si se tienen muchas clases en un programa, sólo se invocará al método main( ) de la clase invocada en la línea de comandos.

42  (Dado que main( ) es público, no importa si la clase a la que pertenece es o no pública.) Por tanto, en este caso, cuando se escriba java Detergente, se invocará a Detergente.main( ). Pero también se puede hacer que ProductoLimpieza invoque a ProductoLimpieza.main( ), incluso aunque ProductoLimpieza no sea una clase pública.

43  Esta técnica de poner un método main( ) en cada clase permite llevar a cabo pruebas para cada clase de manera sencilla. Y no es necesario eliminar el método main( ) cuando se han acabado las pruebas; se puede dejar ahí por si hubiera que usarlas para otras pruebas más adelante.

44  Aquí, se puede ver que Detergente.main( ) llama a ProductoLimpieza.main( ) explícitamente, pasándole los mismos argumentos de la línea de comandos (sin embargo, se podría pasar cualquier array de Cadenas de caracteres).  Es importante que todos los métodos de ProductoLimpieza sean públicos. Recuerde que si se deja sin poner cualquier modificador de miembro, el miembro será por defecto "amistoso", lo cual permite acceder sólo a los miembros del paquete. Por consiguiente, dentro de este paquete, cualquiera podría usar esos métodos si no hubiera modificador de acceso. Detergente no tendría problemas, por ejemplo

45  Sin embargo, si se fuera a heredar desde ProductoLimpieza una clase de cualquier otro paquete, ésta sólo podría acceder a las clases públicas. Por tanto, al planificar la herencia, como regla general, deben hacerse todos los campos privados y todos los miembros públicos.  Por supuesto, en los casos particulares hay que hacer ajustes, pero ésta es una regla útil.

46  Fíjese que ProductoLimpieza tiene un conjunto de métodos en su interfaz: aniadir( ), diluir( ), aplicar(), frotar( ) y escribir( ). Dado que Detergente se hereda de ProductoLimpieza (mediante la palabra clave extends) automáticamente se hace con estos métodos en su interfaz, incluso aunque no se encuentren explícitamente definidos en Detergente. Se puede pensar que la herencia, por tanto, es una reutilización del interfaz. (La implementación también se hereda, pero esto no es lo importante.)

47  Como se ha visto en frotar( ), es posible tomar un método que se haya definido en la clase base y modificarlo. En este caso, se podría desear llamar al método desde la clase base dentro de la nueva versión. Pero dentro de frotar( ) no se puede simplemente invocar a frotar( ), dado que eso produciría una llamada recursiva, que no es lo que se desea. Para solucionar este problema Java tiene la palabra clave super que hace referencia a la "superclase" de la cual ha heredado la clase actual.

48  Por consiguiente, la expresión super.frotar( ) llama a la versión que tiene la clase base del método frotar( ).

49  Al heredar, uno no se limita a usar los métodos de la clase base. También se pueden añadir nuevos métodos a la clase derivada, exactamente de la misma manera que se introduce un método en una clase: simplemente se definen. El método aclarar( ) es un ejemplo de esta afirmación.  En Detergente.main( ) se puede ver que, para un objeto Detergente, se puede invocar a todos los métodos disponibles, también en ProductoLimpieza y en Detergente (por ejemplo, aclarar( )).


Descargar ppt " En Java, como en otros lenguajes de programación orientados a objetos, las clases pueden derivar desde otras clases. La clase derivada (la clase que."

Presentaciones similares


Anuncios Google