为什么在Java范围内的Interface和Abstract类的功能是不同的

时间:2016-04-18 10:28:21

标签: java

在Java中: 在Interface中声明的函数的范围是严格公开的? 然而, 在Abstract类中声明的函数的范围可以是default,protected或public !!!

我们知道两者都提供相同的问题描述(根据我上面的问题) 即继承它的Concrete类必须定义函数。

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

5 个答案:

答案 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。