2013-08-22 2 views
0

Это касается Java-программирования. Почему Java-разработчик сделал length() в качестве функции-члена для String Object, а для ссылочной переменной массива они сделали это как окончательное поле ?. .. Если это не так запутанно, то мой следующий вопрос такой же, как и в любой функции, ссылки - это локальная переменная, хранящаяся в Stack.Then, как мы можем ссылаться на поле на ссылке массива. Пожалуйста, исправьте меня, если я ошибаюсь. .Строка имеет длину как член function.while массив имеет длину как окончательное поле

ответ

-1

Если вы видите source code строки, что сценарий происходит, когда вы передаете chararray в строку constructor.

public More ...String(char value[]) { 
193   int size = value.length; 
194   this.offset = 0; 
195   this.count = size; 
196   this.value = Arrays.copyOf(value, size); 
197  } 

И сделать счет как final Предотвращено для инициализации count вне конструктора.

+0

@SURESH ATTA, + 1 для объяснения. Я получил длину(), возвращает счет. – Level29Access

+0

Downvoter, не могли бы вы рассказать о причине нисходящего? в любом случае голосование недействительно без причины, и @ Level29Access получил помощь от этого. Я рад. –

-1

«Почему» вопросы всегда труднее всего ответить. Исторические причины в основном связаны с особым обращением с массивами. Я думаю, что свойства должны быть ограничены простым get и set, только если нет побочных эффектов, иначе используйте функции.

+2

Извините, вы ошиблись. – Level29Access

+0

См. Ниже код: int [] a; a = новый int [4]; a.length = 8; // Ошибка времени компиляции Конечное поле array.length не может быть назначено. – Level29Access

+0

@ Level29Access Вы «задаете» размер, инициализируя его «4». Конечно, вы не можете изменить окончательный var. – Fildor

0

В массиве length нет даже поля (это невозможно, потому что массивы не являются реальными объектами). Это «псевдо-собственность», как class в Object.class. Это синтаксический элемент, распознаваемый компилятором и переведенный в некоторую примитивную операцию.

+0

Какой объект Object.class вы говорите? .. Я имею в виду, что я не смог найти какое-либо свойство, о котором вы упоминали. – Level29Access

+0

Я не нашел ничего похожего на свойство для массива или для любого другого класса в API.http: //docs.oracle. com/javase/6/docs/api/ – Level29Access

+0

@ Level29Access: Это именно то, что я говорю. Нет класса массива, потому что массив не является нормальным объектом. И поэтому 'length' не является нормальным полем (в каком классе он будет определен?). Компилятор переводит выражение типа a.length в инструкцию JVM 'arraylength', а не доступ к полю. –

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