我正在随便浏览 Java 核心类的源代码。我发现该Process.java
文件是一个public abstract
类。当我浏览代码时,没有函数有定义。这是否意味着它应该被宣布为Interface
. 这背后有什么故意的原因吗。有人可以帮助我理解这种设计的需要吗?
链接到代码
我正在随便浏览 Java 核心类的源代码。我发现该Process.java
文件是一个public abstract
类。当我浏览代码时,没有函数有定义。这是否意味着它应该被宣布为Interface
. 这背后有什么故意的原因吗。有人可以帮助我理解这种设计的需要吗?
链接到代码
Process
是抽象的,因为它可能在每个操作系统上都有不同的实现。应用程序开发人员不实现这个抽象类;它是作为 Java 运行时的一部分实现的。
由于所有方法都是抽象的,因此可以将其声明为接口,但这会使该类在未来无法发展。例如,一旦在公共 API 中声明了新方法,就不应将其添加到接口中,因为这样任何现有的实现都将不兼容。相反,一个新的(具体的)方法可以很容易地添加到抽象类中。
的实例Process
由运行时创建,通过Runtime
类方法或从ProcessBuilder
实例创建。应用程序通常不会使用new
运算符直接创建(具体子类的)实例。
我怀疑关键的区别在于您可以随心所欲implement
地使用多个interface
s 但您只能使用extend
一个 class
s ,无论是抽象的还是其他的。
因此,抽象Process
化可以确保如果您实际上决定从头开始创建一个(即不是从系统提供的工厂,这是正常的路线),您将无法将功能放在它的父类中。我不确定这有什么帮助。
也许这是一个安全问题,因为进程应该由操作系统创建和拥有。最好是阻止您自己制作它们。
添加
在内心深处,我认为它不是界面的原因是历史性的。请记住,自 dotProcess
年以来一直存在,java.lang
那时接口是您实现的东西,而不是对象个性方面的定义。这个概念是在很久以后才发展起来的。
请注意,Process
自 JDK 1.0 以来就已经存在,而许多更有用的接口在很久以后CharSequence
才出现,例如,该接口直到 JDK 1.4 才出现。我认为有一个范式转变,从对象是主要的,接口是真正有用的,接口是全部,而对象只是实现。
Process
因此将是在 a是真实对象并且可能驾驶奥迪 Quattro时创建的旧类之一,而不是一些模糊的概念 namby-pamby miasmic 东西,其中包含一些方法并且看起来有点像这样。Process
该类Process
显然确实具有我们看不到的内部功能,并且出于显而易见的原因,这必须依赖于操作系统。
我的猜测是,他们不希望您实现自己的符合 API 的类,这些类不继承 Java 库定义的 Process 类的隐藏功能。
根据 的文档java.lang.Process
,该类提供了一个可以不带参数调用的构造函数。接口无法做到这一点。