为啥 .length() 不是 Java 中数组的方法? [复制]

Posted

技术标签:

【中文标题】为啥 .length() 不是 Java 中数组的方法? [复制]【英文标题】:Why isn't .length() a method for arrays in Java? [duplicate]为什么 .length() 不是 Java 中数组的方法? [复制] 【发布时间】:2013-01-11 07:12:24 【问题描述】:

可能重复:Java - Array’s length propertyString.length() vs Array.length

我目前正在上高中的 AP 计算机科学课,我在阅读中发现了这一点。

据我了解,.length() 是一种用于字符串的方法,但为什么.length() 不是一种应用于数组的方法?我知道它们是不同的对象,但为什么 Java 不只是另一种方法来查找数组的长度?

感谢我收到的任何回复。谢谢!

【问题讨论】:

String.length() vs Array.length 的可能副本,也可能是 ***.com/questions/8720220/… length 是数组的成员。关于为什么它是成员而不是方法(这种情况下你必须将其称为length()),我将留给其他人回答。 (这是一个骗子,但我不会花时间寻找前面的几个问题。)就是这样。当时,将length 设置为伪字段而不是伪方法似乎是有意义的。 相关:***.com/questions/9297899/java-arrays-length-property 抱歉受骗,但我感谢您的回答! 【参考方案1】:

由于数组是在实例化时定义的固定长度,因此长度是类上的公共最终字段。无需将其设为方法,因为在运行时无需进行计算。

有关详细信息,请参阅 Java 规范的这一部分: http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.7

现在,关于为什么他们没有提供获取值的访问器方法的设计问题没有指定。也许这是在设置任何其他约定之前完成的,这只是一个遗留问题。只有语言设计者才会知道他们决定这样做的“原因”部分。

【讨论】:

String 也可以这样说。【参考方案2】:

数组在Java Language Specification #10.7 中定义。特别是:

数组类型的成员都有以下几种:

公共最终字段长度,其中包含数组的组件数。长度可以是正数或零。 [...]

我无法回答为什么语言设计者会选择这种方法。

有趣的是,the Oak specifications 中已经是这种情况,即the ancestor of Java。

【讨论】:

@HotLicks:这可能会干扰子类化。毕竟,它需要在运行时(像方法一样)被分派给实际的(而不是声明的)类。 在底层,获取数组的长度“字段”实际上是使用 'arraylength' 字节码指令。对于 getClass(),这是一个实际的虚方法调用。 @Thilo - 为什么它会干扰子类化?该类是 Object 中的 final 字段。 @Thilo super.getClass() 将返回相同的 Class,因为 getClass() 返回运行时类型。但我认为你很困惑 - getClass 是最终的,不会被覆盖。 @HotLicks 和 Paul:好吧,我很困惑。但问题仍然是 .class 数据成员会与已经存在的静态 .class 冲突(如String.class)。【参考方案3】:

我怀疑这是否有充分的技术原因。

我怀疑这是那些没有及早发现并在不破坏大量代码的情况下修复的小不一致之一。

【讨论】:

以上是关于为啥 .length() 不是 Java 中数组的方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java中为啥有些变量后面有.length,是啥意思?

在JAVA中 string的长度为啥是length方法 而不是length 属性

java为啥删除数组元素时只能删第一行,其它都显示找不到,但是打印的话全部都可以出来

为啥我应该在循环中使用 foreach 而不是 for (int i=0; i<length; i++) ?

JAVA中length()可以获得字符串和数组的长度对不对

一个for循环为啥能够把这个数组的每个值输出