Java 精髓

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从宏观上看,编程技术的发展在一定程度上映射了历史的发展。正如人类社会起源于极其简单的原始社会,早期的编程技术具有同样的规律;正如伟大的文明要经历萌芽、繁荣和衰落的过程,编程语言也同样会经历这些过程。国家的兴亡交替促进了人类的进步。同样,编程技术也处于不断的新旧更替之中:新的编程语言取代原来的编程语言。纵观人类历史,总不乏一些关键性事件,例如罗马帝国的颠覆、1066年的不列颠入侵,还有第一次核爆炸,它们都彻底改变了原来的世界。对于编程语言来说,虽然变革的规模较小,但同样改变了编程技术的发展进程。例如,FORTRAN语言的发明彻底改变了计算机编程的方式。Java的发明,则是另一个重大事件。

Java是标志编程进入Internet时代的里程碑。Java的设计初衷就是用来创建可以在Internet 上随处运行的应用程序,其“一次编写,随处运行”的理念定义了一种新的编程规范。Gosling 等人最初将其视为小型问题的解决方案,但后来却成为下一代程序员规划编程前景的动力。Java从根本上改变了人们对于编程的认识,因此计算机语言的发展历史可划分为两个时代:Java前时代和Java后时代。

Java前时代的程序员编写在单机上运行的程序;而Java后时代的程序员则为分布式网络环境编写程序。程序员不再只考虑单机的需求;相反,如今“网络就是计算机”的理念非常流行,程序员应该以服务器、客户端和主机的概念进行思考。

虽然Java的发展是由Internet所驱动的,但Java决不只是一种“Internet语言”。相反,它是一种特征(featuree)完备、为现代网络世界设计的通用编程语言。这意味着Java适合于几乎所有类型的编程。尽管有时候Java受限于网络性能,但它仍然包容了许多推进编程技术发展的新特征。这些特征不断影响着如今的计算模式。例如,Java提出的许多原理后来被C#所模仿。

本书将通过各种类型的应用程序来全面阐述Java语言的功能。其中一些应用程序展示了Java语言独立于网络属性(attribute)的强大功能,即所谓“纯代码”的范例,因为它们展示了Java语法的表示方法和设计思想。一些应用程序展示了如何使用Java语言及其API类简化复杂的网络编程。所有这些应用程序都说明了Java语言的强大功能和广泛应用范围。

在开始本书的Java教程之前,本章会用一些篇幅指出Java的一些特征,它们是Java作为一种优秀编程语言的标志。同时,这些特征也是将本章命名为“Java精髓”的原因所在。

1.1 简单数据类型和对象:完美的平衡

设计一种面向对象语言所面临的最大挑战,就是如何平衡对象和简单数据类型之间的抉择。从纯理论的观点来看,每种数据类型都应该是一个对象,并且都应该从一个共同的父对象派生而来。这就使得所有数据类型以相同的基本模式运作,共享一个公共的基类属性集合。现在的问题在于,如果将简单数据类型(如int和double)作为对象处理,那么对象机制所引起的额外开销会导致性能(performace)的下降。由于简单数据类型通常用于循环控制和条件语句,所以这些额外开销将带来广泛的负面影响。诀窍就是如何在“一切都是对象”的理想和“性能衡量”的现实之间找到正确的平衡点。

Java非常巧妙地解决了对象与简单数据类型之间的问题。首先,Java定义了8种简单类型:byte、short、int、long、char、float、double和boolean。这些类型能够直接转换为二进制代码。因此,CPU可以直接处理int类型的变量,而无需任何额外开销。在Java中,处理简单数据类型和其他语言一样快速高效。因此,由int类型变量所控制的for循环可以高速运行,而不受任何对象化所带来的负面影响。

除了这些简单数据类型,Java中的其他数据类型都从一个共同超类(Object类)派生而来。因此,所有这些数据类型都共享从父类继承而来的方法和属性集。例如,所有对象都有toString()方法,因为toString()是父类Object中定义的方法。

由于简单数据类型不是对象,因此Java可自由地以略有不同的方式处理对象和非对象。这

