Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的抽象方法_Java_Methods_Abstract - Fatal编程技术网

Java中的抽象方法

Java中的抽象方法,java,methods,abstract,Java,Methods,Abstract,我想编写一个抽象方法,但编译器始终给出以下错误: 抽象方法不能有主体 我有这样一种方法: public abstract boolean isChanged() { return smt else... } 这里出了什么问题?抽象方法意味着它没有默认的实现,实现类将提供详细信息 基本上,你会 abstract class AbstractObject { public abstract void method(); } class ImplementingObject exte

我想编写一个抽象方法,但编译器始终给出以下错误:

抽象方法不能有主体

我有这样一种方法:

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

这里出了什么问题?

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

基本上,你会

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

class ImplementingObject extends AbstractObject {
  public void method() {
    doSomething();
  }
}
因此,这正是错误所说的:抽象方法不能有主体

Oracle网站上有完整的教程,网址为:

这样做的原因是如果多个对象可以共享某些行为,但不是所有行为

一个非常简单的例子是形状:

您可以有一个通用图形对象,它知道如何重新定位自身,但实现类实际上会自己绘制

(这是从我上面链接的站点中获取的)


错误消息告诉了确切的原因:“抽象方法不能有主体”

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

例如:

 public abstract class AbstractGreeter {
   public abstract String getHelloMessage();

   public void sayHello() {
     System.out.println(getHelloMessage());
   }
 }


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

有时候这个想法来自C++背景,在C++中错误地把代码>虚拟关键字作为与java中的抽象> /Cux>关键字几乎相同的。 <> > C++ >代码>虚拟指示可以重写一个方法,多态性会遵循,但是抽象<代码>不是一回事。在Java中,abstract更像是一个
纯虚拟的
方法,或者一个必须由子类提供实现的方法。由于java支持多态性而不需要声明它,所以C++的所有方法都是<代码>虚拟<代码>。因此,如果您想提供一个可能被重写的方法,只需将其作为“普通”方法编写即可


现在,为了防止方法被重写,Java使用关键字
final
与方法声明相协调,以指示子类不能重写该方法。

编译器会准确地告诉您错误所在。它是持久的,因为您试图编译无效代码。出于兴趣,如果你给一个方法提供了一个主体,你认为如何使它抽象?通过声明方法
abstract
,你想实现什么?@jon@ted,我有一个抽象类,我想在这个类中编写一个抽象方法。好的。在Java中,抽象方法永远不能有一个C++的透视图,就像是<代码>公有:虚拟BoL ISchange()= 0 {返回SMT…} /java >,这是合法的。代码>摘要类似于
=0
位。很好地解释了为什么他可能会感到困惑,
 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";
   }
 }