Pourquoi une classe abstraite de la mise en œuvre d'une interface peut manquer de la déclaration et la mise en œuvre de l'un de l'interface des méthodes?

Une chose curieuse qui se passe en Java lorsque vous utilisez une classe abstraite pour implémenter une interface: une partie de l'interface de méthodes peuvent être totalement absent (c'est à dire ni une déclaration abstraite ou d'une mise en œuvre effective est présent), mais le compilateur ne se plaignent pas.

Par exemple, compte tenu de l'interface:

public interface IAnything {
  void m1();
  void m2();
  void m3();
}

la suite de la classe abstraite devient joyeusement compilé sans un avertissement ou une erreur:

public abstract class AbstractThing implements IAnything {
  public void m1() {}
  public void m3() {}
}

Pouvez-vous expliquer pourquoi?

  • On ne peut pas créer un objet d'une classe abstraite. Donc, tant que l'application n'est pas prévue pour une classe abstraite, les objets ne peuvent pas être créés pour IAnything. Donc, c'est absolument parfait pour le compilateur. Le compilateur s'attend à ce que, tout non-abstraite de la classe qui implémente IAnything doit implémenter toutes les méthodes déclarées IAnything. Et puisque l'on doit étendre et de mettre en œuvre AbstractThing pour être en mesure de créer des objets, le compilateur génère une erreur, si cette application ne pas appliquer les méthodes de IAnything gauche par AbstractThing.
  • J'ai eu une classe concrète qui a été l'extension de sa propre "AbstractThing" dans un scénario identique à présent, et même si je ne l'avais pas mis en œuvre l'une des méthodes de l'interface, il a été inexplicablement de la compilation. Maintenant, c'est de faire ce que j'attends, mais je ne peux pas comprendre ce qui était à l'origine de réussir avant. Je crois que je n'avais pas :w'd'un seul de ces fichiers.