2012-02-08 17 views
11

Supongamos que tengo dos clases, A y B. La clase A se define como abstracta, mientras que B amplía esta clase abstracta, y finalmente pruebo el resultado y ambas clases son parte del mismo paquete .Comprender el propósito de Clases abstractas en Java

public abstract class A { 

    protected abstract void method1(); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1() { 
     System.out.println("This is B's implementaiton of A's method"); 
    } 
} 

y ahora cuando pruebo ellos:

B b = new B(); 
b.method1(); 
b.method2(); 

consigo salida esperada:

This is B's implementaiton of A's method 
This is Class A's method 

PREGUNTAS:

  • ¿Cuál es el propósito de @Override k eyword, porque si lo omito, sigue funcionando igual.
  • Si no implemento el método abstracto, aparece un error de compilación. Entonces, ¿cuál es la diferencia de implementar una interfaz? También puede implementar method2() en B. Luego, la salida cambia a lo que se usa en B. ¿No está esto también anulando el método de clase padre? Entonces, ¿cuál es el propósito de definir explícitamente un método como abstract en la Clase A?
+2

veces es más rápido a Google que preguntar o responder aquí: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html – vulkanino

+5

Google está bloqueado en nuestra escuela – 911TurboS

+6

¿Cómo existe el Internet sin Google? – jondavidjohn

Respuesta

13

@ Override

@ Override se introdujo en Java 5 (y se extendió un poco en Java 6). Es solo informativo. Dice "Se supone que debo anular algo que ya existe en la clase principal o en la interfaz.

Los IDE como Eclipse pueden advertirle en caso de que no exista dicho método principal (por ejemplo, si escribe mal el nombre). En ese caso, método no será invocado (debido a la mispelling).

Pero no se preocupe demasiado acerca de él.

clase abstracta vs interfaz

una clase abstracta permite definir una funcionalidad básica dejando partes indefinidas. Una interfaz no te permite t o implementar cualquier cosa. Puede programar todo excepto la parte que realmente cambia en cada caso. Entonces, cuando lo necesita, hereda e implementa la parte faltante.

anulación de dos métodos

Sí. En Java, puede anular todos los métodos no explícitamente declarados como finales en la clase principal. Está bien. Si desea que no se pueda modificar, puede declararlo definitivo. Por ejemplo, si desea declarar un ordenamiento usted podría:

public abstract class Ordering<X> 
{ 
abstract boolean isLower(X a, X b); 
abstract boolean isEquals(X a, X b); 
    final boolean isGreater(X a, X b) { 
     return !isLower(a, b) && !isEquals(a, b); 
    } 
} 

Por supuesto que puede tener sentido para anular isGreater para poner en práctica de otra manera más eficiente (imagino que es costoso para comparar). Pero hay situaciones en las que desea proporcionar una funcionalidad básica ya implementada (y luego, cuando las clases abstractas son mejores que las interfaces) o cuando desea forzar alguna implementación (entonces es cuando la demostración de la palabra clave final es útil).

+1

gracias por tomarse el tiempo para explicar maravillosamente la idea – 911TurboS

+2

¡Muchas gracias! De todos modos, te acostumbrarás a abstraer/interfaces y más al mirar ejemplos. El marco de primavera es un buen ejemplo. Y, de hecho, si conoce los patrones de diseño: las clases abstractas se relacionan muy cerca del método de la plantilla, mientras que las interfaces se relacionan con (entre muchas otras cosas) el patrón de estrategia. La plantilla se extiende por herencia mientras que la estrategia se extiende por composición. De nuevo: Spring framework con todas sus plantillas y componentes es un muy buen ejemplo. Lo descubrirás con el tiempo. – helios

4

Clases abstractas permiten almacenar las implementaciones de nivel básico (herencia), así como fabricación de un contrato que garantiza las clases heredadas implementará la funcionalidad específica (interfaz) por su propia cuenta ...

Aunque nunca habrá una instancia de una clase abstracta, puede almacenar funcionalidad compartida entre herederos ...

siempre he pensado en ellos como interfaces que permiten implementaciones de nivel de base de ciertos métodos ...

+1

+1 para clases abstractas como "interfaces con la implementación a nivel básico de ciertos métodos" – helios

+1

su respuesta fue lo que me hizo entender claramente la diferencia. – 911TurboS

