Je veux écrire une méthode abstraite mais le compilateur donne constamment cette erreur:
les méthodes abstraites ne peuvent pas avoir de corps
J'ai une méthode comme celle-ci:
public abstract boolean isChanged() {
return smt else...
}
Qu'est-ce qui ne va pas ici?
Les méthodes abstraites signifient qu'il n'y a pas d'implémentation par défaut et qu'une classe d'implémentation fournira les détails.
Essentiellement, vous auriez
abstract class AbstractObject {
public abstract void method();
}
class ImplementingObject extends AbstractObject {
public void method() {
doSomething();
}
}
Donc, c'est exactement comme l'indique l'erreur: votre méthode abstraite ne peut pas avoir de corps.
Il y a un tutoriel complet sur le site d'Oracle à: http://download.Oracle.com/javase/tutorial/Java/IandI/abstract.html
La raison pour laquelle vous feriez quelque chose comme ceci est que plusieurs objets peuvent partager certains comportements, mais pas tous.
Un exemple très simple serait les formes:
Vous pouvez avoir un objet graphique générique, qui sait se repositionner, mais les classes d'implémentation se dessineront elles-mêmes.
(Ceci est tiré du site que j'ai lié ci-dessus)
abstract class GraphicObject {
int x, y;
...
void moveTo(int newX, int newY) {
...
}
abstract void draw();
abstract void resize();
}
class Circle extends GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
class Rectangle extends GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
Si vous utilisez le mot-clé Java abstract
), vous ne pouvez pas fournir d'implémentation.
Parfois, cette idée vient d'avoir un arrière-plan en C++ et de confondre le mot clé virtual
en C++ comme étant "presque le même" que le mot clé abstract
en Java.
En C++ virtual
indique qu'une méthode peut être surchargée et le polymorphisme suivra, mais abstract
en Java n'est pas la même chose. En Java abstract
ressemble plus à un pure virtual
, ou une méthode où l'implémentation doit être fournie par une sous-classe. Étant donné que Java prend en charge le polymorphisme sans qu'il soit nécessaire de le déclarer, toutes les méthodes sont virtual
d'un point de vue C++. Donc, si vous souhaitez fournir une méthode qui peut être remplacée, l'écrire comme une méthode "normale".
Maintenant, pour protéger une méthode contre toute substitution, Java utilise le mot clé final
en coordination avec la déclaration de méthode pour indiquer que les sous-classes ne peuvent pas remplacer la méthode.
Le message d'erreur indique la raison exacte: "les méthodes abstraites ne peuvent pas avoir de corps".
Ils ne peuvent être définis que dans des classes abstraites et des interfaces (les méthodes d'interface sont implicitement abstraites!) Et l'idée est que la sous-classe implémente la méthode.
Exemple:
public abstract class AbstractGreeter {
public abstract String getHelloMessage();
public void sayHello() {
System.out.println(getHelloMessage());
}
}
public class FrenchGreeter extends AbstractGreeter{
// we must implement the abstract method
@Override
public String getHelloMessage() {
return "bonjour";
}
}