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

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

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

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

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

【问题讨论】:

标签: java arrays methods


【解决方案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】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2016-04-30
    • 2011-10-27
    相关资源
    最近更新 更多