Абстрактные методы в Java - PullRequest
30 голосов
/ 16 мая 2011

Я хочу написать абстрактный метод, но компилятор постоянно выдает эту ошибку:

абстрактные методы не могут иметь тела

У меня есть такой метод:

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

Что здесь не так?

Ответы [ 3 ]

74 голосов
/ 16 мая 2011

Абстрактные методы означают, что для него нет реализации по умолчанию, и реализующий класс предоставит подробности.

По сути, у вас будет

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

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

Таким образом, это в точности как состояния ошибки: у вашего абстрактного метода не может быть тела.

На сайте Oracle есть полный учебник по адресу: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Причина, по которой вы будете делать что-то подобное, заключается в том, что несколько объектов могут иметь общее поведение, но не все поведение.

Очень простым примером будут фигуры:

Вы можете иметь общий графический объект, который знает, как перемещать себя, но реализующие классы на самом деле будут рисовать себя.

(взято с сайта, на который я ссылался выше)

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() {
        ...
    }
}
21 голосов
/ 16 мая 2011

Если вы используете ключевое слово java abstract, вы не можете предоставить реализацию.

Иногда эта идея возникает из-за того, что он имеет опыт работы в C ++ и ошибочно принимает ключевое слово virtual в C ++ как "почти такое же", как ключевое слово abstract в Java.

В C ++ virtual указывает, что метод может быть переопределен и последует полиморфизм, но abstract в Java - это не то же самое. В Java abstract больше похож на метод pure virtual или метод, в котором реализация должна обеспечиваться подклассом. Поскольку Java поддерживает полиморфизм без необходимости его объявления, все методы virtual с точки зрения C ++. Поэтому, если вы хотите предоставить метод, который может быть переопределен, просто напишите его как «обычный» метод.

Теперь, чтобы защитить метод от переопределения, Java использует ключевое слово final в координации с объявлением метода, чтобы указать, что подклассы не могут переопределить метод.

4 голосов
/ 16 мая 2011

В сообщении об ошибке указывается точная причина: «абстрактные методы не могут иметь тела».

Они могут быть определены только в абстрактных классах и интерфейсах (методы интерфейса неявно абстрактны!), И идея заключается в том, чтоподкласс реализует метод.

Пример:

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