关于java:我们为什么要将接口方法声明为public?

Why should we declare interface methods as public?

本问题已经有最佳答案,请猛点这里访问。

当我实现一个interface方法时,我被迫使它成为public方法。

我们可能需要使用defaultprotected

有人能解释这个限制背后的原因吗?


接口是用来定义一个类型的公共API的,并且仅此而已,而不是它的实现。因此,您在接口中定义的任何方法(或静态成员)都是通过定义public定义的。

由于接口不能包含任何具体的实现,因此无法从内部调用任何成员方法。声明这样的方法,但将调用留给子类或完全不相关的客户机,这意味着您的类型定义是不完整和脆弱的。这就是为什么如果需要定义受保护或包访问成员,可以在抽象类(也可能包含实现)中这样做。


也许这会提供一些答案。

据我所知,您使用interfaces允许来自代码外部的人员与您的代码交互。为此,您需要定义方法public

如果您希望强制某人重写一组给定的私有方法,那么您可能希望用一系列抽象保护方法声明一个抽象类。


接口是一个约定,实现它的类将在接口中具有方法。该接口用于向程序的其余部分显示该类具有方法,并且可以调用这些方法。


编辑:此答案适用于C接口实现。在这种情况下,Java语法类似于语法分析器需要在接口中提到的公共关键字,这在C语言中是隐式的。

接口方法在C中是隐式公共的,因为接口是一个约定,用于其他类。此外,在实现接口时,必须将这些方法声明为公共方法,而不是静态方法。

1
2
3
4
5
interface IStorable
{
     void Read( );
     void Write(object obj);
}

注意,Read( )Write( )IStorable方法声明不包括访问修饰符(publicprotected)。实际上,提供访问修饰符会生成编译错误。

1
2
3
4
5
6
7
8
9
10
11
class Document : IStorable
{
     public void Read( )
     {
         //
     }
     public void Write(object obj)
     {
         //
     }
}

只需将接口视为要作为public实现的契约。


  • 如果我们将接口方法标记为私有,则实现类将不会查看方法并不能覆盖它。

  • 如果我们将接口方法标记为受保护的实现类除非方法与接口。

  • 如果我们标记一个没有任何访问修饰符的接口方法,实现类除非在同一个方法中,否则将看不到该方法包作为接口