Istnieje wiele różnych odpowiedzi, więc pomyślałem, że warto je wszystkie zebrać (i dodać kilka):
Zajęcia
- Klasy AutoBoxing - kompilator dopuszcza tylko określone klasy
- Class - ma swoje własne literały (na przykład int.class). Dodałbym również jego ogólne pisanie bez tworzenia nowych instancji.
- String - z jego przeciążeniem + -operator i wsparciem literałów
- Enum - jedyna klasa, której można użyć w instrukcji switch (wkrótce nadany zostanie również przywilej String). Robi też inne rzeczy (automatyczne tworzenie metod statycznych, obsługa serializacji itp.), Ale teoretycznie można by to osiągnąć za pomocą kodu - to po prostu dużo schematu, a niektórych ograniczeń nie można narzucić w podklasach (np. specjalne reguły dotyczące podklas), ale to, czego nigdy nie można by osiągnąć bez uprzywilejowanego statusu wyliczenia, to uwzględnienie go w instrukcji switch.
- Obiekt - korzeń wszystkich obiektów (a dodałbym, że jego metody klonowania i finalizowania nie są czymś, co można zaimplementować)
- Odniesienia : WeakReference, SoftReference, PhantomReference
- Wątek - język nie podaje konkretnej instrukcji, aby rozpocząć wątek, a raczej w magiczny sposób stosuje ją do metody start ().
- Throwable - katalog główny wszystkich klas, które mogą współpracować z rzutami, rzutami i przechwytywaniem, a także interpretacja kompilatora w zakresie wyjątków, wyjątków i błędów.
- NullPointerException i inne wyjątki, takie jak ArrayIndexOutOfBounds, które mogą być generowane przez inne instrukcje kodu bajtowego niż athrow.
Interfejsy
- Iterable - jedyny interfejs, którego można używać w rozszerzonej pętli for
Wyróżnienia dla:
- java.lang.reflect. Array - utworzenie nowej tablicy zdefiniowanej przez obiekt Class nie byłoby możliwe.
- Adnotacje To specjalna funkcja języka, która zachowuje się jak interfejs w czasie wykonywania. Z pewnością nie możesz zdefiniować innego interfejsu Adnotacji, tak jak nie możesz zdefiniować zamiennika dla Object. Możesz jednak zaimplementować całą ich funkcjonalność i po prostu mieć inny sposób na ich odzyskanie (i całą masę schematów) zamiast odbicia. W rzeczywistości istniało wiele implementacji opartych na XML i tagach javadoc przed wprowadzeniem adnotacji.
- ClassLoader - z pewnością ma uprzywilejowaną relację z JVM, ponieważ nie ma sposobu na załadowanie klasy w języku, chociaż istnieje sposób kodowania bajtowego, więc jest podobny do Array. Ma również specjalny przywilej wywołania zwrotnego przez JVM, chociaż jest to szczegół implementacji.
- Serializowalny - możesz zaimplementować tę funkcjonalność przez odbicie, ale ma ona swoje własne uprzywilejowane słowo kluczowe i w niektórych scenariuszach spędzisz dużo czasu na intymności z SecurityManager.
Uwaga: Pominąłem z listy rzeczy, które zapewniają JNI (takie jak IO), ponieważ zawsze możesz zaimplementować własne wywołanie JNI, jeśli masz takie skłonności. Jednak wywołania natywne, które współdziałają z maszyną JVM w uprzywilejowany sposób, są różne.
Tablice są dyskusyjne - dziedziczą Object, mają zrozumiałą hierarchię (Object [] jest nadtypem String []), ale są cechą języka, a nie samą zdefiniowaną klasą.