Java抽象方法

8
我在这里对 abstract 关键字有些困惑。我的编译器告诉我,我不能为一个抽象方法写方法体。然而,我的任务说明是:

抽象方法 orderDescription() 返回一个字符串,给出有关特定订单的详细信息。

abstract String orderDescription()
{
    return null;
}

然而,正如我之前提到的,我的代码返回了一个错误。因此,我的问题是,我该怎么做才能解决这个问题呢?

到目前为止,我只是删除了关键字“abstract”,然后它就可以正常工作了。

6个回答

22
abstract String orderDescription()
{
    return null;
}

应该是

abstract String orderDescription();

正如错误所述,您的抽象方法声明不应包含任何主体。

上述语法要求实现(无论哪个类扩展了抽象类并提供了实现)返回一个字符串。

您不能实例化抽象类,因此某些类需要扩展抽象类并为此抽象方法提供实现。

示例:

class MyabsClass 
{
  abstract String orderDescription();
}

class MyImplementation extends MyabsClass
{
   public String orderDescription()
    {
    return "This is description";
    }
}



 class MyClient
   {
     public static void main(String[] args)
      {
         MyImplementation imple = new MyImplementation();
         imple.orderDescription();
      }
   } 

我知道抽象方法不能有方法体。但是我需要返回一个字符串,如果没有方法体,我该如何返回呢? - Matthew Brzezinski
@user1327636:更新了答案并附上了理论。很快会提供一个例子。 - kosa
@user1327636,这个责任被委托给继承此抽象方法的子类,但是返回类型约束通过父类在语言中强制执行。 - mre
2
如果一个类包含抽象方法,那么这个类本身必须被声明为抽象类。MyabsClass 必须被定义为抽象类。 - Vivek

13

定义抽象方法时,您告诉编译器任何子类都必须提供实现或声明自身为抽象。

您需要在子类中实现抽象方法。

请记住,您不能创建抽象类的实例。抽象方法的整个目的是告诉编译器您希望子类提供功能。


这应该是答案。抽象类可以具有代码,但它不能被实例化。抽象类必须被子类化。 - Clocker

6

本质上,抽象函数不应包含任何细节,它是一个占位符函数,用于继承函数。如Nambari所述,您只需包括定义。

当您希望一组类都包含一个共同的函数,并且您希望每个子类定义该函数时,就会使用此方法。


4

抽象方法通常不应包含任何“真正”的代码,抽象方法应该由包含该方法的非抽象类重写。


0

此外,补充Nambari的示例,您可以这样做:

class MyabsClass 
{
  abstract String orderDescription();
}

 class MyClient
   {
     public static void main(String[] args)
      {
         MyabsClass mac = new MyabsClass(){
              public String orderDescription()
              {
                     return "This is description";
              }
         };
         mac.orderDescription();
      }
   }

也就是通过匿名类实现。


0

抽象方法不应该有任何方法体,它只允许方法声明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接