java - 为什么我们在 Java 中初始化数组对象时不必提供括号?
问题描述
我现在正在从头开始学习 Java,我发现有趣的一件事是大多数更复杂的数据结构必须以这种方式创建:
ArrayList<String> list = new ArrayList<String>();
另一方面,可以通过键入简单地初始化字符串
String[] str_array = new String[10];
为什么在初始化数组时不需要提供通常与调用构造函数相关的括号?这只是一种风格选择吗?如果对 JVM 有更好理解的人可以提供一些见解来满足我的好奇心,那就太棒了。
解决方案
对象创建和数组创建的区别在于:
- 普通类具有被调用的构造函数。
- 中的括号
new ArrayList<String>()
表示构造函数调用。 - 即使构造函数没有参数,括号仍然必须存在(与没有参数的方法调用相同)。
- 中的括号
- 另一方面,数组类没有构造函数
- 尽管数组是对象,但它们的类是由 JVM 创建的,因此需要进行其他类无法进行的特殊处理
- 初始化数组是
anewarray
,multianewarray
和newarray
字节码指令的副作用。
数组类没有构造函数可以通过执行来证明
System.out.println(int[].class.getConstructors().length);
返回 0。
最后,这归结为语言设计者在 20 多年前做出的决定,这些决定受到其他现有语言(如 C++)的设计决定的影响。
推荐阅读
- c++ - 减少模板参数的数量
- jquery - 一页上的多个阅读更多(省略号)显示全部而不是单独显示每个部分
- java - Spring:带有 Jpa 和 Kafka 的 ChainedKafkaTransactionManager 不是原子的?
- java - 如何使用 JPA 创建 ENUM 数组列?
- c++ - 我是否总是必须使用 unique_ptr 来表达所有权?
- shell - 如何使用 shell 命令或 wget 从网页下载 .tgz 文件?
- android - 将base64字符串转换为pdf
- bash - 在 Scons 中将“-W1,-rpath=\$ORIGIN”替换为“-W1,-rpath,\$ORIGIN”
- javascript - Angularjs - 模态对话框显示在默认页面中
- google-sheets - 在 if/query 数据上使用求和公式有问题吗?