Почему нет класса 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".