为什么 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());
我不认为必须有充分的理由,而且我认为可能有很多原因。
但一个是通过创建String#length()
一个属性,它可以在接口中声明(在这种情况下CharSequence
)。接口不能声明公共实例字段。
这是String::length()
函数的样子:
public int length() {
return count;
}
所以本质上count
可以被调用length
并公开为类似于数组(final
毕竟)。
这可能只是一个设计决定。可能有一些我们可以推测的促成因素(其中一个可能是CharSequence
马克彼得斯提到的事情)。
因为 String 不是这样的数组。Java 的设计者将数组(它们是对象)设计为有一个名为length
.
另一方面,String 有一个给出长度的方法。通常,将成员字段设为私有并使用方法访问它们是一种更传统的方法,但在数组的情况下则不然。
就您而言,它们是具有不同签名的不同对象。AString
不是 a char[]
(尽管在内部它可能以这种方式实现)。
没有特别的原因,我想。事实上,在 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.
为什么 int[].length 是一个属性?
数组是java中的特殊对象,它们有一个名为length的简单属性,它是final。
数组没有“类定义”(在任何 .class 文件中都找不到),它们是语言本身的一部分。
公共最终字段长度,其中包含数组的组件数。长度可以是正数或零。
公有方法clone,覆盖Object类中的同名方法,不抛出检查异常。数组类型 T[] 的克隆方法的返回类型是 T[]。
多维数组的克隆是浅的,也就是说它只创建一个新数组。子数组是共享的。
继承自类Object的所有成员;Object 唯一不被继承的方法是它的 clone 方法。
资源: JSL 10.7