Apakah array merupakan objek di Java?

94

Di Java kita bisa mendeklarasikan array menggunakan yang berikut ini:

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

Apakah ini berarti bahwa array itu sendiri adalah sebuah objek? Saya bertanya, karena dalam C ++ sebuah array hanyalah sebuah pointer dan tidak memiliki metode apa pun.

Mike G
sumber
5
Tidak, di C ++ sebuah larik adalah larik, dan bukan larik.
Kerrek SB
42
if (array instanceof Object) System.out.println("Yes!")
Skaffman
6
Oh, dan dalam C ++, array dan pointer adalah objek.
R. Martinho Fernandes
2
@ R.MartinhoFernandes Semua array C ++ memang objek C ++, tetapi ada pointer C ++ yang bukan objek C ++, yaitu semua pointer yang merupakan hasil evaluasi nilai r. Contohnya termasuk &x, p+idan new int(42).
fredoverflow
1
@skaffman Pesan ini tidak sepenuhnya diperlukan, karena tidak akan dapat dikompilasi sebaliknya.
shmosel

Jawaban:

198

Iya.

Spesifikasi Bahasa Java bagian 4.3.1 dimulai dengan:

Objek adalah turunan kelas atau larik.

Paul
sumber
4
Sampai sekarang saya selalu berasumsi sebuah objek identik dengan instance kelas dan array itu adalah fitur bahasa khusus atau semacamnya.
Ruben9922
Penjelasan terperinci diberikan di sini: geeksforgeeks.org/array-primitive-type-object-java
garnet
60

Iya; Spesifikasi Bahasa Java menulis :

Dalam bahasa pemrograman Java, array adalah objek (§4.3.1), dibuat secara dinamis, dan dapat ditempatkan ke variabel bertipe Object (§4.3.2). Semua metode Objek kelas dapat dipanggil pada sebuah array.

manfaat
sumber
Jika array adalah sebuah objek, bukankah itu berarti itu adalah turunan dari sebuah kelas? Jika ya, dapatkah saya memperpanjang kelas itu?
Satu Dua Tiga
9
Tidak, tidak: Spesifikasi Java menulis : "Objek adalah instance kelas atau array. Sebuah instance kelas secara eksplisit dibuat oleh ekspresi pembuatan instance kelas (§15.9). Sebuah array secara eksplisit dibuat oleh ekspresi pembuatan array (§15.10). ". Dan tidak, Anda tidak dapat memperluas array, karena klausa extends harus menampilkan ClassType.
Meriton
36

Nah, mari kita tanya 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);
  }
}

Keluaran:

true
true
nasukkin
sumber
1
Anda juga bisa mendeklarasikan int[] someIntegers = {42};, ke hasil yang sama.
Holger
7

Ya, ini adalah objek di Jawa.

Juga perhatikan bahwa ketika Anda melakukannya array.lengthAnda tidak memanggil metode apa pun tetapi hanya mengakses bidang array length. Ada banyak metode statis di kelas Array .

Marsellus Wallace
sumber
3

Penting untuk diperhatikan bahwa array di Java memiliki kode byte sendiri yang tidak dibagikan dengan objek. Mereka memang Object, tapi ditangani sedikit berbeda pada level rendah.

ed209
sumber
2

Saya akan mengatakan jawabannya adalah ya, meskipun saya dapat menambahkan bahwa, sebenarnya, array juga merupakan objek dalam C ++. Dari §1.8 [intro.object] dari standar saat ini (FDIS):

Sebuah objek merupakan wilayah penyimpanan.

Björn Pollex
sumber
1

Setiap array di java adalah objek ex int [] a = new int [2]; Jadi new digunakan untuk membuat sebuah objek dan karena itu adalah sebuah objek kita bisa memeriksa nama kelas hanya menggunakan a.getClass (). GetName ();

