Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Una clase abstracta puede contener m�todos no-abstractos pero al menos uno de los
m�todos debe ser declarado abstracto.
Una clase abstracta no se puede instanciar pero si se puede heredar y las clases
hijas ser�n las encargadas de agregar la funcionalidad a los m�todos abstractos. Si
no lo hacen as�, las clases hijas deben ser tambi�n abstractas.
2. Esta clase abstracta tiene un m�todo abstracto. Por cierto, este no tiene body.
Eso es porque los m�todos abstractos no necesitan cuerpo.
�Y entonces para que nos sirven las clases abstractas? Las clases abstractas
cumplen una funci�n muy especial� S�lo sirven para la herencia. Otro detalle: No se
pueden instanciar, jamas, es imposible encontrar un objeto de las clases Ejemplo y
OtroEjemplo.
Clase Animal:
abstract class Animal{
public abstract void habla();
}
Clase Perro:
class Perro extends Animal{
public void habla(){
System.out.println("Guau, guau!");
}
}
y la clase Gato:
class Gato extends Animal{
public void habla(){
System.out.println("Miau, miau!");
}
}
Este ejemplo es mucho m�s claro� Sabemos que todos los animales hablan, pero no
todos lo hacen de la misma forma� Por eso heredamos de la clase Animal el m�todo
abstracto habla y lo implementamos en las clases Perro y Gato� �Qu� pasa si�?
class Gato extends Animal{
public void hablaGato(){
System.out.println("Miau, miau");
}
}
Este c�digo es totalmente incorrecto. Siempre que una clase hereda de una clase
abstracta est� obligada a usar un m�todo con el mismo nombre, pero esta vez con
sentencias dentro de las {llaves}.
Vamos m�s adentro� .
public class Eject{
public static void main(String... args){
Animal donGato = new Gato();
Animal benitoBodoque = new Gato();
}
}
Interfaces
Un interfaz es una lista de acciones que puede llevar a cabo un determinado objeto.
Sorpresa, �eso no eran los m�todos que se definen en una clase? Casi, en una clase
adem�s de aparecer los m�todos aparec�a el c�digo para dichos m�todos, en cambio en
un interfaz s�lo existe el prototipo de una funci�n, no su c�digo.
Esto significa tambi�n que a cualquier avi�n le podemos pedir que vuele, sin
importarnos a que clase real pertenezca el avi�n, evidentemente cada clase
especificar� como volar� el avi�n (porque proporciona el c�digo de la funci�n
volar).
En java un interfaz define la lista de m�todos, pero para que una clase posea un
interfaz hay que indicar expl�citamente que lo implementa mediante la cla�sula
implements. Pero veamos primero la estructura de un interfaz:
[modif.visibilidad] interface nombreInterfaz [extends listaInterfaces]
prototipo m�todo1;
.....
prototipo m�todo1;
nombreInterfaz por convenio, sigue las mismas reglas de nomenclatura que las
clases, y en muchos casos acaba en able (que pod�amos traducir como: 'ser capaz
de').
La cla�sula opcional extends, se emplea para conseguir que un interfaz herede las
funciones de otro/s interfaces, simplemente listaInterfaces es una lista separada
por coma de interfaces de los que se desea heredar.
Pr�cticas:
Vamos a definir el interfaz Cantante, un interfaz muy simple que s�lo posee un
m�todo: cantar.
{
System.out.println("La laa la raa laaa!");
hacerCantar(p);
c.cantar();
Probemos a intentar pasar a la funci�n hacerCantar en lugar del objeto Persona (p)
un objeto String (texto), resultado: error de compilaci�n.
}
Y ahora agreguemos en la clase ArranqueInterfaz el siguiente c�digo, para crear un
objeto canario y pasarselo a la funci�n hacerCantar:
hacerCantar(c);
Tras ejecutar comprobaremos que podemos pasar tanto una Persona como un Canario a
la funci�n hacerCantar, de tal manera que dentro de dicha funci�n s�lo accedamos a
las funciones del interfaz y no habr� problemas. Por ejemplo, si pusi�ramos:
c.SetNombre("Luis")
****Interfaces en Java.*****
Los m�todos abstractos son �tiles cuando se quiere que cada implementaci�n de la
clase parezca y funcione igual, pero necesita que se cree una nueva clase para
utilizar los m�todos abstractos. Los interfaces proporcionan un mecanismo para
abstraer los m�todos a un nivel superior, lo que permite simular la herencia
m�ltiple de otros lenguajes.
Un interfaz sublima el concepto de clase abstracta hasta su grado m�s alto. Un
interfaz podr� verse simplemente como una forma, es como un molde, solamente
permite declarar nombres de m�todos, listas de argumentos, tipos de retorno y
adicionalmente miembros datos (los cuales podr�n ser �nicamente tipos b�sicos y
ser�n tomados como constantes en tiempo de compilaci�n, es decir, static y final).
Un interfaz contiene una colecci�n de m�todos que se implementan en otro lugar. Los
m�todos de una clase son public, static y final.
La principal diferencia entre interface y abstract es que un interfaz proporciona
un mecanismo de encapsulaci�n de los protocolos de los m�todos sin forzar al
usuario a utilizar la herencia. Por ejemplo:
public interface VideoClip {
// comienza la reproduccion del video
void play();
// reproduce el clip en un bucle
void bucle();
// detiene la reproduccion
void stop();
}
Las clases que quieran utilizar el interfaz VideoClip utilizar�n la palabra
implements y proporcionar�n el c�digo necesario para implementar los m�todos que se
han definido para el interfaz:
class MiClase implements VideoClip {
void play() {
<c�digo>
}
void bucle() {
<c�digo>
}
void stop() {
<c�digo>
}
Al utilizar implements para el interface es como si se hiciese una acci�n de
copiar-y-pegar del c�digo del interface, con lo cual no se hereda nada, solamente
se pueden usar los m�todos.
La ventaja principal del uso de interfaces es que una clase interface puede ser
implementada por cualquier n�mero de clases, permitiendo a cada clase compartir el
interfaz de programaci�n sin tener que ser consciente de la implementaci�n que
hagan las otras clases que implementen el interface.
class MiOtraClase implements VideoClip {
void play() {
<c�digo nuevo>
}
void bucle() {
<c�digo nuevo>
}
void stop() {
<c�digo nuevo>
}
Es decir, el aspecto m�s importante del uso de interfaces es que m�ltiples objetos
de clases diferentes pueden ser tratados como si fuesen de un mismo tipo com�n,
donde este tipo viene indicado por el nombre del interfaz.
Aunque se puede considerar el nombre del interfaz como un tipo de prototipo de
referencia a objetos, no se pueden instanciar objetos en s� del tipo interfaz. La
definici�n de un interfaz no tiene constructor, por lo que no es posible invocar el
operador new sobre un tipo interfaz.
Un interfaz puede heredar de varios interfaces sin ning�n problema. Sin embargo,
una clase solamente puede heredar de una clase base, pero puede implementar varios
interfaces. Tambi�n, el JDK ofrece la posibilidad de definir un interfaz vac�o,
como es el caso de Serialize, que permite serializar un objeto. Un interfaz vac�o
se puede utilizar como un flag, un marcador para marcar a una clase con una
propiedad determinada.
La aplicaci�n java514.java, ilustra algunos de los conceptos referentes a los
interfaces. Se definen dos interfaces, en uno de ellos se definen dos constantes y
en el otro se declara un m�todo put() y un m�todo get(). Las constantes y los
m�todos se podr�an haber colocado en la misma definici�n del interfaz, pero se han
separado para mostrar que una clase simple puede implementar dos o m�s interfaces
utilizando el separador coma (,) en la lista de interfaces.
Tambi�n se definen dos clases, implementando cada una de ellas los dos interfaces.
Esto significa que cada clase define el m�todo put() y el m�todo get(), declarados
en un interfaz y hace uso de las constantes definidas en el otro interfaz. Estas
clase se encuentran en ficheros separados por exigencias del compilador, los
ficheros son Constantes.java y MiInterfaz.java, y el contenido de ambos ficheros es
el que se muestra a continuaci�n:
public interface Constantes {
public final double pi = 6.14;
public final int constanteInt = 125;
}
interface Luchar {
void luchar();
}
interface Nadar {
void nadar();
}
interface Volar {
void volar();
}
class Accion {
public void luchar() {}
}