Czy tablica jest obiektem w Javie?


94

W Javie możemy zadeklarować tablicę używając:

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

Czy to oznacza, że ​​sama tablica jest obiektem? Pytam, bo w C ++ tablica jest tylko wskaźnikiem i nie ma żadnych metod.


5
Nie, w C ++ tablica jest tablicą, a nie tablicą.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
Aha, w C ++ zarówno tablice, jak i wskaźniki są obiektami.
R. Martinho Fernandes

2
@ R.MartinhoFernandes Wszystkie tablice C ++ są rzeczywiście obiektami C ++, ale istnieją wskaźniki C ++, które nie są obiektami C ++, a mianowicie wszystkie wskaźniki, które są wynikiem oszacowania wartości r. Przykłady obejmują &x, p+ii new int(42).
fredoverflow

1
@skaffman Wiadomość nie jest bezwzględnie konieczna, ponieważ inaczej nie skompilowałaby się.
shmosel

Odpowiedzi:



60

Tak; specyfikacja języka Java pisze :

W języku programowania Java tablice są obiektami (pkt 4.3.1), są tworzone dynamicznie i mogą być przypisane do zmiennych typu Object (pkt 4.3.2). Wszystkie metody klasy Object mogą być wywoływane na tablicy.


Jeśli tablica jest obiektem, czy to nie znaczy, że jest instancją klasy? Jeśli tak, czy mogę przedłużyć tę klasę?
One Two Three

9
Nie, tak nie jest: specyfikacja Java pisze : „Obiekt jest instancją klasy lub tablicą. Instancja klasy jest jawnie tworzona przez wyrażenie tworzenia instancji klasy (§15.9). Tablica jest jawnie tworzona przez wyrażenie tworzenia tablicy (§ 15.10). ”. I nie, nie możesz rozszerzyć tablicy, ponieważ klauzula extends musi zawierać ClassType.
meriton

36

Cóż, zapytajmy Javę!

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

Wynik:

true
true

1
Możesz również zadeklarować int[] someIntegers = {42};ten sam wynik.
Holger,

7

Tak, jest to obiekt w Javie.

Zauważ również, że kiedy to robisz array.length, nie wywołujesz żadnych metod, ale po prostu uzyskujesz dostęp do lengthpola tablicy . W klasie Arrays istnieje wiele metod statycznych .


3

Należy zauważyć, że tablice w Javie mają własne kody bajtów, których nie współdzielą z obiektami. Z pewnością są to obiekty, ale na niskim poziomie są traktowane nieco inaczej.


2

Powiedziałbym, że tak, chociaż mógłbym dodać, że ściślej mówiąc tablica jest obiektem również w C ++. Od §1.8 [intro.object] aktualnego standardu (FDIS):

Obiekt jest regionem przechowywania.



1

Każda tablica w java jest obiektem ex int [] a = new int [2]; Tak więc new służy do tworzenia obiektu, a ponieważ jest to obiekt, możemy sprawdzić nazwę klasy po prostu używając a.getClass (). GetName ();


1
  1. Tablica nie jest instancją żadnej klasy wymienionej w drzewie klas, jednak każda tablica jest obiektem i dziedziczy bezpośrednio z java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Klasa java.util.Arraysjest klasą pomocniczą, a tablice nie są instancjami tej klasy.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Klasa java.lang.reflect.Arrayjest klasą pomocniczą, a tablice nie są instancjami tej klasy.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Tablice dziedziczą wszystkie elementy członkowskie java.lang.Object

  2. Tablice przesłaniają metodę clone()dziedziczoną z Object.

  3. Tablice implementują pole length, które zawiera liczbę składników tablicy. długość może być dodatnia lub zerowa. To jest publici final.

  4. Tablice implementują interfejsy Cloneablei java.io.Serializable.

8a. Tablice są obsługiwane przez Class<T>. Możesz pobrać Class<T>instancję z instancji tablicy

(new int[2]).getClass()

lub z typu tablicowego

int[].class

8b. Unikalna instancja klasy odbicia (tj. Instancja java.lang.Class<T>) jest tworzona dla każdego typu tablicy w kodzie. Przykłady

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Powtarzam: tablice są obiektami, ale nie są instancjami żadnej klasy w drzewie klas.

BIBLIOGRAFIA

Ze specyfikacji Java Sekcja 4.3.1 Obiekty

  • Obiekt jest instancją klasy lub tablicą.

  • Instancja klasy jest jawnie tworzona przez wyrażenie tworzenia instancji klasy.

  • Tablica jest jawnie tworzona przez wyrażenie tworzenia tablicy.

Z java.util.Arrays

  • Ta klasa zawiera różne metody manipulowania tablicami (takie jak sortowanie i wyszukiwanie)

Z java.lang.reflect.Array

  • Klasa Array udostępnia statyczne metody do dynamicznego tworzenia i uzyskiwania dostępu do tablic Java.

Z sekcji 10.1 Obiekty

  • Bezpośrednią nadklasą typu tablicowego jest Object.

  • Każdy typ tablicy implementuje interfejsy Cloneablei java.io.Serializable.

Z rozdziału 10.7 Członkowie tablicy

Wszystkie elementy członkowskie typu tablicowego są następujące:

  • Publiczne pole końcowe length, które zawiera liczbę składników tablicy. długość może być dodatnia lub zerowa.

  • Metoda publiczna clone, która przesłania metodę o tej samej nazwie w klasie Objecti nie zgłasza żadnych sprawdzonych wyjątków. Zwracanym typem clonemetody typu tablicowego T[]jest T[].

  • Klon wielowymiarowej tablicy jest płytki, co oznacza, że ​​tworzy tylko jedną nową tablicę. Podtablice są wspólne.

  • Wszyscy członkowie odziedziczeni z klasy Object; jedyną metodą Object, która nie jest dziedziczona, jest metoda klonowania.


1

Tablice czegokolwiek są obiektami. Można zadzwonić metod, takich jak equals, hashcodeetc:

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

Nie można wywoływać metod na typie natywnym.


0

Obserwuj poniższy fragment kodu i dane wyjściowe.

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

}

oczywiście tablica a jest traktowana jako obiekt.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.