#java虚拟机并不假定任何实现技术或者主机平台。它并不非得是解释型的,它也可以把代码编译成一个实际的CPU的指令集。它也可以用微代码或者直接用芯片实现。
#java虚拟机不识别java代码,只识别一种特殊的文件格式,即class文件格式。
#每个对象具有一个相应的锁(lock)
#恰当地讲,类型是一个编译期概念。
#每个数组也有一个类。数组的类具有奇怪的名称,他们不是有效的java标识符,例如,具有int成分的数组的类名称为”[I”
#标准类Object是所有其他类的超类。一个Object类型的标量可以持有任一对象的引用,不论该对象是类的实例还是数组。 // Object o = new String[10]; ß 这样写是对的!
#字符串文字以及更一般的常数表达式的值的字符串,被用方法String.intern”内部化”以共享唯一的实例。字符串文字是类String的实例的引用。
#一个String对象具有一个固定不变的值。
#类成员:类类型包括以下的成员:
·从它的直接超类继承的成员。没有直接超类的类Object除外。
·从任何直接超接口继承的成员。
·在类的主体中声明的成员。
#类中没有用private,protected或者public声明的成员不被在声明该类的包之外的包中声明的子类继承!构造函数和静态初始化函数不是成员,因此不被继承。
#变量可以被标记为transient以指示她们不是对象的永久状态。可用于java实现以支持特殊的系统服务。
#域可以声明为volatile。在这种情况下线程每次访问该变量时都必须使它对该域的工作拷贝与主拷贝一致。而且,代表一个线程的一个或者多个易变变量的主拷贝上的操作由主存储器确切地按照线程要求的顺序进行。
#覆盖方法必须不于它所覆盖的定义冲突。例如,具有一个不同的返回类型。
#接口的所有成员都隐式地是public
#类实现它的所有超接口
#接口中声明的方法不能声明为static,因为在Java中Static方法不能是abstract。接口主体中声明的方法不能声明为native或者synchronized。
#如果接口声明一个方法,则该方法声明被称为覆盖该接口的超接口中所有具有相同签名的方法。否则,超接口中的方法可以被该接口中的代码访问。
#如果一个数组的成分类型是T,则数组自身的类型写作T[]。
// 异常
#异常在它的发生点被抛出(thrown),在控制转向的点被捕捉(caught)。JAVA程序也可以使用throw语句显式地抛出异常。这提供了对处理错误情况的老式风格的一个替换。
#java的异常机制与java的同步模型结合在一起,使得当synchronized语句和synchronized方法调用突然结束时,锁被合适地释放。
#虚拟机通过调用某个指定类的方法main启动,传递给main一个字符串数组参数。
#装载(loading)是指寻找一个具有特定名称的类或者接口类型的二进制形式,并且用这个二进制形式构造一个代表类或者接口的class对象的进程。
#装载进程由类ClassLoader和它的子类实现。ClassLoader的不同子类可以实现不同的装载策略。
#链接包括三种不同的行为:检验、准备和对符号引用的解析。
#检验(verification)保证类或者接口的二进制表示的结构是正确的。
#准备(preparation)包括创建类或者接口的静态域以及把这些域初始化为标准的缺省值。
#因为java是多线程的,所以类或者接口的初始化要求仔细的同步,因为同时某个比的线程可能正在试图初始化同一个类或者接口。
#终止函数(finalize)提供了一个释放不能被自动存储器管理者自动释放的资源(例如文件描述符或者操作系统图形上下文)的机会。
#如果在终止中抛出一个不能被捕捉的异常,则该异常被忽略并且该对象的终止停止。
#与任何别的方法一样,finalize方法可以被显式的调用。但是,这样做对对象最终自动终止没有任何影响。
#一般来说,成组的相关类和接口类型将被一起卸载。例如,这可用于卸载被一个特定的类装载器装载的一组相关的类型。
#当一个类的任何实例仍可达到时这个类不能被卸载。
#如果一个类声明了一个不带参数和返回结果的类方法ClassFinalize
Static void classFinalize() {… }
则在该类被卸载之前这个方法被调用。像对象的finalize方法一样,这个方法将只被自动地调用一次。这个方法可以被可选的声明为private,protected或者public
#虚拟机的退出: 当两件事情之一发生时java虚拟机停止它的全部动作并退出:
·所有的非守护线程停止。
·某个线程调用了类Runtime或者类system的exit方法,并且退出操作为安全管理者所允许。
#通过用参数true调用类System的方法runFinalizersOnExit来完成。缺省的情况是退出时不运行终止函数的!
#任何线程都可以标为守护线程(daemon thread)当运行在某个线程中的代码创建一个新的Thread对象时,当且仅当创建线程是一个守护线程,新的线程才被初始化地标为守护线程。
#线程基本执行过程: 每个线程有一个工作存储器,它可以在其中保留与别的线程共享的主存储器中的标量的值的拷贝。为了访问一个共享的变量,线程通常首先获得一个锁并清除它的工作存储器。这保证了共享的值以后将从共享的主存储器装载到该线程的工作存储器。通过解锁一个锁,线程保证该线程在其工作存储器中持有的值被写回主存储器。
// JAVA虚拟机结构<o:p></o:p>
#java对象或者是一个动态分配的类实例,或者是一个数组。
#java虚拟机支持的基本数据类型是数值类型(numeric types)和returnAddress类型 ß 其值是java虚拟机指令的操作码的指针。它不是java语言类型。
#java虚拟机定义了一个具有平台指定的大小的抽象概念字(word),一个字的通常大小是主机平台的一个指针的大小。在一个32位平台上,字是32位,指针也是32位.
#java虚拟机有一个所有线程间共享的堆(heap)。
<o:p> </o:p>