it-swarm-pt.tech

Por que não existe uma classe Java.lang.Array? Se uma matriz Java for um objeto, ela não deve estender o objeto?

Aqui está o Java package-tree: http://docs.Oracle.com/javase/7/docs/api/Java/lang/package-tree.html =

Eu li um tutorial sobre Java que afirmava que em Java matrizes são objetos.

Onde está a classe array? Como é que podemos criar matrizes como esta:

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

e as matrizes herdarão métodos de Object; por exemplo:

    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

O que está acontecendo aqui?

EDIT:

De acordo com as respostas, agora eu sei que é uma classe final no pacote Java.lang.reflect.

Agora criei um pacote Java.lang.reflect No meu Android projeto e adicionei uma classe chamada Array.Java a ele. Para confirmar que isso está no caminho da classe original, o Eclipse me deu o erro "... já existe no caminho/to/Android.jar"

Se eu escrever a mesma classe que Java.lang.reflect.Array, Mas alterar o método toString() ... isso deve funcionar dentro do meu aplicativo, certo?

36
Ozzy

De JLS :

Cada matriz possui um objeto de classe associado, compartilhado com todas as outras matrizes com o mesmo tipo de componente. [Isso] age como se: a superclasse direta de um tipo de matriz é Object [e] todo tipo de matriz implementa as interfaces Cloneable e Java.io.Serializable.

Isso é mostrado pelo seguinte código de exemplo:

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

que imprime:

class [I
class Java.lang.Object

onde a string "[I" é a assinatura do tipo em tempo de execução para o objeto de classe "array with component type int".

E sim, como os tipos de matriz estendem efetivamente Object, você pode chamar toString () em arrayObject, veja também o exemplo acima

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

Matrizes são um recurso de idioma - elas possuem uma sintaxe específica para declarar e acessar. E a definição de classe deles está oculta para você.

Eles têm uma representação na API de reflexão - Java.lang.reflect.Array

Aliás, o campo length não é herdado de Object. Os métodos .getClass(), .toString(), etc. são herdados.

9
Bozho

Pequena elaboração do segmento de código acima:

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());
    }
}

Resultados:

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

Como pode ser visto, "[I" é o nome da classe que chamaríamos, em inglês, "array of int". A classe é uma "cidadania completa" Java, que responde a todos os métodos de Object. A única diferença é que a sintaxe new é diferente e não suporta o método newInstance() da classe.

(As classes "[I", "[C", et al, são "predefinidas" na JVM - não há arquivos .class correspondentes a elas. Java também implicitamente crie, em tempo real, a classe "[MyJavaClass;" se você tiver uma matriz de "MyJavaClass" em seu programa.)

7
Hot Licks

Por que não há uma classe de matriz?

Existem classes de array, uma por tipo de elemento usado no programa. O JLS e o JVM Spec afirmam claramente que um objeto de classe para uma matriz é criado dinamicamente. JLS # 10.8 'Objetos de classe para matrizes' e JVM Spec # 5.3.3 'Criando classes de matriz' .

Se uma matriz Java for um objeto, ela não deve estender Object?

Ele estende Java.lang.Object. JLS # 10.8 afirma claramente que 'a superclasse direta de todo tipo de array é Object'.

2
user207421