17
  1. @Override no es una palabra clave, es una anotación opcional que ayuda al compilador a verificar que de hecho está anulando un método. Si dice @Override pero no hay ningún método para anular, el compilador le dirá que probablemente haya cometido un error tipográfico. Cambie el nombre de method1 a method12 para ver el efecto.
  2. La interfaz no puede tener implementaciones, mientras que la clase abstracta puede proporcionar implementaciones para algunos de sus métodos. Además, las interfaces no pueden tener miembros de datos.
  3. La definición de un método como abstracto significa que la clase derivada debe proporcionar una implementación. No declararlo abstracto dice que las clases derivadas simplemente pueden proporcionar su propia implementación, pero no es necesario.
+0

gracias por su respuesta – 911TurboS

+0

@ 911TurboS Debe marcar la respuesta como respondida si es correcta (el botón debajo del símbolo de flecha hacia abajo). – Rohan

+0

sí, pero no me lo permite, dice esperar 2 minutos – 911TurboS

0

El uso real entra en escena cuando tiene varias clases implementadas y se está invocando method1 desde method2. En este caso, después de ejecutar method2, se ejecutará method1 en la clase correspondiente.

public abstract class A { 

    protected abstract void method1(int val); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
     //Let us I calculated something here, may be sum of two ints 
     method1(//pass above calculated int); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1(int val) { 
     System.out.println("This is B's implementaiton of A's method"); 
     //Here you may do this class specific manipulation on val. 
    } 
} 

Al igual que en la clase C, puede manipular algunas calculadas con frecuencia.

2

La principal diferencia entre las clases abstractas y las interfaces, es que las interfaces solo definen una interfaz y las clases abstractas también pueden tener una implementación y campos/propiedades.

Una clase abstracta se puede ver como una relación IS-A (por ejemplo, un caballo es un animal). Para la interfaz, en su mayoría es una característica que una clase puede tener (por ejemplo, Inavigable, ISortable).

También los métodos abstractos no se pueden crear instancias (ni a las interfaces).

Las funciones de anulación son para mostrar que una función tiene una implementación de clase base.

También herencia múltiple no es posible/asesorado con clases, por lo tanto max. use solo una clase base y herede de las interfaces para otras funciones.

+0

gracias, esto fue muy útil. – 911TurboS

1

¿Cuál es el propósito de @Override keyword, porque si lo omito, sigue funcionando igual.

Legibilidad.

Si no implemento el método abstracto, obtengo un error de compilación. Entonces, ¿cuál es la diferencia para implementar una interfaz?

Las interfaces no permiten incluir código.

También, puedo implementar method2() en B también. Entonces la salida cambia a lo que se usa en B. ¿No es esto también anulando el método de clase padre ? Entonces, ¿cuál es el propósito de Definir explícitamente un método abstracto en la Clase A?

Sí, está anulando el método principal. Por lo general, define un método como abstracto para dejar la implementación para el niño (que DEBE implementarlo o que sea abstracto). Si no es abstracto, debes implementarlo.

+0

respuestas perfectamente al punto a lo que había preguntado :) – 911TurboS

+1

Las interfaces le permiten incluir 'código', son una declaración de cómo un cliente puede interactuar (interfaz) con los objetos que implementan esa interfaz. Se pueden usar como tipo de referencia que el interno promueve el polimorfismo al encapsular al cliente desde cualquier implementación abstracta o concreta. Las variables se pueden declarar en las interfaces, pero por defecto (y definición) serán estáticas ya que nunca habrá una instancia de la interfaz. Utiliza métodos abstractos para aplicar implementaciones concretas que son desconocidas o pueden cambiar entre implementaciones secundarias –

+0

Tiene razón. Estaba tratando de reanudar;) – m0skit0

1

What is the purpose of @Override keyword

Es más tarde, además de Java, que es para débiles autocontrol. Es anotación, es decir, clase de biblioteca, no palabra clave.

So what is the difference to implementing an interface?

Little. Iterface es una clase donde todos los métodos son abstractos. Además, solo se permite un padre de clase, mientras que puede tener múltiples interfaces. También puede poner miembros en clase, pero no en la interfaz.

Then what is the purpose of explicitly Defining a method abstract in Class A?

Debe declarar abstracta sólo si no tiene cuerpo. Se requiere que JVM sepa que todos los descendientes lo tendrán.

+0

gracias por su respuesta – 911TurboS

Cuestiones relacionadas