5

我在Java中有以下界面

public interface IFoo
{
    public abstract void foo();
    public void bar();
}

foo() 和 bar() 有什么区别?什么时候应该使用摘要?

除非我遗漏了一些微妙的东西,否则两者似乎都能完成我想要的事情?

更新为什么要将 Java 接口方法声明为抽象的重复项?

4

10 回答 10

18

没有任何功能差异。java 接口中没有提供任何实现,因此所有方法声明都是隐式抽象的。

参见[1]:http: //java.sun.com/docs/books/tutorial/java/IandI/abstract.html

以上直接报价:

注意:接口中的所有方法(请参阅接口部分)都是隐式抽象的,因此 abstract 修饰符不与接口方法一起使用(可能是——只是没有必要)。

于 2009-09-29T12:58:42.260 回答
17

接口方法都是默认的publicabstractand之间没有区别foo()bar()您可以安全地删除所有publicandabstract关键字。

于 2009-09-29T12:57:51.030 回答
5

你没有错过任何东西。来自Java 语言规范

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

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

换句话说,您可以省略接口方法public以及on 方法。abstract

于 2009-09-29T12:59:52.537 回答
4

它是多余的(两个声明之间没有区别)并且在 Java 语言规范的第 9.4 节中明确不鼓励:

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

并且public同样是不必要和不鼓励的:

允许,但强烈建议不要为接口方法冗余地指定 public 修饰符。

我不知道为什么public强烈气馁,但abstract只是气馁......

于 2009-09-29T13:00:05.767 回答
3

两者的作用相同,因为接口中的所有方法都是抽象的。

于 2009-09-29T12:57:08.893 回答
2

abstract在这种情况下是不必要的(就像将接口中的方法标记为一样public)。

相反,您将在抽象类中的方法上使用它,以强制其被子类覆盖。

于 2009-09-29T12:57:06.583 回答
2

声明之间没有区别。从概念上讲,接口中的所有方法都是抽象的。

于 2009-09-29T12:57:48.973 回答
2

没有什么不同的。java接口中的所有方法总是抽象的。

请参阅此链接的第一个注释:http: //java.sun.com/docs/books/tutorial/java/IandI/abstract.html

于 2009-09-29T12:58:59.607 回答
0

foo() 和 bar() 都是抽象的,因为它们是在接口中声明的。您在这里使用的抽象词没有意义-您最好将其删除。

于 2009-09-29T13:19:54.457 回答
0

java中的接口“不知何故”等同于完全抽象的类,因此在接口中的方法声明中添加“abstract”关键字与方法无关!

于 2009-09-29T20:27:24.593 回答