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.
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.
if (array instanceof Object) System.out.println("Yes!")
&x, p+ii new int(42).
Odpowiedzi:
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.
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
int[] someIntegers = {42};ten sam wynik.
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 .
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.
Chcę tylko dodać, że tablice mają reprezentację w interfejsie API odbicia - java.lang.reflect.Array .
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 ();
java.util.Object(new int[1]) instanceof Object // -> evaluates to true
java.util.Arraysjest klasą pomocniczą, a tablice nie są instancjami tej klasy.(new int[1]) instanceof java.util.Arrays // -> compile error
java.lang.reflect.Arrayjest klasą pomocniczą, a tablice nie są instancjami tej klasy.(new int[1]) instanceof java.lang.reflect.Array // -> compile error
Tablice dziedziczą wszystkie elementy członkowskie java.lang.Object
Tablice przesłaniają metodę clone()dziedziczoną z Object.
Tablice implementują pole length, które zawiera liczbę składników tablicy. długość może być dodatnia lub zerowa. To jest publici final.
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[]" /
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.
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.
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.
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.