数组中的长度字段

时间:2015-08-14 09:25:19

标签: java arrays string

众所周知,在java String类中有一个length()方法(为什么不getLength()?)。如果我们研究这种方法,我们可以看到:

public int length() {
    return value.length;
}

value是一个数组。我们为什么要访问某个字段?我知道这个领域是最终的,没有人可以改变它,但仍然是多态的呢?我在哪里可以看到那个领域?在哪个级别?我找到了java.lang.reflect.Array, 但是没有length这样的字段。

5 个答案:

答案 0 :(得分:3)

  

我在哪里可以看到那个领域?在哪个类?

如果您正在寻找char数组声明

这是一个在顶部声明的char数组。你可以看到。

The value is used for character storage.
112 
113     private final char value[];

如果您正在寻找数组的length字段

Array's are the part JVM implementation。您需要获取JVM的源代码来分析/查看它。

  

为什么我们访问一个字段?

如何知道数组的长度。

  

多态性怎么样?我知道这个领域是最终的,没有人可以改变它,但仍然是关于polimorthis的呢?

从来没有听说过它,如果你的意思是多态性,那就没关系了。

答案 1 :(得分:2)

我认为你可能期望Java成为纯粹的OO语言......它不是......它是对象和原语的混合体。基元的行为不像对象,并且具有语言级别的原生内容,例如公共长度字段等。

考虑以下内容......一个字符数组......它的长度字段不是传统意义上的字段,它在JVM级别被烘焙到语言中。这种差异意味着您无法使用反射通过Field.getDeclaredField()访问它。 Java为这种情况提供了一种特殊的机制 - java.lang.reflect.Array.getLength(Object)

Object obj = new char[] { 'a', 'b' };
int length = ((char[]) obj).length;  // .length looks like a field access but done by JVM
int lengthViaRelection = Array.getLength(obj);

这与可以使用反射的类上的标准字段非常不同。

private static class ClassWithField {
    public int length;
}

ClassWithField obj = new ClassWithField();
int length = obj.length;  // .length is normal field access
int lengthViaRelection = (int) ClassWithField.class.getDeclaredField("length").get(obj);

答案 2 :(得分:1)

valuechar(原语,而不是java.lang.Character)的数组,原始类型数组有一个名为length的字段:

final char[] chars = new char[1]; 
final int length = chars.length;

答案 3 :(得分:1)

Stringfinal类,因此无法/允许扩展String,编译器不会允许您这样做。

String私有成员(!)value是一个char s(基元)数组。这可以被视为一个实现细节,你不应该搞乱它。

Java中的所有数组都有一个名为length的字段。它可以通过财产访问访问,不需要像“getter”这样的东西。

答案 4 :(得分:0)

数组的length字段不是静态的;所以每个数组都有自己的字段,有自己的值。事实上它很容易与多态性无关;它只是查找阵列信息的便捷方式。

java.lang.reflect.Array没有描述数组;它是一个提供动态创建和访问Java数组的静态方法的类。所以在该类中没有字段length是正确的。