在java方法中使用关键字抽象

在java方法中使用关键字抽象,java,Java,根据(参考第275页),如果我们在接口中的方法声明之前显式地使用abstract,我们可以 跳过实现类中的方法 根据示例: interface Sheet{ public double computeArea(); public abstract double computePerimter(); } class Sphere implements Sheet{ // Some data members and constructors. public double compu

根据(参考第275页),如果我们在接口中的方法声明之前显式地使用
abstract
,我们可以

跳过实现类中的方法

根据示例:

interface Sheet{
  public double computeArea();
  public abstract double computePerimter();
} 

class Sphere implements Sheet{
  // Some data members and constructors.

public double computeArea() { ... }

  // No implementation of computePerimeter  
}
但是当我尝试创建Sphere类的对象时,我发现了一个错误,computePermeter方法没有被重载(应该是这样的)

但是根据上下文,如果方法已被显式声明为
抽象,则可以
跳过
。接口中的方法不是隐式抽象的吗??还是我解释错了??
明确的摘要
让我有点困惑。。请帮忙


首先,如果类包含
抽象方法,则必须将其声明为
抽象方法。这样地:

抽象类球体
。其次,
abstract
类不能实例化。将
abstract
类视为尚未完成且不完全可用。一个
接口
可以被认为是一个类,它隐式地拥有所有方法
抽象
公共
。它定义的是行为而不是实现。

据我所知,接口中定义的每个方法都是隐式的
抽象的
(和
公共的
)。但是,如果将实现类声明为
abstract
,则可以跳过在实现接口中定义的一个或多个方法的实现

abstract class Sphere implements Sheet {
 public double computeArea() {
    // do something
}

// skip computePerimeter():
// public double computerPerimeter();
}

如果实现接口,则需要实现接口的方法或将其声明为抽象的,这将使类抽象。

从:

接口主体中的每个方法声明都是隐式抽象的,因此它的主体总是用分号表示,而不是块

接口主体中的每个方法声明都是隐式公开的

为了与旧版本的Java平台兼容,允许但不鼓励为接口中声明的方法冗余指定抽象修饰符,这是一种风格

这本书肯定是错的,或者至少提出了一个令人困惑的说法

编辑:我能想到的唯一一件事是,您可以实现一个接口并保持方法的抽象性,以便向其中添加Javadoc

interface Foo {
  void bar();
}

abstract class FooImpl implements Foo {
  /**
   * I want to put documentation here without implementing the method.
   */
  abstract void bar();
}

但是这对代码的行为没有任何影响。

关键字
abstract
没有区别。规范中唯一说明的是:

为了与旧版本的Java平台兼容,允许但不鼓励为接口中声明的方法冗余指定抽象修饰符,这是一种风格

快速测试表明,关键字确实没有什么区别。这两项都是有效的:

abstract class A implements B { }
interface B {
    public void meth();
}

abstract class A implements B { }
interface B {
    public abstract void meth();
}
这两个都是无效的:

class A implements B { }
interface B {
    public void meth();
}

class A implements B { }
interface B {
    public abstract void meth();
}
A.java:1:A不是抽象的,并且不重写B中的抽象方法meth() 类实现B{} ^ 1错误
实际上,抽象类是部分接口和/或所有接口都是抽象类

interface Sheet{
  public double computeArea();
  public abstract double computePerimter();
} 
完全一样

interface Sheet{
  public double computeArea();
  public double computePerimter();
} 

抽象类是部分实现的类,由于没有完全实现,因此无法实例化。它们类似于接口,但它们定义了一些方法的主体,但通常不是全部(这并不重要,因为您将其声明为抽象)。它所做的是允许您完成部分工作,其余工作由派生类完成。这与派生类必须实现所有方法的接口不同(有时可能很乏味)

是的,在接口定义中,
public
abstract
都是不必要的,因为它们是隐式的。是的,同意,这是我过去一直相信的。。但是gosling中给出的示例显示了类Sphere(抽象类),因为Sphere表示一个物理实体,所以我们应该能够实例化它。我认为我不够了解2只小鹅。。这就是问题所在。@smartmuki-IMHO,这个例子只是让人困惑。呃。。我可以粘贴“受版权保护的材料”吗??
interface Sheet{
  public double computeArea();
  public double computePerimter();
}