1

为什么 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());
4

5 回答 5

4

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

但一个是通过创建String#length()一个属性,它可以在接口中声明(在这种情况下CharSequence)。接口不能声明公共实例字段。

于 2013-02-13T14:58:11.833 回答
1

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

public int length() {
    return count;
}

所以本质上count可以被调用length并公开为类似于数组(final毕竟)。

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

于 2013-02-13T15:01:20.670 回答
0

因为 String 不是这样的数组。Java 的设计者将数组(它们是对象)设计为有一个名为length.

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

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

于 2013-02-13T15:00:20.160 回答
0

没有特别的原因,我想。事实上,在 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.
于 2013-02-13T15:07:22.700 回答
0

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

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

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

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

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

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

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

资源: JSL 10.7

为什么 String.length() 是一个方法?

于 2013-02-13T15:08:17.210 回答