É uma matriz um objeto em java

93

Em java, podemos declarar uma matriz como

String[] array = new String[10]; 
int size = array.length; 

Isso significa que a própria matriz é um objeto? Porque em C ++ um array é apenas um ponteiro e não possui métodos.

Mike G
fonte
5
Não, em C ++ um array é um array, e não um array.
Kerrek SB
42
if (array instanceof Object) System.out.println("Yes!")
skaffman
6
Ah, e em C ++, tanto arrays quanto ponteiros são objetos.
R. Martinho Fernandes
2
@ R.MartinhoFernandes Todos os arrays C ++ são objetos C ++ de fato, mas há ponteiros C ++ que não são objetos C ++, ou seja, todos os ponteiros que são o resultado da avaliação de um rvalue. Os exemplos incluem &x, p+ie new int(42).
fredoverflow
1
@skaffman A mensagem não é estritamente necessária, pois de outra forma não seria compilada.
shmosel

Respostas:

197

Sim.

A seção de Especificação da linguagem Java 4.3.1 começa com:

Um objeto é uma instância de classe ou um array.

Paulo
fonte
4
Até agora, sempre assumi que um objeto era sinônimo de instância de classe e que os arrays eram um recurso especial de linguagem ou algo assim.
Ruben9922
A explicação detalhada é fornecida aqui: geeksforgeeks.org/array-primitive-type-object-java
garnet
60

Sim; a especificação da linguagem Java escreve :

Na linguagem de programação Java, os arrays são objetos (§4.3.1), são criados dinamicamente e podem ser atribuídos a variáveis ​​do tipo Objeto (§4.3.2). Todos os métodos da classe Object podem ser chamados em uma matriz.

Meriton
fonte
Se array é um objeto, isso não significa que é uma instância de uma classe? Se sim, posso estender essa aula?
Um Dois Três
9
Não, não faz: a especificação Java escreve : "Um objeto é uma instância de classe ou um array. Uma instância de classe é explicitamente criada por uma expressão de criação de instância de classe (§15.9). Um array é explicitamente criado por uma expressão de criação de array (§15.10). ". E não, você não pode estender uma matriz, porque a cláusula extends deve apresentar um ClassType.
Meriton
36

Bem, vamos perguntar ao Java!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

Resultado:

true
true
Nasukkin
fonte
1
Você também pode declarar int[] someIntegers = {42};, para o mesmo resultado.
Holger
7

Sim, é um objeto em Java.

Observe também que, ao fazer isso, array.lengthvocê não está invocando nenhum método, mas apenas acessando o lengthcampo do array . Existem muitos métodos estáticos na classe Arrays .

Marsellus Wallace
fonte
3

Seria importante observar que os arrays em Java têm seus próprios códigos de byte que não compartilham com objetos. Eles são certamente objetos, mas são tratados de forma ligeiramente diferente no nível inferior.

ed209
fonte
2

Eu diria que a resposta é sim, embora deva acrescentar que, estritamente falando, um array também é um objeto em C ++. De §1.8 [intro.object] do padrão atual (FDIS):

Um objeto é uma região de armazenamento.

Björn Pollex
fonte
1

Cada array em java é um objeto ex int [] a = new int [2]; Portanto, new é usado para criar um objeto e como é um objeto podemos verificar o nome da classe apenas usando a.getClass (). GetName ();

Manoj Mohanty
fonte
1
  1. Uma matriz não é uma instância de qualquer classe listada na árvore de classes, no entanto, cada matriz é um objeto e herda diretamente de java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. A classe java.util.Arraysé uma classe auxiliar e os arrays não são instâncias dessa classe.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. A classe java.lang.reflect.Arrayé uma classe auxiliar e os arrays não são instâncias dessa classe.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Arrays herdam todos os membros de java.lang.Object

  2. Os arrays substituem o método clone()herdado de Object.

  3. Arrays implementam o campo length , que contém o número de componentes do array. comprimento pode ser positivo ou zero. É publice final.

  4. Arrays implementam as interfaces Cloneable e java.io.Serializable.

8a. Arrays são suportados porClass<T> . Você pode recuperar a Class<T>instância de uma instância de array

(new int[2]).getClass()

ou de um tipo de array

int[].class

8b. Uma instância de classe de reflexão única (ou seja, uma instância de java.lang.Class<T>) é criada para cada tipo de array diferente em seu código. Exemplos

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Para repetir: as matrizes são objetos, mas não são instâncias de nenhuma classe na árvore de classes.

REFERÊNCIAS

Da especificação Java Seção 4.3.1 Objetos

  • Um objeto é uma instância de classe ou um array.

  • Uma instância de classe é explicitamente criada por uma expressão de criação de instância de classe.

  • Um array é explicitamente criado por uma expressão de criação de array.

De java.util.Arrays

  • Esta classe contém vários métodos para manipular matrizes (como classificação e pesquisa)

De java.lang.reflect.Array

  • A classe Array fornece métodos estáticos para criar e acessar arrays Java dinamicamente.

Da Seção 10.1 Objetos

  • A superclasse direta de um tipo de array é Object.

  • Cada tipo de array implementa as interfaces Cloneablee java.io.Serializable.

Da Seção 10.7 Membros do Array

Os membros de um tipo de matriz são todos os seguintes:

  • O campo público final length, que contém o número de componentes da matriz. comprimento pode ser positivo ou zero.

  • O método público clone, que substitui o método de mesmo nome na classe Objecte não lança exceções verificadas. O tipo de retorno do clonemétodo de um tipo de array T[]é T[].

  • Um clone de uma matriz multidimensional é superficial, o que significa que ele cria apenas uma única nova matriz. Subarrays são compartilhados.

  • Todos os membros herdados da classe Object; o único método de Object que não é herdado é seu método clone.

RFS
fonte
1

Matrizes de qualquer coisa são objetos. Pode-se chamar métodos tais como equals, hashcodeetc:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

Não se pode chamar métodos em um tipo nativo.

fastcodejava
fonte
0

Observe o trecho de código e a saída abaixo.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

claramente o array a é tratado como objeto.

Vishnu Dahatonde
fonte