就是Java的真正精髓所在。在Java中,所有对象都通过引用访问,而非直接访问;只有简单数据类型才可以直接访问。因此,Java程序绝对不会直接操作一个对象。这种策略可以带来很多好处,最直接的好处就是能够高效地实现垃圾回收。因为所有对象都通过引用访问:当一个对象没有被引用时,它将被回收。另一个好处是,每个Object类型的指针可以引用系统中的任何对象。

当然,通过引用访问对象将产生额外开销。因为一个引用实际上是一个地址(即指针)。于是对每个对象的访问不是直接进行的,而是通过地址间接完成的。尽管现代CPU可以高效地处理间接访问,但是间接访问总是不如直接处理数据本身快,简单数据类型即是通过直接方式进行的。

尽管简单数据类型的处理非常高效,但是有些时候仍然需要使用跟某个简单类型等价相当的对象。例如在运行时创建一个整型链表,并在不再使用时将其回收(垃圾回收)。为了处理此类情况,Java定义了为简单类型(如Integer和Double)定义了包装器(wrapper),例如Integer 和Double。这些包装器使得简单类型在必要时可参与到对象层次的操作中来。Java关于对象和简单数据类型的平衡问题。它支持编写高效程序,同时又完美地解决了允许实现对象模型,而不用担心对简单数据类型的性能会产生负面影响。

1.2 通过垃圾回收实现内存管理

垃圾回收作为一种内存管理技术已经存在了很长时间,但是Java使它焕发出崭新的活力。在C++等语言中,内存必须人工管理,程序员必须显式地释放不再使用的对象。这是问题产生的根源,因为忘记释放不再使用的资源,或者释放了正在使用的资源都是很常见的事情。Java代替程序员完成了这些工作,从而防止了此类问题的发生。在Java中,所有的对象都是通过引用访问的,这样,当垃圾回收器发现一个没有引用的对象时,就知道该对象已经不被使用,并且可以回收了。如果Java允许对象的直接访问(与简单数据类型的访问方式类似),那么这种有效的垃圾回收方法将无法实现。

Java的垃圾回收策略在普遍意义上反映了Java的理念。Java设计人员花费了大量的精力,来防止其他编程语言经常出现的典型问题,例如程序员经常忘记释放资源,或者错误地释放正在使用的资源。因此,使用垃圾回收策略有效地避免了此类问题的发生。

1.3 完美的简单多线程模型

Java的设计者所提供的编程特性,包括对多线程多任务的语言级支持。多任务具有两种类型:基于进程的多任务和基于线程的多任务。在基于进程的多任务中,最小的可调度单元是进程。进程实际上就是正在执行的一个程序。因此,基于进程的多任务就是允许计算机同时运行两个或多个程序的特性。在基于线程的多任务中,最小的可调度单元是线程。线程定义了一个程序内的某条执行路径。因此,一个进程可以包含有两个或更多的执行线程,而多线程程序可以有两个或更多个可以并发执行的部分。

尽管基于进程的多任务通常是操作系统提供的功能,基于线程的多任务却可以极大地受益于语言级程序设计语言级别的支持。例如,C++没有对多线程编程提供内置支持,于是就必须依赖于操作系统来处理多线程任务。这就意味着创建、启动、同步和结束线程都必须通过对操作系统的多次调用来实现。因此C++中的多线程代码是不可移植的。这也使得C++编程中的多线程没有得以广泛应用。

由于Java内置了对多线程的支持,哪些在其他语言中必须由手工完成的工作,现在都可以由Java自动处理。Java多线程模型中最有特色的部分之一,就是其实现同步的方式。同步建立在两种创新的特性之上。首先,在Java中,所有的对象都有充当互斥锁的内置侦听器。在给定的时刻,任何侦听器只能由一个线程拥有。通过使用synchronized关键字对方法进行修饰,可以启用锁定特性。在调用同步方法时,该对象就被锁定,而试图访问该对象的其他线程就只能等待。其次,Java对同步的支持也可以从所有类的共同超类Object中体现。

相关文档
最新文档