根据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方法没有被重载(应该是这种情况)。
但是根据上下文,如果方法skip
为explicitly declared
,则可以abstract
。但是必须有一个实现该方法的类。接口中的方法是否隐式抽象?还是我错误地解释它? explicit abstract
让我感到困惑..请帮助..
答案 0 :(得分:1)
首先,如果您的类包含abstract
方法,则必须将其声明为abstract
。像这样:
abstract class Sphere
。其次,abstract
类无法实例化。可以认为abstract
类尚未完成且不完全可用。 interface
可以被认为是一个隐含abstract
和public
所有方法的类。它定义了行为而不是实现。
答案 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();
}
抽象类是部分实现的类,无法实例化,因为它们未完全实现。它们就像接口,但它们已经为某些方法定义了主体,但通常并不是全部(因为你宣称它是抽象的,所以没关系)。它的作用是允许你做一些工作,并由派生类完成其余的工作。这与派生类必须实现所有方法(有时可能很乏味)的接口不同。