有很多不同的答案,所以我认为收集它们(并添加一些)会很有用:
类
-
自动装箱类 - 编译器仅允许特定类
-
类 - 例如,有自己的文本(int.class)。我还会在不创建新实例的情况下添加其通用类型。
-
字符串 - 具有重载的 +-运算符和对文本的支持
-
Enum - 唯一可以在 switch 语句中使用的类(很快也会向 String 授予特权)。它还可以做其他事情(自动静态方法创建,序列化处理等),但理论上可以用代码完成 - 它只是大量的样板,并且一些约束不能在子类中强制执行(例如特殊的子类规则),但是如果没有枚举的特权状态,您永远无法完成的就是将其包含在switch语句中。
-
对象 - 所有对象的根(我会添加它的克隆和finize方法不是你可以实现的)
-
引用:弱引用、软引用、幻像引用
-
Thread - 该语言不会给你一个特定的指令来启动一个线程,而是神奇地把它应用到start()方法。
-
Throwable - 可以使用 throw、throws 和 catch 的所有类的根,以及编译器对 Exception vs. RuntimeException 和 Error 的理解。
-
NullPointerException和其他异常,例如ArrayIndexOutOfBounds,它可以由athrow以外的其他字节码指令引发。
接口
荣誉奖颁发给:
- java.lang.reflect.数组 - 无法创建由 Class 对象定义的新数组。
-
附注它们是一种特殊的语言功能,在运行时的行为类似于接口。您当然不能定义另一个 Annotation 接口,就像您无法定义 Object 的替代接口一样。但是,您可以实现它们的所有功能,并且只需使用另一种方法来检索它们(以及一大堆样板文件),而不是反射。事实上,在引入注释之前,有许多基于XML和基于javadoc标签的实现。
-
ClassLoader - 它肯定与JVM有特权关系,因为没有语言方法来加载类,尽管有字节码方式,所以它就像数组一样。它还具有被 JVM 回调的特殊特权,尽管这是一个实现细节。
-
可序列化 - 您可以通过反射实现该功能,但它有自己的特权关键字,在某些情况下,您将花费大量时间与SecurityManager亲密接触。
注意:我从列表中省略了提供JNI的东西(例如IO),因为如果您愿意,您始终可以实现自己的JNI调用。但是,以特权方式与 JVM 交互的本机调用是不同的。
数组是值得商榷的 - 它们继承了Object,具有可理解的层次结构(Object[]是String[]的超类型),但它们是一种语言特征,而不是它本身定义的类。