Я хочу написать абстрактный метод, но компилятор постоянно дает эту ошибку:
абстрактные методы не могут иметь тело
У меня есть такой способ:
public abstract boolean isChanged() {
return smt else...
}
Что здесь не так?
Я хочу написать абстрактный метод, но компилятор постоянно дает эту ошибку:
абстрактные методы не могут иметь тело
У меня есть такой способ:
public abstract boolean isChanged() {
return smt else...
}
Что здесь не так?
Абстрактные методы означают, что для него нет реализации по умолчанию, а класс реализации предоставит детали.
По существу, у вас будет
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() {
...
}
}
Если вы используете ключевое слово java abstract
, вы не можете обеспечить реализацию.
Иногда эта идея возникает из-за наличия фона на С++ и ошибочного использования ключевого слова virtual
в С++ как "почти то же самое", что и ключевое слово abstract
в Java.
В С++ virtual
указано, что метод может быть переопределен, а полиморфизм будет следовать, но abstract
в Java - это не одно и то же. В Java abstract
больше похож на метод pure virtual
или тот, где реализация должна предоставляться подклассом. Поскольку Java поддерживает полиморфизм без необходимости его объявления, все методы virtual
с точки зрения С++. Поэтому, если вы хотите предоставить метод, который может быть переопределен, просто напишите его как "обычный" метод.
Теперь, чтобы защитить метод от переопределения, Java использует ключевое слово final
в координации с объявлением метода, чтобы указать, что подклассы не могут переопределить метод.
Сообщение об ошибке указывает точную причину: "абстрактные методы не могут иметь тело".
Они могут быть определены только в абстрактных классах и интерфейсах (методы интерфейса неявно абстрактны!), и идея состоит в том, что подкласс реализует метод.
Пример:
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";
}
}