Почему нет класса java.lang.Array? Если java-массив является объектом, не должен ли он расширять Object?

Вот дерево пакетов java: http://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html

Я прочитал учебник по Java, в котором указано, что в массивах Java есть объекты.

Где класс массива? Как мы можем сделать такие массивы:

byte[] byteArr = new byte[];
char[] charArr = new char[];
int[] intArr = new int[];

и массивы наследуют методы от Object; например:

    byte thisByte = 1;
    byte thatByte = 2;
    byte[] theseBytes = new byte[] {thisByte, thatByte};
    int inheritance = theseBytes.length; //inherited 'length' field and some methods
    int wasntInWill = thatByte.length; //error

Что здесь происходит?

EDIT:

В соответствии с ответами теперь я знаю, что это класс final в пакете java.lang.reflect.

Теперь я создал пакет java.lang.reflect в своем проекте Android и добавил к нему класс Array.java. Чтобы убедиться, что это находится на пути исходного класса, Eclipse дал мне ошибку "... уже существует в пути/в/android.jar"

Если я выпишу тот же класс, что и java.lang.reflect.Array, но изменим метод toString()... это должно работать в моем приложении?

Ответ 1

От JLS:

Каждый массив имеет связанный объект класса, совместно используемый со всеми другими массивы с одним и тем же типом компонента. [Это] действует так: прямой суперкласс массива type is Object [и] каждый тип массива реализует интерфейсы Cloneable и java.io.Serializable.

Это показано в следующем примере кода:

class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

, который печатает:

class [I
class java.lang.Object

где строка "[I" является сигнатурой типа времени выполнения для объекта класса "array with component type int".

И да, поскольку массивы эффективно расширяют Object, вы можете вызвать toString() на arrayObject, также см. приведенный выше пример

int arr[] = new arr[2];
arr.toString();

Ответ 2

Массивы - это языковая функция - у них есть определенный синтаксис для объявления и доступа. И их определение класса скрыто от вас.

У них есть представление в API refleciton - java.lang.reflect.Array

Btw, поле length не наследуется от Object. Наследуются методы .getClass(), .toString() и т.д.

Ответ 3

Незначительная разработка вышеуказанного сегмента кода:

public class ClassForName {
    public static void main(String[] argv) throws ClassNotFoundException {
        Class theClass = Class.forName("[I");
        System.out.println(theClass.getName());
        Class superClass = theClass.getSuperclass();
        System.out.println(superClass.getName());
    }
}

Результаты:

C:\JavaTools>java ClassForName
[I
java.lang.Object

Как можно видеть, "[I" - это имя класса, который мы бы назвали на английском языке "array of int". Класс - это класс Java "полного гражданства", который отвечает всем методам Object. Единственное отличие состоит в том, что синтаксис new отличается и не поддерживает метод newInstance() класса.

(классы "[I", "[C" и др. "заранее определены" в JVM - для них нет соответствующих файлов .class. Java также будет неявно создавать "на лету", класс [MyJavaClass; ", если в вашей программе есть массив MyJavaClass.)

Ответ 4

Почему нет класса массива?

В программе используются классы массивов, по одному на тип элемента. Как в JLS, так и в спецификации JVM четко указано, что объект класса для массива создается динамически. JLS # 10.8 "Объекты класса для массивов" и JVM SpeС# 5.3.3 "Создание классов массивов".

Если массив Java является объектом, разве он не должен расширять Object?

Это расширяет java.lang.Object. В JLS # 10.8 четко указано, что "прямым суперклассом каждого типа массива является Object".