Dla tego rodzaju rzeczy przydatne jest rozróżnienie między typem zmiennej, ustalonej w jej deklaracji, a klasą obiektu ustaloną podczas tworzenia obiektu.
Zmienna może mieć wartość null
lub wskazywać dowolny obiekt, którego klasa jest zgodna z typem, lub jest podklasą bezpośrednią lub pośrednią tej klasy. Ponieważ String
jest podklasą Object
, zmienna typu Object
może wskazywać obiekt klasy String
.
W przykładzie kompilator wie, że wyrażenie String
musi być null
lub punkt do String
obiektu, więc Object o = new String("Hello");
jest znany w czasie kompilacji za prawidłowe.
Z drugiej strony wyrażenie lub zmienna typu Object
może odwoływać się do ciągu, ale może odwoływać się do czegoś zupełnie innego. Kompilator wymaga jawnego rzutowania, aby powiedzieć, że konwersja jest OK.
public class Test {
public static void main(String[] args) {
Object stringObject = "xyzzy";
Object integerObject = new Integer(3);
String test1 = (String)stringObject;
System.out.println(test1);
String test2 = (String) integerObject;
System.out.println(test2);
}
}
Ten program kompiluje się, ponieważ powiedziałem kompilatorowi, że konwersje są prawidłowe w przypadku moich rzutów.Działa przez pierwsze wywołanie println
, ponieważ stringObject
naprawdę wskazuje na String
. Nie powiedzie się z ClassCastException
na linii String test2 = (String) integerObject;
. O ile kompilator wie, integerObject
może wskazywać na String
, więc zaakceptował moją obsadę. W czasie wykonywania JVM stwierdza, że naprawdę wskazuje na Integer
i zgłasza wyjątek.
Użycie typu Object
dla parametru integerObject jest znaczące. To sprawia, że konwersja wyrażenia typu typu na typ String jest konwersją, która może się powieść, w zależności od tego, co faktycznie odwołuje się do. Jeśli integerObject
zadeklarował typ Integer
, kompilator odrzuciłby program. Nie ma obiektu, do którego można odwoływać się za pomocą obu wyrażeń Integer
i String
.
Typ obiektu po prawej stronie musi być lub rozciągnąć typ po lewej stronie. Obiekt nie jest ciągiem ani nie rozszerza łańcucha. – csmckelvey
Musisz znaleźć podstawowy tekst dotyczący programowania obiektowego i go przestudiować. (Poważnie, nie zrozumiesz pojęć z odpowiedzi na 100 słów na SO). –