web-dev-qa-db-fra.com

Méthodes abstraites en Java

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?

31
caner

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() {
        ...
    }
}
74
Reverend Gonzo

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.

21
Edwin Buck

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";
   }
 }
4
Andreas_D