众所周知,在java String类中有一个length()
方法(为什么不getLength()
?)。如果我们研究这种方法,我们可以看到:
public int length() {
return value.length;
}
和value
是一个数组。我们为什么要访问某个字段?我知道这个领域是最终的,没有人可以改变它,但仍然是多态的呢?我在哪里可以看到那个领域?在哪个级别?我找到了java.lang.reflect.Array
,
但是没有length
这样的字段。
答案 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)
value
是char
(原语,而不是java.lang.Character
)的数组,原始类型数组有一个名为length
的字段:
final char[] chars = new char[1];
final int length = chars.length;
答案 3 :(得分:1)
String
是final
类,因此无法/允许扩展String
,编译器不会允许您这样做。
String
私有成员(!)value
是一个char
s(基元)数组。这可以被视为一个实现细节,你不应该搞乱它。
Java中的所有数组都有一个名为length
的字段。它可以通过财产访问访问,不需要像“getter”这样的东西。
答案 4 :(得分:0)
数组的length
字段不是静态的;所以每个数组都有自己的字段,有自己的值。事实上它很容易与多态性无关;它只是查找阵列信息的便捷方式。
类java.lang.reflect.Array
没有描述数组;它是一个提供动态创建和访问Java数组的静态方法的类。所以在该类中没有字段length
是正确的。