在java中的方法中使用关键字abstract

时间:2011-01-16 19:06:34

标签: java

根据The Java Programming Language(by Arnold Gosling)(参见第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方法没有被重载(应该是这种情况)。

但是根据上下文,如果方法skipexplicitly declared,则可以abstract。但是必须有一个实现该方法的类。接口中的方法是否隐式抽象?还是我错误地解释它? explicit abstract让我感到困惑..请帮助.. alt text

alt text

alt text

6 个答案:

答案 0 :(得分:1)

首先,如果您的类包含abstract方法,则必须将其声明为abstract。像这样: abstract class Sphere。其次,abstract类无法实例化。可以认为abstract类尚未完成且不完全可用。 interface可以被认为是一个隐含abstractpublic所有方法的类。它定义了行为而不是实现。

答案 1 :(得分:1)

摘自Java Language Specification

  

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

     

接口正文中的每个方法声明都是隐式公开的。

     

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

这本书一定是错的,或者至少引起了一个令人困惑的主张。

编辑:我唯一能想到的是你可以实现一个接口并保持方法抽象以将Javadoc添加到它。

interface Foo {
  void bar();
}

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

如果你实现了一个接口,你需要实现接口的方法或者将它们声明为abstract,这将使类成为抽象的。

答案 4 :(得分:0)

关键字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 is not abstract and does not override abstract method meth() in B
class A implements B { }
^
1 error

答案 5 :(得分:0)

有效地,抽象类是部分接口和/或所有接口都是抽象类。

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

完全相同
interface Sheet{
  public double computeArea();
  public double computePerimter();
} 

抽象类是部分实现的类,无法实例化,因为它们未完全实现。它们就像接口,但它们已经为某些方法定义了主体,但通常并不是全部(因为你宣称它是抽象的,所以没关系)。它的作用是允许你做一些工作,并由派生类完成其余的工作。这与派生类必须实现所有方法(有时可能很乏味)的接口不同。