【问题标题】:Why is string.length() a method, and int[].length a property? [duplicate]为什么 string.length() 是一个方法,而 int[].length 是一个属性? [复制]
【发布时间】:2013-02-13 14:55:17
【问题描述】:

为什么 String.length() 是一个方法,而 int[].length 是一个属性(见下文)?

int[] nums = {2,4,7,12,43};
String phrase = "Hello, world.";

System.out.length(nums.length);
System.out.length(phrase.length());

【问题讨论】:

  • 投票最多的答案是“重复”并不是特别有用。

标签: java arrays string integer


【解决方案1】:

我认为不一定有充分的理由,而且我认为可能有很多原因。

但其中之一是通过将String#length() 设为属性,可以改为在接口中声明它(在本例中为CharSequence)。接口不能声明公共实例字段。

【讨论】:

  • 好点。但我认为CharSequence 是在 JDK 1.4 中添加的。但是,String.length() 甚至在此之前就已经存在,因此无法确定原始设计的意图。
【解决方案2】:

这是String::length() 函数的样子:

public int length() {
    return count;
}

所以基本上count 可以被称为length 并公开为类似于数组(毕竟是final)。

这可能只是一个设计决定。可能有一些我们可以推测的促成因素(其中之一可能是 Mark Peters 提到的 CharSequence 事情)。

【讨论】:

    【解决方案3】:

    因为 String 本身不是一个数组。 Java 的设计者将数组(即对象)设计为有一个名为length 的公共字段。

    另一方面,String 有一个方法可以代替它给出长度。一般来说,将成员字段设为私有并使用方法访问它们是一种更传统的方法,但在数组的情况下则不然。

    就您而言,它们是具有不同签名的不同对象。 String 不是 char[](尽管在内部它可能以这种方式实现)。

    【讨论】:

      【解决方案4】:

      我想没有什么特别的原因。事实上,在 C# 这种非常相似的语言中,String.length 是一个属性http://msdn.microsoft.com/en-us/library/system.string.length.aspx。但是看看 C# 设计师对这个设计的看法:

      The Length property returns the number of Char objects in this instance, not the number of Unicode characters.
      The reason is that a Unicode character might be represented by more than one Char. Use the 
      System.Globalization.StringInfo class to work with each Unicode character instead of each Char.
      

      【讨论】:

      • C# 中的属性相当于 Java 中带有 getter 的私有字段。这里的问题是为什么 Java 没有简单地将 length 设为公共 final 字段。
      • @CyrilleKarmann 我认为这是一个公共领域。看看MSDN例子Console.WriteLine(characters.Length);
      【解决方案5】:

      为什么是 int[].length 属性?

      数组是java中的特殊对象,它们有一个名为length的简单属性,它是final。

      数组没有“类定义”(在任何 .class 文件中都找不到),它们是语言本身的一部分。

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

      2. 公共方法clone,覆盖Object类中的同名方法,不抛出检查异常。数组类型T[]的clone方法的返回类型是T[]。

      3. 多维数组的克隆是浅的,也就是说它只创建一个新数组。子数组是共享的。

      4. 继承自类Object的所有成员; Object 唯一不被继承的方法是它的 clone 方法。

      资源:JSL 10.7

      Why String.length() a method?

      【讨论】:

        猜你喜欢
        • 2010-09-05
        • 2018-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        相关资源
        最近更新 更多