13

我正在随便浏览 Java 核心类的源代码。我发现该Process.java文件是一个public abstract类。当我浏览代码时,没有函数有定义。这是否意味着它应该被宣布为Interface. 这背后有什么故意的原因吗。有人可以帮助我理解这种设计的需要吗?

链接到代码

4

4 回答 4

3

Process是抽象的,因为它可能在每个操作系统上都有不同的实现。应用程序开发人员不实现这个抽象类;它是作为 Java 运行时的一部分实现的。

由于所有方法都是抽象的,因此可以将其声明为接口,但这会使该类在未来无法发展。例如,一旦在公共 API 中声明了新方法,就不应将其添加到接口中,因为这样任何现有的实现都将不兼容。相反,一个新的(具体的)方法可以很容易地添加到抽象类中。

的实例Process由运行时创建,通过Runtime类方法或从ProcessBuilder实例创建。应用程序通常不会使用new运算符直接创建(具体子类的)实例。

于 2013-04-22T16:04:40.177 回答
2

我怀疑关键的区别在于您可以随心所欲implement地使用多个interfaces 但您只能使用extend 一个 classs ,无论是抽象的还是其他的。

因此,抽象Process化可以确保如果您实际上决定从头开始创建一个(即不是从系统提供的工厂,这是正常的路线),您将无法将功能放在它的父类中。我不确定这有什么帮助。

也许这是一个安全问题,因为进程应该由操作系统创建和拥有。最好是阻止您自己制作它们。

添加

在内心深处,我认为它不是界面的原因是历史性的。请记住,自 dotProcess年以来一直存在,java.lang那时接口是您实现的东西,而不是对象个性方面的定义。这个概念是在很久以后才发展起来的。

请注意,Process自 JDK 1.0 以来就已经存在,而许多更有用的接口在很久以后CharSequence才出现,例如,该接口直到 JDK 1.4 才出现。我认为有一个范式转变,从对象是主要的,接口是真正有用的,接口是全部,而对象只是实现。

Process因此将是在 a是真实对象并且可能驾驶奥迪 Quattro时创建的类之一,而不是一些模糊的概念 namby-pamby miasmic 东西,其中包含一些方法并且看起来有点像这样。Process

于 2013-04-22T16:03:48.050 回答
1

该类Process 显然确实具有我们看不到的内部功能,并且出于显而易见的原因,这必须依赖于操作系统。

我的猜测是,他们不希望您实现自己的符合 API 的类,这些类不继承 Java 库定义的 Process 类的隐藏功能。

于 2013-04-22T16:31:51.863 回答
0

根据 的文档java.lang.Process,该类提供了一个可以不带参数调用的构造函数。接口无法做到这一点。

于 2013-04-22T15:50:11.657 回答