如您所知,在java界面中,所有方法都必须定义为抽象。但是当我将方法定义为不键入abstract
时,编译器说它没关系。我知道抽象方法不能有一个体。接口中的某个方法是否必须具有名称abstract
? :我的意思是,有什么区别:
public interface blabla {
public void aMethod();
//or
public abstract void aMethod();
}
答案 0 :(得分:7)
不,将接口方法标记为abstract
没有任何意义,也绝不需要。
所有接口方法都是隐式abstract
(而public
也是btw)。
来自JLS:
接口主体中的每个方法声明都是隐式抽象,因此它的主体始终用分号表示,而不是块。
界面正文中的每个方法声明都是隐式公开。
为了与旧版本的Java平台兼容,允许但不鼓励,但为了风格,不要为接口中声明的方法冗余地指定抽象修饰符。
允许,但强烈建议不要在样式方面为冗余指定接口方法的公共修饰符。
相关问题(+回答时有一条陈述的历史参考说明曾经需要 abstract
:
答案 1 :(得分:2)
请参阅下面的示例示例
interface xyz
{
void methodA();
}
将此保存到xyz.java
现在使用 javac 工具
进行编译然后使用给定的命令belo
javap xyz
输出将是
Compiled from "xyz.java"
interface xyz {
public abstract void methodA();
}
这意味着当您编译接口时,编译器默认将其签名设置为 public 和 abstract 。
因此,没有必要对任何接口方法使用 abstract 关键字。
答案 2 :(得分:0)
我不知道他们必须被定义为抽象。可能是因为他们没有。请参阅Oracle's tutorial。
答案 3 :(得分:0)
接口的方法不必明确定义为抽象,因为它们是Java Language Specification §9.4中定义的隐式abstract
和public
。冗余声明完全合法。
答案 4 :(得分:0)
你不需要指定abstract
(默认),因为在接口中它没有意义,因为接口的所有方法都需要实现
答案 5 :(得分:0)
根据定义,接口中的所有方法都是抽象的。
您无法从界面中创建对象(例如,使用Interface i = new Interface();
),因此将方法标记为抽象与否之间没有区别。
任何实现接口的类都需要决定是实现它还是让子类来实现它。因此,就接口而言,默认情况下所有方法都是抽象的。
答案 6 :(得分:0)
抽象方法不提供任何实现。具有抽象方法的类必然是抽象的,这意味着您无法创建此类的实例。要创建该类的实例,您需要为抽象方法创建子类并提供非抽象覆盖。
接口永远不会提供其方法的实现,也无法实例化。因此,接口的每个方法都是按定义抽象的。在接口中声明方法时,不需要提供关键字abstract
。按照惯例,关键字abstract
不在界面中使用。
答案 7 :(得分:0)
如果忘记在interface方法之前放置abstract关键字,Java会隐式地将public abstract关键字放在它之前。因为所有接口方法都必须是抽象的。