Métodos abstractos en Java

Quiero escribir un método abstracto pero el compilador da persistentemente este error:

los métodos abstractos no pueden tener cuerpo

Tengo un método como este:

public abstract boolean isChanged() {
    return smt else...
}

¿Que esta mal aquí?

preguntado el 16 de mayo de 11 a las 16:05

El compilador le dice exactamente lo que está mal. Es persistente porque está intentando compilar un código no válido. Por interés, ¿qué hago? Usted ¿Piensas convertir un método en abstracto, si le estás proporcionando un cuerpo? -

¿Qué estás tratando de lograr al declarar el método abstract? -

@jon @ ted, tengo una clase abstracta y quiero escribir un método abstracto en esa clase. -

Multa. Simplemente no le des un cuerpo al método. -

En java, un método abstracto nunca puede tener un cuerpo:

3 Respuestas

Los métodos abstractos significan que no hay una implementación predeterminada y una clase de implementación proporcionará los detalles.

Esencialmente, tendrías

abstract class AbstractObject {
   public abstract void method();
}

class ImplementingObject extends AbstractObject {
  public void method() {
    doSomething();
  }
}

Entonces, es exactamente como indica el error: su método abstracto no puede tener un cuerpo.

Hay un tutorial completo en el sitio de Oracle en: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

La razón por la que haría algo como esto es si varios objetos pueden compartir algún comportamiento, pero no todo el comportamiento.

Un ejemplo muy simple serían las formas:

Puede tener un objeto gráfico genérico, que sepa cómo reposicionarse, pero las clases de implementación se dibujarán a sí mismas.

(Esto está tomado del sitio que vinculé arriba)

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

respondido 12 mar '19, 18:03

Si usa la palabra clave java abstract no puede proporcionar una implementación.

A veces, esta idea proviene de tener experiencia en C ++ y confundir el virtual palabra clave en C ++ como "casi lo mismo" que el abstract palabra clave en Java.

En c ++ virtual indica que se puede anular un método y seguirá el polimorfismo, pero abstract en Java no es lo mismo. En Java abstract es más como un pure virtual método, o uno donde la implementación debe ser proporcionada por una subclase. Dado que Java admite polimorfismo sin la necesidad de declararlo, todos los métodos son virtual desde el punto de vista de C ++. Entonces, si desea proporcionar un método que pueda ser anulado, simplemente escríbalo como un método "normal".

Ahora, para evitar que un método sea anulado, Java usa la palabra clave final en coordinación con la declaración del método para indicar que las subclases no pueden anular el método.

contestado el 16 de mayo de 11 a las 20:05

Para una perspectiva de C ++, es como tener public: virtual bool isChanged() = 0 { return smt else... }, que es legal. abstract es como el = 0 un poco. - Tom Hawtin - táctica

Buen trabajo explicando por qué podría estar confundido, - Reverendo Gonzo

El mensaje de error indica la razón exacta: "los métodos abstractos no pueden tener cuerpo".

Solo se pueden definir en clases e interfaces abstractas (¡los métodos de interfaz son implícitamente abstractos!) Y la idea es que la subclase implemente el método.

Ejemplo:

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

contestado el 16 de mayo de 11 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.