Download Diapositiva 1

Document related concepts
no text concepts found
Transcript
Metodología de
Programación
Ayudantía 5
lelagos.ublog.cl
2009
Herencia

La Herencia es el mecanismo por el que se crean nuevos
objetos definidos en términos de objetos ya existentes.

La herencia ofrece una ventaja importante, permite la
reutilización del código. Una vez que una clase ha sido
depurada y probada, el código fuente de dicha clase no
necesita modificarse. Su funcionalidad se puede cambiar
derivando una nueva clase que herede la funcionalidad de la
clase base y le añada otros comportamientos.

En Java no se puede hacer herencia múltiple
Modificadores de Acceso

Hay cuatro modificadores de acceso a los miembros dato y a
los métodos: private, protected, public y default (por
defecto, o en ausencia de cualquier modificador).

La herencia complica aún más el problema de acceso, ya que
las clases dentro del mismo paquete tienen diferentes accesos
que las clases de distinto paquete
Modificadores de Acceso
• public - Todo el mundo puede acceder al elemento. Si es un
dato miembro, todo el mundo puede ver el elemento, es decir,
usarlo y asignarlo. Si es un método todo el mundo puede
invocarlo.
Si es en una clase: Todo el mundo puede usarla. Se pueden
crear instancias de esa clase, siempre y cuando alguno de sus
constructores sea accesible
• private - Sólo se puede acceder al elemento desde métodos
de la clase, o sólo puede invocarse el método desde otro
método de la clase.
Modificadores de Acceso
• protected - El modificador de acceso protected es una
combinación de los accesos que proporcionan los
modificadores public y private. protected proporciona acceso
público para las clases derivadas y acceso privado (prohibido)
para el resto de clases.
• Sin modificador(default) - Se puede acceder al elemento
desde cualquier clase del package donde se define la clase.
Si es en una clase: Solo puede ser usada e instanciada por
clases dentro del package donde se define.
•
Pueden utilizarse estos modificadores para cualquier tipo de miembros
de la clase, incluidos los constructores (con lo que se puede limitar
quien puede crear instancias de la clase).
Clases Abstractas
• Una clase abstracta es una clase de la que no se puede crear
objetos. La utilidad esta en que otras clases hereden de ésta,
para reutilizar código. Para declarar una clase como abstracta
utilizamos la palabra reservada abstract.
• Los métodos sin implementar serán declarados abstractos. Si
una clase tiene un método abstract es obligatorio que la clase
sea abstract. Todas las subclases que hereden de una clase
abstracta tendrán que redefinir los métodos abstractos
dándoles una implementación. En el caso de que no
implementen alguno de esos métodos la clase hija también
será abstracta y tendrá que declararse como tal (tanto la clase
como los métodos que siguen siendo abstractos).
Clases Abstractas
public abstract class Forma
{
private int xpos, ypos;
private Color color;
// ...
public abstract void dibuja();
public void setColor(Color c)
{
/*...*/
};
}
Clases Abstractas
public class Circle extends Forma
{
private int radio;
public void dibuja()
{
/*...*/
};
public void setRadio(int)
{
/*...*/
};
}
Clases Abstractas
public class Rectangle extends Forma
{
private int altura, anchura;
public void dibuja()
{
/*...*/
};
public void setAltura(int)
{
/*...*/
};
}
Interfaces
Un interface es parecido a una clase abstracta en Java, pero con
las siguientes diferencias:
-
Todo método es abstracto y público sin necesidad de
declararlo. Por lo tanto un interface en Java no implementa
ninguno de los métodos que declara.
-
Las variables del interface serán las variables miembro de la
clase.
-
Un interface se implementa (implements) no se extiende
(extends) por sus subclases.
Interfaces
-
Una clase puede implementar más de un interfaz en Java, pero
sólo puede extender una clase.
(Es lo más parecido que tiene Java a la herencia múltiple, que
de clases normales está prohibida.)
-
Podemos declarar variables del tipo de clase del interfaz, pero
para inicializarlas tendremos que hacerlo de una clase que lo
implemente.
Interfaces
• Vamos a crear un interface denominado Mensaje que contenga
la declaración de una función denominada Muestra.
public interface Mensaje
{
public abstract void Muestra();
}
• Hacemos que la jerarquía de clases que deriva de Animal
implemente la interface Mensaje
public abstract class Animal implements Mensaje
{
public abstract void Muestra();
}
Interfaces
class Perro extends Animal
{
public void Muestra(){
System.out.println("¡Guau!");
}
}
class Gato extends Animal
{
public void Muestra(){
System.out.println("¡Miau!");
}
}
Interfaces
• Ahora con otra jerarquía de clases completamente distinta, la
que deriva de la clase base Reloj. Una de las clases de dicha
jerarquía Cucu implementa el interface Mensaje y por tanto,
debe de definir obligatoriamente la función Muestra declarada
en dicho interface.
public abstract class Reloj { }
class Cucu extends Reloj implements Mensaje{
public void Muestra(){
System.out.println("¡Cucu, cucu, ..!"); }
}
Interfaces
• Definamos la función Muestra2 de modo que conozca al objeto que
se le pasa no por una clase base, sino por el interface Mensaje.
public class PoliApp {
public static void main(String[] args) {
Gato gato=new Gato();
Muestra2(gato);
Cucu cucu=new Cucu();
Muestra2(cucu);
}
static void Muestra2(Mensaje sujeto){
sujeto. Muestra2();
}
}