Java中的抽象方法

时间:2011-05-16 16:49:48

标签: java methods abstract

我想编写一个抽象方法,但编译器会持续发出此错误:

  

抽象方法不能有身体

我有这样的方法:

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

这里有什么问题?

3 个答案:

答案 0 :(得分:74)

抽象方法意味着没有默认实现,实现类将提供详细信息。

基本上,你会有

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

答案 1 :(得分:21)

如果使用java关键字abstract,则无法提供实现。

有时这个想法来自于拥有C ++背景,并将C ++中的virtual关键字误认为与Java中的abstract关键字“几乎相同”。

在C ++中virtual表示可以覆盖一个方法,并且将遵循多态,但Java中的abstract不是一回事。在Java中abstract更像是pure virtual方法,或者必须由子类提供实现的方法。由于Java支持多态而不需要声明它,因此从C ++的角度来看,所有方法都是virtual。因此,如果您想提供一个可能被覆盖的方法,只需将其写为“普通”方法。

现在为了保护方法不被覆盖,Java使用与方法声明协调的关键字final来指示子类不能覆盖该方法。

答案 2 :(得分:4)

错误消息告诉确切的原因:“抽象方法不能有正文”。

它们只能在抽象类和接口中定义(接口方法是隐式抽象的!),其思想是子类实现该方法。

示例:

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