Une méthode abstraite est une déclaration de signature de méthode sans corps. Par exemple :
public abstract class Shape {
. . .
public abstract double getArea();
public abstract double getPerimeter();
}
Les méthodes getArea()
y getPerimeter()
sont abstraits. Parce que le Shape
a une méthode abstraite, elle debe être déclaré abstract
également. Une classe peut également être déclarée abstract
sans aucune méthode abstraite. Lorsqu'une classe est abstraite, on ne peut pas créer d'instance de celle-ci ; on ne peut créer que des instances de sous-classes (concrètes). Une classe concrète est une classe qui n'est pas déclarée abstraite (et qui, par conséquent, ne possède aucune méthode abstraite et implémente toutes les méthodes abstraites héritées). Par exemple :
public class Circle extends Shape {
public double radius;
. . .
public double getArea() {
return Math.PI * radius * radius;
}
public double getPerimeter() {
return 2.0 * Math.PI * radius;
}
}
Il y a plusieurs raisons de le faire. L'une d'entre elles serait d'écrire une méthode qui serait la même pour toutes les formes, mais qui dépendrait d'un comportement spécifique à la forme, inconnu à l'origine. Shape
niveau. Par exemple, on pourrait écrire la méthode :
public abstract class Shape {
. . .
public void printArea(PrintStream out) {
out.println("The area is " + getArea());
}
}
Il s'agit certes d'un exemple artificiel, mais il illustre l'idée de base : définir un comportement concret en termes de comportement non spécifié.
Une autre raison d'avoir une classe abstraite est de pouvoir implémenter partiellement une interface. Toutes les méthodes déclarées dans une interface sont héritées en tant que méthodes abstraites par toute classe qui implémente l'interface. Parfois, vous souhaitez fournir une implémentation partielle d'une interface dans une classe et laisser les détails aux sous-classes ; l'implémentation partielle doit être déclarée abstraite.