2015-08-14 3 views
1

Как известно, в классе java String существует метод length() (почему бы и нет getLength()?). Если мы посмотрим в этот метод, мы можем видеть:длина поля в массиве

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

и value является массивом. Почему мы получаем доступ к полю? Я знаю, что это поле является окончательным, и никто не может его изменить, но что же касается полиморфизма? И где я могу увидеть это поле? В какой класс? Я нашел java.lang.reflect.Array, , но нет таких полей, как length.

+9

'polimorthis' - Я никогда не слышал об этом термине раньше, но это звучит круто. –

+0

Строка не предназначена для того, чтобы вести себя политически. Я не понимаю вашего вопроса – nogard

+0

Это не о Строке. Я просто блуждаю, в каком классе я могу найти поле длины – slavov

ответ

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); 
1

value является массивом char (примитивно, не java.lang.Character) и массивы примитивных типов имеют поле имени length:

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

Все массивы имеют поле 'length'. – Keppil

+0

Имеет ли «массивы примитивных типов поле с именем длина» противоречить вашему комментарию? Нет, я так не думаю. – Smutje

+2

Ваш ответ указывает, что тот факт, что массив содержит примитивы, важен для того, имеет ли массив поле 'length' или нет. Это вводит в заблуждение. – Keppil

3

Где я могу видеть, что поле? В какой класс?

Если вы ищете полукокса декларации

массива Это символ массив, объявленный на вершине. Ты это видишь.

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

И если вы ищете length поле массива

Array's are the part JVM implementation. Вам нужно получить исходный код JVM для анализа/просмотра.

И почему мы получаем доступ к полю?

Вот как можно узнать длину массива.

Как насчет полиморфизма? Я знаю, что это поле окончательно, и никто не может его изменить, но все равно, что о полимортисе?

Никогда не слышал об этом, и если вы имеете в виду полиморфизм, нечего здесь делать.

0

length Поле массива не является статическим; поэтому каждый массив будет иметь собственное поле с собственным значением. Тот факт, что он легко не имеет ничего общего с полиморфизмом; это просто удобный способ узнать информацию о массиве.

Класс java.lang.reflect.Array не описывает массив; это класс, который предоставляет статические методы для динамического создания и доступа к массивам Java. Поэтому правильно, что в этом классе нет поля length.

1

String класс final, поэтому расширение String невозможно/разрешено, и компилятор не позволит вам это сделать.

String s частный член (!) value - массив из char s (примитив). Это можно рассматривать как деталь реализации, и вам не следует возиться с ней.

Все массивы на Java получили поле под названием length.Он доступен через свойство-доступ, нет необходимости в чем-то вроде «getter».

Смежные вопросы