2016-08-27 3 views
1

Извините, если этот вопрос был задан раньше. У меня есть некоторые сомнения относительно поля длины класса Object. Исправьте меня, если я ошибаюсь. Каждый класс неуклонно расширяет класс Object, поэтому мы можем получить доступ к любым методам, таким как equals, clone, hashcode и т. Д.длина поля в классе объектов

Так что мой вопрос в том, когда мы создаем любой массив, например массив из int [], foo [ ] мы можем получить доступ к полю длины класса Object, но когда мы создаем какой-либо объект, мы не можем видеть переменную длины, почему?

+2

Потому что 'length' не определен в' Object' –

+0

По той же причине вы не можете увидеть переменную asdf или переменную foobar. – immibis

+0

Итак, где задано поле длины? – FaisalAhmed

ответ

5

Класс Object не определяет поле length, а Object его не имеет.

Поле length определено для типов массивов только. В JLS состояния:

«В языке программирования Java, массивы являются объектами (§4.3.1), динамически создаваемые и могут быть отнесены к переменным типа Object (§4.3.2) [... .] Длина массива доступна как конечная длина переменной экземпляра. "

Поле длины определено неявно. Не существует декларации класса Java API, где вы можете определить field. Поле length обычно реализуется «магией JVM»; например в заголовке объекта. Существует даже специальный байт-код (arraylength) для доступа к нему.

... когда мы создаем какой-либо объект, мы не можем видеть переменную длины, почему?

Почему? Потому что его нет!

+0

Итак, где определено поле длины? – FaisalAhmed

+2

@FaisalAhmed В * динамически * созданном классе массива. См. [JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html): * На языке программирования Java массивы являются объектами (§4.3.1), являются динамически созданный и может быть назначен переменным типа 'Object' (§4.3.2). [...] Длина массива доступна как «конечная» переменная экземпляра 'length'. * – Andreas

+0

Где это объявлено? Нигде! Это неявный <<. Где это определено? В JLS; см. выше. –

-1

В соответствии с моим пониманием длина массива - это переменная размера, которая была установлена ​​при инициализации массива и дает фактическую емкость массива. Поскольку емкость массива не может быть изменена после инициализации, так что Object []arr = new Object[2]; System.out.length(arr.length) отлично работает. Публичная конечная длина поля, которая содержит количество компонентов массива. длина может быть положительной или нулевой.

+0

Я знаю этого очень хорошего брата. Мой вопрос был почему мы не можем видеть длину, когда мы создаем нормальные объекты? И у меня есть ответ от Стивена C. И теперь я думаю, где это неявно определено? – FaisalAhmed

2

Вы должны следить, в каком направлении идет «наследование». Как вы знаете, «наследование» - это определение отношения «есть». Если базовый класс определяет поля, методы, то вы можете получить доступ к ним в производных классах.

Итак, в Java любое целое число - это объект. Или любой массив является объектом.

Это неверно для обратного направления. Произвольным объектом является не массив! Значение: если вы создаете объект, например, с bar = new Object(), тогда bar не имеет каких-либо свойств массива; потому что bar - объект; но не массив.

Таким образом, вы не найдете «длину» объекта, потому что объект не массив.

Но, конечно, если объект является "действительно" что-то еще, например:

int[] numbers = { 1, 2, 3 }; 
Object foo = numbers; 

, то вы всегда можете сделать слепок, как:

int[] anotherRefToNumbers = (int[]) foo; 

Edit: просто дать Другой точки зрения. Если вы сядете и нарисуете круг на листе бумаги; этот круг также является «формой» (или тем, кого вы бы назвали). Но не каждая форма, которую вы можете нарисовать ... будет кругом.

+0

Можете ли вы определить этот термин более ясно сэр «Объект не является массивом». –

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