标准Java API中的某些类与其他类略有不同。我说的是那些没有编译器和/或JVM的特殊支持就无法实现的类。
我马上想到的是:
Object(很明显),因为它没有超级类。String因为该语言对+运算符有特殊支持。Thread因为尽管没有字节码指令“分叉”执行,但它具有神奇的start()方法。
我想所有类似的类都在JLS中提到过。如我错了请纠正我。
无论如何,还存在其他此类类吗?Java语言中是否有完整的“通用类”列表?
标准Java API中的某些类与其他类略有不同。我说的是那些没有编译器和/或JVM的特殊支持就无法实现的类。
我马上想到的是:
Object (很明显),因为它没有超级类。String 因为该语言对+运算符有特殊支持。Thread 因为尽管没有字节码指令“分叉”执行,但它具有神奇的start()方法。我想所有类似的类都在JLS中提到过。如我错了请纠正我。
无论如何,还存在其他此类类吗?Java语言中是否有完整的“通用类”列表?
Answers:
有很多不同的答案,所以我认为收集所有答案(并添加一些答案)会很有用:
注意:我没有提供JNI的东西(例如IO),因为如果您愿意的话,您总是可以实现自己的JNI调用。但是,以特权方式与JVM交互的本机调用是不同的。
数组是值得商-的-它们继承Object,具有可理解的层次结构(Object []是String []的超类型),但它们是语言功能,而不是单独定义的类。
SecurityManager呢 还是与反射或序列化有关的任何内容?
Class, 当然。它有自己的文字(与StringBTW 有区别),并且是所有反射魔术的起点。
sun.misc.unsafe是所有肮脏,破坏语言的骇客之母。
由于提到了重要的类,因此我将提及一些接口:
的Iterable接口(自1.5) -它允许一个对象参与foreach循环:
Iterable<Foo> iterable = ...;
for (Foo foo : iterable) {
}
该Serializable接口具有非常特殊的含义,与标准接口不同。您可以定义将要考虑的方法,即使它们未在接口中定义(如readResolve())。该transient关键字是影响行为的语言元素Serializable实现者。
transient关键字
Comparable不参与任何内部活动。您可以轻松编写NewComparable和NewArrays.sort(..)使用相同的功能进行更新
java.lang.ClassLoader,尽管实际的脏工作是由一些未提及的子类完成的(请参见12.2.1加载过程)。
对此不确定。但是我想不出一种手动实现IO对象的方法。
System班上有一些魔术。
System.arraycopy 是对本机代码的迷恋
public static native void arraycopy(Object array1, int start1,
Object array2, int start2, int length);
但...
/**
* Private version of the arraycopy method used by the jit
* for reference arraycopies
*/
private static void arraycopy(Object[] A1, int offset1,
Object[] A2, int offset2, int length) {
...
}
这些类中的大多数并没有真正在编译器或JVM的“特殊”帮助下实现。Object确实会注册一些本机,这些本机会在内部JVM结构周围发生故障,但是您也可以针对自己的类进行操作。(我承认这受语义限制,“调用JVM中定义的本机”可以被视为对JVM的特殊支持。)
/ is /的特殊之处在于“新”的行为以及“掷”指令如何初始化这些内部结构。
注释和数字几乎全是怪异的。