Manoj Mohanty
sumber
1
  1. Sebuah array bukanlah turunan dari setiap kelas yang terdaftar dalam pohon kelas, namun setiap array adalah sebuah objek dan diturunkan langsung dari java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Kelas tersebut java.util.Arraysadalah kelas pembantu, dan array bukanlah instance dari kelas ini.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Kelas tersebut java.lang.reflect.Arrayadalah kelas pembantu, dan array bukanlah instance dari kelas ini.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Array mewarisi semua anggota java.lang.Object

  2. Array menggantikan metode yang clone()diwarisi Object.

  3. Array mengimplementasikan bidang length, yang berisi jumlah komponen larik. panjangnya mungkin positif atau nol. Ini publicdan final.

  4. Array mengimplementasikan antarmuka Cloneabledan java.io.Serializable.

8a. Array didukung oleh Class<T>. Anda dapat mengambil Class<T>instance dari instance array

(new int[2]).getClass()

atau dari tipe array

int[].class

8b. Instance kelas refleksi unik (yaitu instance dari java.lang.Class<T>) dibuat untuk setiap jenis array yang berbeda dalam kode Anda. Contoh

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Untuk mengulang: Array adalah objek tetapi bukan instance dari kelas mana pun di pohon kelas.

REFERENSI

Dari spesifikasi Java Bagian 4.3.1 Objek

  • Objek adalah turunan kelas atau larik.

  • Sebuah instance kelas secara eksplisit dibuat oleh ekspresi pembuatan instance kelas.

  • Sebuah array secara eksplisit dibuat oleh ekspresi pembuatan array.

Dari java.util.Arrays

  • Kelas ini berisi berbagai metode untuk memanipulasi array (seperti pengurutan dan pencarian)

Dari java.lang.reflect.Array

  • Kelas Array menyediakan metode statis untuk membuat dan mengakses array Java secara dinamis.

Dari Bagian 10.1 Objek

  • Superkelas langsung dari tipe array adalah Object.

  • Setiap tipe array mengimplementasikan antarmuka Cloneabledan java.io.Serializable.

Dari Bagian 10.7 Anggota Array

Anggota tipe array adalah semua dari berikut ini:

  • Bidang final publik length, yang berisi jumlah komponen larik. panjangnya mungkin positif atau nol.

  • Metode publik clone, yang mengganti metode dengan nama yang sama di kelas Objectdan tidak menampilkan pengecualian yang dicentang. Tipe kembalian dari clonemetode tipe array T[]adalah T[].

  • Klon dari larik multidimensi bersifat dangkal, artinya ia hanya membuat larik baru. Subarray dibagikan.

  • Semua anggota diwarisi dari Object kelas; satu-satunya metode Objek yang tidak diwariskan adalah metode klonnya.

RFS
sumber
1

Array dari apapun adalah obyek. Seseorang dapat memanggil metode seperti equals, hashcodedll:

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

Seseorang tidak dapat memanggil metode pada tipe asli.

fastcodejava.dll
sumber
0

Amati cuplikan kode dan keluaran di bawah ini.

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

}

jelas array a diperlakukan sebagai objek.

Wisnu Dahatonde
sumber
0

Ya, dokumen mengatakan demikian:

Array adalah objek kontainer yang menyimpan sejumlah nilai tetap dari satu tipe.

Perhatikan bahwa tipe array dari tipe primitif (seperti int[]atau char[]) itu sendiri juga merupakan objek.

Setiap larik secara langsung memperluas java.lang.Objectdan mengimplementasikan antarmuka javs.lang.Cloneabledan java.io.Serializable. Tanda tangan tipe runtime dari sebuah array [Lsegera diikuti nama kelas dari tipe komponen (mis [Ljava.lang.String.). Array tipe primitif memiliki tanda tangan runtime berikut:

  • [Buntuk byte[];
  • [Suntuk short[];
  • [Iuntuk int[];
  • [Juntuk long[];
  • [Funtuk float[];
  • [Duntuk double[];
  • [Cuntuk char[].
Kaisar MC
sumber