Почему нет класса java.lang.Array? Если массив Java является объектом, разве он не должен расширять объект? - PullRequest
35 голосов
/ 17 декабря 2011

Вот дерево пакетов 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() ... это должно работать в моем приложении, верно?

Ответы [ 4 ]

41 голосов
/ 17 декабря 2011

С JLS :

Каждый массив имеет связанный объект Class, общий для всех других массивов с таким же типом компонента.[Это] действует так: прямым суперклассом типа массива является 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();
9 голосов
/ 17 декабря 2011

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

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

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

7 голосов
/ 20 мая 2012

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

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» - это имя класса, который мы бы назвалина английском языке "массив int".Класс является классом Java с полным гражданством, который отвечает на все методы Object.Единственное отличие состоит в том, что синтаксис new отличается и не поддерживает метод newInstance() класса.

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

2 голосов
/ 18 декабря 2011

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

Там - это классов массивов, по одному на каждый тип элемента, используемый в программе. Как в JLS, так и в спецификации JVM четко указано, что объект класса для массива создается динамически. JLS # 10.8 «Объекты класса для массивов» и JVM Spec # 5.3.3 «Создание классов массивов» .

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...