在Java中: 在Interface中声明的函数的范围是严格公开的? 然而, 在Abstract类中声明的函数的范围可以是default,protected或public !!!
我们知道两者都提供相同的问题描述(根据我上面的问题) 即继承它的Concrete类必须定义函数。
那么,为什么两者都有不同的规则?
答案 0 :(得分:2)
首先,你所说的是“访问”而不是“范围”。使术语正确非常重要。 Scope在Java中具有不同的含义。
abstract class
实际上就像普通的class
一样,具有正常的实现细节(状态变量和代码)......除了省略了一些实现;即abstract
方法。很自然地,你想要完整的课堂语言功能。
A(pre-Java 8)interface
与 1 不同。现在没有州和没有代码,只有任何实施class
必须履行的“合同”。
现在这并没有完全解决这个问题,但对于其他问题,我建议你参考这个Q& A - Protected in Interfaces - 这就是为什么你不能在{{protected
中使用interface
1}}。如您所见,没有一个令人信服的答案。相反,有多个答案建议,其中每个可能在更小或更大程度上有效。获得真实答案的唯一方法是询问James Gosling等人。最终,它是Java语言生命早期的设计选择。
那么,为什么两者都有不同的规则?
因为两个结构中每一个的目的都不同。
1 - 使用Java 8,我们现在可以在default
中声明interface
个方法。换句话说,现在可以在interface
中存在代码,尽管代码对于实现该接口的所有类都是通用的。
答案 1 :(得分:1)
接口定义了类的外部接口,因此是公共接口。当您使用界面时,您无需了解内部如何完成任务。
另一个抽象类只是说明了工作实现所缺少的内容。例如,一个非常常见的模式是:
abstract class x {
public void SomeTask() {
// ...
doSomeTask();
}
protected abstract void doSomeTask();
}
答案 2 :(得分:0)
因为根据定义,接口是 public 接口。在接口上定义非public
方法(!)是没有意义的。
在private
类上定义abstract
方法非常有意义。
答案 3 :(得分:0)
接口指定如何与类型进行交互。因此,一切都必须是公开的,因为它必须都可以从实现它的类外部访问。 但是,抽象类可以包含protected,private或public,因为它可以具有实现。它可以调用自己的受保护方法,该方法将由子类实现。
答案 4 :(得分:0)
抽象类中定义的方法可以在同一个类中执行。接口不执行任何代码,因此创建受保护方法的私有没有意义。接口是公开的,它们是实现的API。