在该章中, 我觉得没有什么太重要的东西, 但是关于1.2节中的 java "白皮书" 的关键术语应该了解下并能够理解它, 所谓的"白皮书"关键术语其实指的就是java的特性.
java的特性包括: 简单性, 面向对象, 网络技能(Network-Savvy), 健壮性, 体系结构中立, 可移植性, 解释型, 高性能, 多线程, 动态性, 一共有11个特性.
对各个特性的理解:
1, 简单性: java剔除了C++中很多很少使用, 很难理解, 易混淆的特性(当然需要注意的是, java并没有试图剔除C++所有的不适当特性, 比如switch语法就没有剔除), java具体剔除了C++ 的东西有头文件, 指针运算(甚至指针语法), 结构, 联合, 操作符重载, 虚基类等. java的简单另一个方面体现在小, java的目标之一是支持开发能够在小型机器上独立运行的软件, 基本的解释器以及类支持大约仅为40KB, 加上基础的标准类库和对线程的支持大约需要增加175KB. 这在当时是非常了不起的. 当然, 由于不断的扩展, 类库已经相当庞大了. 现在有一个独立的具有较小类库的java微型版(Java Micro Edition)用于嵌入式设备.
2, 面向对象: 简单的讲, 面向对象设计是一种程序设计技术. 它将重点放在数据(即对象) 和对象的接口上. 用木匠打一个比方, 一个"面向对象的"木匠始终关注的是所制作的椅子, 第二位才是所使用的工具. 一个"非面向对象的"木匠首先考虑的所用的工具. 与C++相比, java 的面向对象能力与C++是一样的. java与C++的主要不同点在于多继承(java类不能多继承), 在java中, 取而代之的是简单的接口概念, 以及java的元类(metaclass)模型(具体学习这部分类容, 在java核心技术这本输的第5章有讲解);
3, 网络技能: java有一个扩展的例程库(不懂什么是例程库, 暂且就理解为一个类库吧), 用于处理像HTTP和FTP之类的TCP/IP的协议. java应用程序可以通过URL 打开和访问网络上的对象, 其便捷程度就好像访问本地文件一样. 另外java可以把类似打开socket连接这类繁重的任务变得非常简单, 还有, java远程方法调用机制(这个具体机制在java核心技术卷二有介绍)使得分布式对象之间可以进行通信.
4, 健壮性: java投入了大量的精力进行早期的问题检测(个人理解java编译器能够监测许多其它语言只有在运行时才能够检测出来的问题), 后期动态(运行时)的检测, 并消除了有出错倾向的状态; java采用的指针模型可以消除重写内存和破坏数据的可能性, 在C中, 由于要利用指针存储字符串, 数组, 对象, 甚至文件, 这样通常会由于指针bug而引起内存冲突, 解决起来会特别麻烦, 有时候甚至会花上几个小时, 而java却可以避免, 也许, 对于只使用Visual Basic 这类没有显示指针的语言的人, 会觉得java指针模型的这一特性小题大作, 因为在Visual Basic中不需要使用指针访问字符串, 数组, 对象, 文件这些东西, 但是在没有指针的中, 许多数据结构很难实现, 而java具有双方的优势, 它不需要指针构造诸如字符串, 数组这样的结构, 但如果有需要的话, 它也能够具有指针的能力, 如链表. java 是绝对安全的, 原因是永远不会存取一个"坏的"指针, 造成内存分配的错误, 也不必防范内存泄漏(这点貌似有点问题,实际写代码还是要注意内存泄漏). 关于java的健壮性与安全性个人的理解, 由于java上述所述特性, 它会很健壮, 既然健壮, 自然就安全, 就好比一个健康的人, 他的身体健壮就不容易收到疾病的危害一样.
5, 安全性: java可以构建防病毒, 防篡改的系统. java指定了供人们使用的规范, 实现了虚拟机和安全库, 在任何情况下蒙骗java的安全机制都十分困难. 从一开始, java就设计成能够防范各种攻击, 其中包括:
* 运行时堆栈溢出, 如蠕虫等病毒常用的攻击手段;
* 在自己的处理空间之外破坏内存;
* 未经授权读写文件;
许多安全特性相继不断的加入到java中. 自从java 1.1问世以来, java 就有了数字签名类(digitally signed class) 的概念(具体在卷二有说明), 通过数字签名可以确定类的作者. 如果信任这个类的作者, 这个类就可以在你的机器上拥有更多的权限. 与微软的基于ActiveX技术的竞争代码传输机制相比, java的安全机制比ActiveX要强得多, 因为Activite技术的安全性完全依赖于数字签名, 来自微软自身产品的任何用户都可以证实, 来自知名提供商的程序会崩溃并对系统产生危害, 而java是在应用程序运行时加以控制并制止恶意性破坏的.
6, 体系结构中立: 编译器生成一个体系结构中立的目标文件格式, 这是一种编译过的代码, 只要有java运行时系统, 就可以在许多处理器上运行. java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性(个人简单理解就是, java编译器编译生成的字节码文件与计算机体系结构无关, 那么只要有java运行时系统, 这些字节码文件就可以在许多处理器上运行). 精心设计的字节码不仅可以很容易地在任何机器上解释执行, 而且还可以迅速地翻译成本地机器的代码. 解释字节码会比全速运行机器指令慢很多, 但虚拟机有一个选项, 可以将使用最频繁的字节码序列翻译成机器码, 这一过程称为即时编译(书中说到这里就没有说了, 但是虚拟机本来在执行字节码文件不就是要把所有的字节码文件翻译成机器码吗? 那么书上讲的计时编译是"把最频繁的字节码序列翻译成机器码", 感觉就是说虚拟机仅仅只是把最频繁的字节码翻译成机器码, 而使用不频繁的字节码不翻译成机器码, 如果真这样的话, 其余的字节码还有什么用, 都不翻译成机器码, 根本就没法执行, 还有即时编译到底有什么好处, 又是如何提现其好处, 这里的点没明白, 后续再看看其它的书, 看看是怎么介绍的, 然后回头来修改这里的笔记) . 虚拟机还有一些其它有点, 它可以检测指令序列的行为, 以增强其安全性, 有些程序还可以快速地生成字节码, 并动态地增强所运行程序的处理能力("有些程序还可以快速地生成字节码, 并动态地增强所运行程序的处理能力", 这个也不太明白, 后续看到相应的知识点,再做修改). 还有java能够跨平台也是因为不同的平台有不同的虚拟机才做到跨平台的.
7, 可移植性: 与C和C++相比, java规范中没有"依赖具体实现"的地方, 基本数据类型的大小以及有关算法都做了明确的说明, 如java中的int永远为32位的整数, 而在C/C++中, int 可能是16位整数, 32位整数, 也可能是编译器提供商指定的其它大小, 唯一的限制只是int 类型不能低于short int, 并且不能高于long int. 在java中, 数据类型具有固定的大小, 消除了移植代码令人头痛的主要问题, 二进制数据以固定的格式进行存储 和 传输, 消除了字节顺序的困扰, 字符串是用标准的Unicode格式存储的. 这里的疑问, 跨平台性与可移植性有何区别, 网上有说实际上就是一个东西,也有说有区别. 如果说是一个东西, 那么java的跨平台的不应该是和jvm有关吗? 网上还有一种说法就是夸平台是指类似于系统之类的, 比如windows编译, 在linux上运行, 而可移植性是针对硬件来说的, 如x86的cpu, 64位的cpu, 这样分析起来的话, 貌似跨平台性和可移植性就应该是两个东西了. 但如果真是两个东西, 为什么在该节介绍java特性时,没有单独的来介绍 java的跨平台性呢? 另外还有一种说法, 因为java有了可移植性, 那么才有了可跨平台性, 大意是,跨平台会遇到上述的字节顺序等问题, 而解决了这些问题, 那么就让java具有了可移植性, 在具有了可移植性后, 再结合java虚拟机, 那么就让java虚拟机具有跨平台性了. 具体这一块是怎么回事, 没有弄明白, 以后看到相关资料时, 再做修改..
8, 解释型: java解释器可以在任何移植了解释器的机器上执行java字节码. (关于"由于链接是一个增量式且轻量级的过程, 所以, 开发过程也变得更加快捷, 更加具有探索性, 增量式链接有其优势, 但给开发过程带来的好处言过其实了, 事实上, 早期的java开发工具的速度相当慢, 现在即时编译器将字节码翻译成机器码" 这段话不明白, 后续看其它书籍看到相关资料再回来修改).
9, 高性能: 关于这一点压根儿没明白, 一直只知道java 和C/C++比起来性能要低, 怎么还说java有高性能呢??? 书中的"尽管对解释后的字节码性能已经比较满意, 但在有些场合下还需要更加高效的性能. 字节码可以(在运行时刻)快速地翻译成运行这个应用程序的特定CPU的机器码. 使用java的头几年, 许多用户不同意这样的看法:性能就是'适应性更强'. 然而, 现在的即时编译器已经非常出色, 以至于成了传统编译器的竞争对手. 在某些情况下, 甚至超越了传统编译器, 其原因是它们含有更多的可用信息. 例如, 即时编译器可以监控经常执行哪些代码并优化这些代码以提高速度. 更为复杂的优化是消除函数调用(即'内嵌'). 即时编译器知道哪些类已经加载. 如果基于当前加载的类集, 且特定的函数不被覆盖的话就可以内嵌. 必要时, 还可以撤销优化" 这段话完全是看得云里雾里.
10.多线程: 多线程可以带来更好的交互响应和实时行为. 而java对多线程的处理相对其它语言编写多线程应用程序要便捷的多. 只要操作系统支持, java中的线程就可以利用多个处理器. 在底层, 主流平台的线程实现机制各不相同, java并没有花大力气对此实现平台无关性. 在不同的平台上, java 调用多线程的代码完全相同 , 而多线程的真正实现交给了底层的操作系统或线程库来完成. 尽管java没有花大力气对多线程实现平台无关性, 但java中多线程编译的简单性是java成为颇具魅力的服务器端开发语言的主要原因之一.
11.动态性: 从各个角度看, java与C或C++相比更加具有动态性, 它能够适应不断发展的环境, 库中可以自由添加新方法和实例变量, 而对客户但却没有任何影响. java的动态性, 可以让在java中找出运行时类型信息十分简单. 当需要将某些代码添加到正在运行的程序中时, 动态性是一个非常重要的特性. 在java1.0中, 如果从internet上下载代码, 然后在浏览器上运行, 不能直接获取运行时的类型信息, 而在java的当前版本(当前版本指的是1.7, 不知道是否1.0之后的版本都能够获取)允许程序员知道对象的结构和行为, 这对于必须在运行时分析对象的系统来说非常有用, 这些系统有: java GUI构建器, 只能调试器, 可插拔组建以及对象数据库.
上面说了这么多, 感觉都比较抽象. 很多东西不理解. 不过这些东西对于自己来说, 没有太多实际意义, 因此不用多深究.