Подтвердить что ты не робот

Абстрактные методы в Java

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Сообщение об ошибке указывает точную причину: "абстрактные методы не могут иметь тело".

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

Пример:

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