为什么在Java范围内接口和抽象类的函数是不同的

为什么在Java范围内接口和抽象类的函数是不同的,java,Java,在Java中: 接口中声明的函数的范围是严格公开的吗? 鉴于 抽象类中声明的函数的作用域可以是默认的、受保护的或公共的 我们知道,两者提供相同的问题描述(根据我上面的问题) i、 e.继承它的具体类必须定义函数 那么,为什么两者都有不同的规则呢?因为根据定义,接口是公共接口。在接口上定义非public方法(!)是没有意义的 在抽象类上定义私有方法非常有意义。接口定义类的外部接口,因此是公共接口。当您使用一个接口时,您不需要知道任何关于如何在内部完成事情的信息 另一个抽象类只是说明缺少什么才能使实

在Java中: 接口中声明的函数的范围是严格公开的吗? 鉴于 抽象类中声明的函数的作用域可以是默认的、受保护的或公共的

我们知道,两者提供相同的问题描述(根据我上面的问题) i、 e.继承它的具体类必须定义函数


那么,为什么两者都有不同的规则呢?

因为根据定义,接口是公共接口。在接口上定义非
public
方法(!)是没有意义的


抽象
类上定义
私有
方法非常有意义。

接口定义类的外部接口,因此是公共接口。当您使用一个接口时,您不需要知道任何关于如何在内部完成事情的信息

另一个抽象类只是说明缺少什么才能使实现正常工作。例如,一个非常常见的模式是:

abstract class x {

   public void SomeTask() {
        // ...
        doSomeTask();
   }

   protected abstract void doSomeTask();
}

接口指定如何与类型交互。因此,所有内容都必须是公共的,因为它必须能够从实现它的类外部访问。
但是,抽象类可以包含受保护的、私有的或公共的,因为它可以有实现。它可以调用自己的受保护方法,该方法将由一个子类实现。

在抽象类中定义的方法可以在同一个类中执行。接口不执行任何代码,所以创建受保护方法的私有方法毫无意义。接口应该是公共的,它们是实现的API。

首先,您所说的是“访问”而不是“范围”。正确使用术语很重要。作用域在Java中有不同的含义

一个
抽象类
实际上就像一个正常的
,具有正常的实现细节(状态变量和代码)。。。除了一些实施被遗漏;i、 e.
摘要
方法。因此,您自然需要完整的类语言功能

(Java 8之前的)
接口
是不同的1。现在没有状态也没有代码,只有任何实现
都必须履行的“契约”

现在,这还不能完全解决这个问题,但对于其余的问题,我建议您参考这个问答--它询问您为什么不能在
界面中使用
受保护的
。正如你所见,没有一个令人信服的答案。相反,提出了多种答案,每种答案都可能在较小或较大程度上有效。获得真正答案的唯一方法是询问James Gosling等人。最终,这是Java语言早期做出的设计选择

那么,为什么两者都有不同的规则呢

因为这两种构造的目的都不同


1-使用Java8,我们现在可以在
接口
中声明
默认
方法。换句话说,
接口
中现在可能有代码,尽管这些代码对于实现该接口的所有类来说都是通用的