2016-06-08 13 views
8

Klasa obiektu jest super klasy dla każdej klasy w Javie. Zatem każda klasa powinna wpisywać się we właściwości lub zachowanie klasy Object.Jeśli tablicą obiektu jest obiekt, dlaczego tablica klasy String nie jest ciągiem

Wtedy możemy zadeklarować tablicę obiektów, jak pokazano poniżej:

Object c = new Object[] {1,2,"22" }; 

potem, gdy przychodzi do String dlaczego poniżej deklaracji jest źle:

String s = new String[]{"s","s"}; 
+9

'new String [] { "s", "s"}' 'jest typu String []', 'nie String'. 'Object []' jest podklasą 'Object', dlatego też działa pierwsza. –

+0

Ciąg [] s = nowy ciąg [] {"s", "s"}; – star

+0

@AndyTurner Ok, a następnie 'String []' nie jest podklasą ciągu 'String'. –

Odpowiedz

22

new String[]{"s","s"} jest typu String[] nie String. T[] nie jest podklasą T (chyba że T stanie się Object).

Object[] to podtyp Object, dlatego pierwszy działa. W rzeczywistości wszystkie typy tablic to subtype of Object, w tym, co może zaskakujące, tablice prymitywów, takie jak int[], chociaż int nie jest Object (*).

Można napisać pierwszy z nich przy użyciu bardziej konkretne typy:

Object[] c = new Object[] {1,2,"22" }; 

Możesz napisać drugi jako jedną z następujących czynności:

String[] s1 = new String[]{"s","s"}; 
Object[] s2 = new String[]{"s","s"}; 
Object s3 = new String[]{"s","s"}; 

Nawiasem mówiąc, s2 pokazuje, że tablice w Java jest kowariantna. Jest to problematyczne, ponieważ można legalnie napisać:

s2[0] = new Object(); 

które niepowodzenie przy starcie z ArrayStoreException, ponieważ nie można zapisać Object z odwołań w String[].

Jest to jeden z powodów, dlaczego autorzy jak Josh Bloch dają radę „wolą list do tablic” (patrz Efektywna Java 2. wyd pozycja 25), ponieważ kolekcje Java jak List nie są kowariantna, a więc nie cierpią na ten sam problem.


(*) Wystarczy dodać do zamieszania, prymitywne tablice nie są podtypy Object[], jako prymitywy nie są podtypy Object. Na przykład, byłby to błąd kompilacji czas, aby napisać:

Object[] illegal = new int[5]; 
3

Nieco mylący, Object[]jestObject. (Po pierwsze, w ten sposób Java może implementować tablice o zerowej długości, a tablice mogą być wartościami zwracanymi przez funkcję).

Przypisywanie instancji Object[] do odwołania do typu typu Object ma sens.

Jednak przypisanie instancji String[] do odwołania do typu String ma wartość , a nie. (Należy jednak pamiętać, że String[] jest również również an .)

Więc

  1. Object c = new Object[] {1,2,"22" }; sens
  2. String s = new String[]{"s","s"}; nie ma sensu
  3. Object s = new String[]{"s","s"}; sens
0
Object c = new Object[] {1,2,"22" }; 

jest ważna ze względu na fakt, że tablica Object s to nadal Object. Można określić, że c jest tablicą Object s na poziomie deklaracji też tak:

Object[] c = new Object[] {1,2,"22" }; 

jednak

String s = new String[]{"s","s"}; 

nie jest ważny, ponieważ tablica String s nie jest String. Musisz albo zamienić tablicę na String, tak:

String s = String.join(",", new String[]{"s","s"}); 

lub zapisać go w postaci tablicy, tak:

String[] s = new String[]{"s","s"}; 
1

swoją podstawową zasadę Java, Wszystko jest Object, a tym samym można użyć obiekt odniesienia dla wszystkiego jak Object o = new AnyOtherClass()

można użyć odniesienie klasy dla swoich klas podrzędnych jak List l = new Arraylist()

Ale String [] jest Array i Array nie jest przodkiem String

0

pierwsze, tablica posiada odniesienie do wartości, które są w stercie.

Po drugie, klasa obiektowa to klasa macierzysta każdej innej klasy w języku Java. , więc tablica obiektów może pomieścić dowolną wartość odniesienia, ale tablica ciągów będzie zawierać odwołanie do typu danych ciągowych, a każde odwołanie odnosi się do oddzielnego ciągu (string[0]= "a",string[1]="stackOverFlow"...).

Po trzecie, ciąg jest sekwencją znaków w języku Java.

, więc tablica żądła nie może być ciągiem, ponieważ nie odnosi się do sekwencji znaków, ale odnosi się do typu łańcucha obiektów znajdujących się w stercie.

1

tablica jest zbiorem obiektów lub zbiorem prymitywnych typów danych, podczas gdy ciąg znaków jest ciągiem znaków. jak wiesz obiekt jest super klasy z każdej innej klasy, dlatego ci zrobić jak poniżej: Object c = new Object[] {1,2,"22" };

klasy String nie jest super klasa typu tablicy ... więc nie można wykonywać jak poniżej ..

String s = new String[]{"s","s"}; 

nadzieja to pomoże ...

Powiązane problemy