关于java:为什么string.length()是方法,而int []。length是属性?

Why is string.length() a method, and int[].length a property?

本问题已经有最佳答案,请猛点这里访问。

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

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

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


我认为没有必要提供充分的理由,并且我认为可能有许多原因。

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


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

1
2
3
public int length() {
    return count;
}

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

这可能只是设计决定。我们可能会推测出一些促成因素(其中之一可能是Mark Peters提到的CharSequence问题)。


为什么要int []。length一个属性?

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

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

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

  • 公共方法克隆,它覆盖类Object中相同名称的方法,并且不引发任何检查的异常。数组类型T []的clone方法的返回类型为T []。

  • 多维数组的克隆很浅,也就是说,它仅创建一个新数组。子数组是共享的。

  • 所有成员都从类Object继承;不继承的对象的唯一方法是其克隆方法。

  • 资源:JSL 10.7

    为什么使用String.length()方法?


    我认为没有特别的原因。实际上,在C#(一种非常相似的语言)中,String.length是http://msdn.microsoft.com/zh-cn/library/system.string.length.aspx的属性。但是,请看一下C#设计师对此设计的评价:

    1
    2
    3
    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.


    因为String不是这样的数组。 Java的设计者将数组(即对象)设计为具有名为length的公共字段。

    另一方面,字符串有一个给出长度的方法。通常,将成员字段设为私有并使用方法访问它们是一种更常规的方法,但对于数组则不是。

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