Java接口——为什么没有私有方法?

Java接口——为什么没有私有方法?,java,oop,Java,Oop,为什么接口上的方法总是公共的?为什么它们不能是私有的?因为接口上的所有方法都是公共的。这就是拥有接口的关键所在——从技术上讲,它为类定义了一个契约(可能有许多重叠的契约/接口)。类的客户端应该持有对接口的引用,并且只能通过接口访问类的已发布(公共)方法。我推断您引用的是一个声明如下的接口: public interface MyInter { public void myFunc(); } 如果在实现中省略了public限定符,则会产生错误: MyClass.java:3: myFu

为什么接口上的方法总是公共的?为什么它们不能是私有的?

因为接口上的所有方法都是公共的。这就是拥有接口的关键所在——从技术上讲,它为类定义了一个契约(可能有许多重叠的契约/接口)。类的客户端应该持有对接口的引用,并且只能通过接口访问类的已发布(公共)方法。

我推断您引用的是一个声明如下的接口:

public interface MyInter 
{
    public void myFunc();
}
如果在实现中省略了
public
限定符,则会产生错误:

MyClass.java:3: myFunc() in MyClass cannot implement myFunc() in MyInter; attempting to assign weaker access privileges; was public
    void myFunc(){}
         ^
假设您可以将
myFunc
设置为私有。您可以在不同的类中编写以下代码。这可能会抱怨您试图使用您无权访问的专用功能:

MyClass foo = new MyClass();
foo.myFunc(); // Declared private, can't call it.
但是这个呢:

void doSomething(MyInter foo)
{
    foo.myFunc(); // Declared public in interface, private in implementation.
}
我们可以这样做吗?根据界面,这是一个公共方法,所以我们应该很乐意去。但它是作为私有方法实现的,因此类希望它永远不会像这样从外部调用,这是一个应由编译器强制执行的限制。但是编译器甚至不需要知道
MyClass
就可以编译它。它甚至还不能被编写出来,或者在一个外部的库中,这个库可能被集成,也可能永远不会被集成

允许实现会在允许访问的规则中造成内部不一致,解决这种不一致的方法是完全不允许这种情况。任何可以在接口中调用方法的东西都必须能够在任何实现中调用它

同样的参数适用于重写子类方法。您不能通过使用限制性更强的限定符覆盖来“隐藏”它们

为什么会这样

因为JLS这么说:

在关于接口声明的一章中说:“接口主体中的每个方法声明都是隐式的
public

在关于类声明的一章中说:“重写或隐藏方法的访问修饰符(§6.6)必须提供至少与重写或隐藏方法相同的访问量,…”


工程师Dollery的回答解释了为什么语言是这样设计的。

因为私有函数/成员是不可继承的,我认为它也可以被保护。因为你不能减少继承成员的访问。我想添加的可能重复项@Kevin已将
public
添加到接口上的方法声明中,纯粹出于说明目的。由于它是默认的,也是您可以使用的唯一辅助功能修改器,因此它是多余的,通常不包括在内。