1. 第一章 Java体系结构
Java编程环境:
Java虚拟机基本结构:
Java有两种类型的类装载器:启动类装载器和用户定义的类装载器。启动类装载器是虚拟机实现的一部分,通常用C/C++语言来编写(Java虚拟机就是用C/C++语言编写的)。启动类装载器主要是装载JAVA API核心类库。用户定义的类装载器则是用JAVA语言编写的,因此,我们可以定义自己的类装载器,在程序运行期间,根据我们的需要来装载类。
Java语言的优势:
Java没有直接操纵内存的方法,避免了内存误操作引起的崩溃。一种类型的引用无法直接转换为另外一种类型的引用,除非在运行时刻,一种类型的引用实际上是指向了另外一种类型的实例(比如假设B继承A,在运行时刻,A引用指向了一个B的实例,这种情况下,可以把A引用转换为B类型的引用)。
垃圾收集:在JAVA中,可以用new关键字创建一个对象,但没有delete关键字显式释放对象的方法。JAVA虚拟机会自动判断一个对象是否还有别人在引用它,如果已经不存在其它对象对它的引用,则会自动释放这个对象所占的内存。
数组边界检查:在JAVA中,你如果创建一个长度为10的数组,那么你只能放置10个对象,如果放置更多的对象,将会抛出异常,而不是导致程序崩溃。
对对象引用的检查:如果你尝试执行一个空的对象引用的方法,将会抛出空指针异常,而不是导致程序崩溃。
Java语言的劣势:
性能:比不上本地代码,但也可以通过某种手段在一定程度上增强性能,比如编译为本地代码(预编译)、Java虚拟机本身的性能也在逐步提高。当然,因为JAVA程序的复杂性(比如分布式系统或在各种不同的虚拟机上运行相同的程序等),所以,这种程序性能的增强也是有代价的。
内存管理和线程调度上的缺陷:无法确定垃圾收集何时开始和持续多长时间。
最小公分母问题:为了支持跨平台,必需在某些特性上进行取舍。
反编译问题:Java的class文件,包含指令字节码和变量名称、方法描述等各种信息,这导致JAVA的class文件很容易被反编译。解决办法就是混淆器。用混淆器来混淆代码,将变量名称、方法描述等信息变成完全无意义的符号,这样对反编译者来说,在反编译之后,要对代码进行分析将会付出更加大的代价。
2. 第二章 平台无关
Write Once,Run Anywhere
上图就描述了所谓平台无关的概念。
影响平台无关的主要因素:
第一, 平台的部署:你必须保证在目标机器上已经部署了相关的JAVA平台
第二, JAVA版本,虽然JAVA号称向上兼容(即用旧版本的JDK开发的程序,可以运行在新版本的JAVA虚拟机上面),但事情不是绝对的!另外,你当然更不能期望用新版本的JDK开发的软件能够运行在旧版本的JDK上面了,因为新版本的JDK一定会比旧版本的JDK增加和改变了很多特性,如果你用到了这些特性,那么你的程序就无法在旧版本的JDK上面运行。
本地方法(JNI),如果你用到了JNI,也无法对你的程序进行移植