java中String [] args背后的逻辑是什么?
我理解它的用途,但是当他们设计 java 时为什么不允许主运行没有String [] args(如果我作为程序员,不需要数组)?这个决定背后有什么逻辑吗?
回答
实际上,除非您的名字是 James Gosling,否则这个问题根本无法回答,而且我认为他在 SO 上并不是特别活跃。
不,它没有“逻辑”,它就是这样。主要必须采取某种形式。具体来说:
- Java 不是结构类型的。即使我有
interface Camera {void shoot(Person p); }as wellinterface Gun {void shoot(Person p);},即使相机的结构和枪的结构相同(它们都有一个shoot(Person)方法),您也不能只是对待甚至将相机投射到枪上,反之亦然- java 是名义上的。结构无所谓。
除了 main,这都是关于结构的。与自己不谋而合。没有真正的逻辑。
- 使用字符串数组本身很奇怪;数组,尤其是非原始类型的数组,最好为奇怪的黑客和核心库保留。它们不能增长或缩小,它们不是一成不变的,也不能成为不可变的(零长度数组除外),它们的 toString impl 几乎没用,它们的 hashCode/equals impls 不符合您的要求。
List<String>会更有意义。
但是.. 为什么????
简单的:
-
List不在 java 1.0 中。有,java.util.Vector但这绝对被视为一个螺栓固定的东西。泛型肯定不在身边。 - 使用结构方面的想法:有一个名为 main 的静态方法,它接受一个字符串数组 - 是 C 的直接副本。很多奇怪的 java 东西(例如
switch.对吗?)有解释:...因为它看起来对 C 程序员来说很熟悉。在今天看来,Java确实不合时宜和愚蠢,确实削弱了 C 的统治地位,没有其他语言真正做到这一点(像 Python 这样的一群人比 Java 更古老并且也很流行,但是直到后来比较 Python 才流行起来到 java 流行的时候。不过,您可以提出一个论点,即 Perl 和 PHP 确实有点像 C 的方式)。
在“现代”Java 中,你会得到类似的东西:
public class Main extends Application {
@Override public void run (Args args) { ... }
}
规则是这样的东西必须有一个公共的无参数构造函数。
鉴于 java 以这种方式开始,它不会改变,以保持向后兼容性。尝试以这种方式重新设计事物还不够重要,至少 OpenJDK 团队似乎并不这么认为。