Java核心技术:没必要为了学Java而先去学C++

  Java可以从狭义和广义两个角度来看:狭义的Java就是指Java编程语言;广义的Java则是指从Java编程语言到Java EE(J2EE)等所构成的一个庞大的软件开发体系,此处称这个体系为一个平台。所谓平台,是指你可以基于这个平台使用Java编程语言进行软件开发。

  在C++之类的其他编程语言体系中,其实也同样有大量可复用的代码、程序库等,它们的差别主要在于C++没有把所有这些统一到一个像Java样的大帽子下面,并且为这个大帽子下面的架构统一制定大量的标准规范。

  作为初学者,你不妨先不要管Java为何被视为一个“平台”,可以先从狭义上把Java作为一种编程语言学起,等掌握了作为程序语言的Java后,再来理解“平台”的含义也不迟。

  Java的语法参照了C++的语法,与C++非常接近,所以熟悉C++的程序员再来学习Java会觉得非常容易入手,但是熟悉C++的程序员也要特别注意C++和Java之间的差别,C++既会为你的Java学习带来帮助,也会带来很大混淆。

  当然,对于没有学习过C++的人来说,没有必要为了学习Java而先去学习C++。

  Simple(简单)的简单总结:

  ① 与C++相比,Java的确是更加简单了,没有了指针、操作符重载、多继承之类复杂的东西,增加了垃圾自动回收机制。

  ② 相对于VB(即Visual Basic)这样的可视化开发环境来说,其实Java并不简单,反而要复杂很多。在VB中,微软自动帮我们做了很多事情,我们只需要拖曳一些控件并编写简单的代码,就可以实现一些功能简单的程序。而使用Java,很多事情需要你手工编写代码来实现。这正是在Windows桌面程序方面,Java一直不敌微软阵营的一个重要原因。

  ③ 随着Java的发展,各种新的规范开始推出,尤其是近些年各种Java框架的大量涌现,Java世界已经变得非常复杂。Java程序语言并不是很难学,但是要想在Java各种纷繁的规范、类库、框架中做到游刃有余,还是需要花一番工夫的。

  如此强大的Java体系简单又能简单到哪去呢?一种程序语言而已,难又能难到哪去呢?既然已经上路,简单与难已经不重要,认真学下去,把握它才是关键!

  面向对象的确已经成为现代编程语言的核心,Java也不例外。所以学习Java程序语言,对面向对象的理解自然是重中之重。

  尽管各种编程语言的设计者对于面向对象的一些事情诸如多继承之类争论不休,但是从总的来看,它们在面向对象的基本思想和套路上还是大同小异的。如果你已经掌握了其他面向对象的编程语言,对Java完全可以触类旁通。

  Java从基本语言的层面,更确切地说,是从JDK(Java Development Kit,即Java开发工具包)层面为开发者提供了基本的、标准的并且是跨平台的网络类库,这应该说是其相对于C++等编程语言的重大突破。如果你是使用C++等编程语言,就需要使用操作系统提供商或者第三方网络接口开发包。

  又是著名的C/C++指针以及内存管理机制问题。Java中没有类似C中的指针类型,加上Java提供的自动垃圾回收机制,从而可以让你很好地避免出现类似C/C++中因失误造成内存泄漏的问题。

  当然,另一方面,C/C++的指针以及内存管理机制为编程带来了一些非常灵活而强大的特性。只是这些特性使用起来比较难于驾驭,容易出错,所以说,凡事都有两面性。

  Java的Applet相对于微软的ActiveX来说,在安全性上具有非常明显的优势。主要原因在于Java的Applet能够更好地验证代码的来源,以及通过沙箱等对程序的访问进行了限制,例如:禁止对本地磁盘的读写,除了下载此Applet的主机外,不能与任何别的主机连接,禁止建立一个新的进程,禁止载入一个直接调用本地方法的新的动态库等。

  不过,无论是Applet还是ActiveX,虽然还有一些使用者,但是发展到今天,已经不是Web开发的主流,只有在满足一些特殊需求时才有用武之地。

  Java采用了这样的机制:Java源代码编译后生成的Bytecode形式的类文件不能直接在操作系统上执行,必须由Java虚拟机(JVM)来解释执行。

  采用这种机制具有两个比较明显的缺点,一是因为编译后的Java类文件不能直接在CPU上执行,而是由虚拟机在运行时解释执行,导致程序运行效率的降低;二是要运行任何Java程序(无论是简单的还是复杂的程序),都必须安装Java的运行环境(Java Runtime Environment ,JRE),以便由JVM来解释执行Java程序。

  采用这种机制的优点则主要在于使Java程序具有很好的跨平台可移植性,Java的“一次编译,到处运行”正是通过这种机制实现的。简单地说,就是因为Java的编译并不是“彻底编译”,只完成了一部分编译工作,只生成了一种中间编译产物(Bytecode形式的Java类文件),没有把程序编译到操作系统可执行的二进制代码,剩余的与操作系统相关的“编译”工作则由不同操作系统上的虚拟机根据所处操作系统在程序运行时完成。

  从架构思想来说,Java的这种设计体现了如今流行的分层思想,相对于C++等编程语言来说,Java增加了一个JVM层,由JVM层屏蔽各种操作系统的差异,向上层Java应用程序提供了统一的“接口”界面(即Bytecode形式的JVM指令集),从而使上层Java应用程序不再需要考虑JVM之下操作系统的差别。分层是架构设计中的一个重要思想,很多时候增加一层可以解决一些棘手的问题,而且分层并不是一个新鲜的概念,OSI/ISO七层网络协议就是分层架构的典型案例,分层即“问题分解”、“分而治之”之道。不过需要注意的是,随着层数的增加,很多时候会带来对程序性能的影响。设计的各个方面,比如灵活性和性能,相互之间很多时候是矛盾的,好的设计师需要考虑各种特性之间的平衡,能够以实际需求为出发点进行合理的取舍,找到最佳平衡点,而过分追求某一方面并不一定是好的设计,这可以理解为架构设计的平衡艺术。

  从商业的角度来看,可移植性具有非常重要的意义,一套程序只要在一个操作系统上开发一遍,就可以在各种操作系统上运行,而不需要再为每种操作系统进行专门的开发,从而节省了大量的投资。

  没有从事过多操作系统平台开发的人可能不太了解跨操作系统平台后会有什么问题,可能会问“比如Windows下有C++,UNIX下也有C++,都是C++,一样的程序为什么会有可移植性问题呢?”略举如下几种情况。

  ① 不同类型的操作系统上的可执行二进制码是不一样的,一个操作系统上的可执行程序直接复制到另一个不同类型的操作系统中是不能执行的,所以对于C/C++之类的程序语言编写的程序,即使程序代码不需要任何修改,在从一个操作系统迁移到另一类型的操作系统上时,至少要重新进行编译,以生成新操作系统上可执行的二进制文件。

  ② 在不同的操作系统上,线程操作、网络操作等API接口是不完全一样的,所以,如果在C/C++程序中使用了这些操作,当从一种操作系统迁移到另一种操作系统时,相应的API调用语句就必须进行修改,然后重新进行调试和编译。

  ③ 如本书作者所述,不同的操作系统对各种数据类型的表示是有差异的,当程序在不同类型的操作系统间进行远程调用时,就会产生混淆。

  Java通过虚拟机机制为可移植性提供重要的支持,针对上面三种情况的可移植性对策如下。

  ① Java编译生成的操作系统无关的Bytecode文件不是最终操作系统相关的二进制可执行文件,这些Bytecode文件对于任何平台上的虚拟机来说都是标准的,所以,在不同类型的操作系统之间迁移时,不需要重新编译(对于大型应用系统来说,程序编译也是一件非常复杂的事情)。

  ② Java直接从语言层面定义了标准的线程、网络等API,在任何操作系统上都一样,所以,不同的操作系统之间迁移也不需要修改API调用语句。

  ③ Java通过对操作系统层面差异的屏蔽,为我们在不同的操作系统上提供了统一的数据类型表示,从而不再有不同操作系统间数据类型不同带来的混淆。

  虽然Java提供了如此好的可移植性,但是在实际的系统移植中依然可能会遇到一些问题,这些问题可能来源于相关产品对规范遵循的不够或者是源于复杂的系统间调用,也可能来源于程序编写的不规范以及使用了一些非标准的特有的代码,所以,系统层面的可移植性不仅仅是使用一种高度可移植的程序语言能够完全保证的。

  对于服务器端(Server Side)应用来说,Java性能从来不是问题,它有着多线程技术的广泛使用,Java EE/J2EE应用服务器的支撑,以及可以运行于更稳定、更高效的UNIX、Linux服务器上,Java是高端服务器端应用的首选。

  而对于Windows桌面应用来说,Java开发的Windows程序在执行效率上至今仍然低于在微软开发平台上开发的Windows程序,不过相对于初期的Java已经有了很大的提高,特别是基于Eclipse SWT的Windows程序在执行效率上的提高更明显,而且基于Eclipse SWT的Windows程序开发已经在Java开发社区中形成一股浪潮。

  Java从程序语言层面提供了对多线程的支持,无须额外寻找线程库或多线程API;标准化了线程开发接口,并且简化了多线程开发,使多线程开发变得更容易。不过,即便如此,多线程的开发依然不是一件容易的事情,对多线程的理解,以及谨慎地开发仍然是非常重要的。

  Java编译后按照每个类一个文件的形式保存类文件,程序启动时不会装入全部类,只有在用到时才会按照类路径查找、装入类文件,这样我们可以随时加入新的类或者更新已有的类。这种动态机制和接口(Interface)的引入为使用Java进行构件化开发提供了重要的基础。

  J++显然是微软的一个失败,C#今天已经取得了非常大的成功。

  下面这部分内容对于初学者来说,还是很有价值的,注者在每一条后面加了一个概括性的评注,以便读者能快速阅读。

  Java和HTML没有任何直接的关系,更不是HTML的扩展。

  比较常见的Java和HTML在一起的情况有两种:一种是Java写的Applet要放到HTML页面中,在浏览器里运行;另一种是Java EE/J2EE中的JSP和Servlet经常会输出HTML形式的文本传输给浏览器用于显示。

  Java和XML各有各的用途,用了XML,并不说明是否需要Java。

  对于Java开发者来说,随着对Java的深入学习,掌握XML还是很有必要的。

  一方面,在实际的开发中,经常要在Java中对XML进行相关处理;另一方面,特别是进入Java EE/J2EE后,Java使用了很多XML技术,例如,部署描述符(或称部署描述器)等。

  虽然Java自称Simple(简单),但是,事实并非如此。即使只学Java程序语言,如果原来不了解面向对象,学习起来也很吃力。如果想精通Java,甚至包括精通广义上的Java平台,则更需要花一番工夫。

  虽然Java具有作为各种平台通用编程语言的特征,并且得到了除微软外的大多数厂商的认可,但是Java并不能一统天下。

  如前面所述,从狭义的角度来讲,Java的确是另一种编程语言。但是从技术角度,Java的成功并不是因为它是一种更好的编程语言,而在于其周围有一个全面的支持系统(support system),使得基于Java的开发更容易、更有效率。简单地说,Java的成功并不在于新设计了一种编程语言,而在于Java在广义上是一个平台,这个平台已经为你的开发准备好了各种工具和各种设施,甚至已经帮你搭建好了框架结构。

  各语言之间经常是相互学习的。C#诞生时从Java中学习了很多东西,后来Java在发展中也从C#中学习了很多东西。两者也各有特点,两个阵营也会在竞争中发展下去。所以说,Java或者C#都有其市场,学习哪一个编程语言都可以。如果两个都学,则更可融会贯通。设计C#的人懂Java,改进Java的人也会C#。

  到今天,已经有大量支持Java的厂商在Java上做了大量投入,而且正因为这些厂商的推动,Java才取得了今天的成绩,离开这个开放的基础,Java就很可能死掉,所以,不论Sun(已被Oracle收购)是否将Java的许可改成GPL(General Public License)形式,Java都会保持其开放性,我们都可以放心地使用Java。

  对于服务器端应用来说,对Java的性能无须有任何顾虑。对于Windows桌面应用来说,Java已经有了很大改善,尤其是基于Eclipse SWT的桌面应用。当然,使用Java开发的Window桌面应用性能上还没有达到完美的程度。

  只有Applet在Web浏览器中运行,其他Java程序一般独立运行或者在应用服务器中运行(Java EE/J2EE应用服务器实质上也是独立运行的Java程序)。

  没有绝对安全的系统。但是,相对于微软开发体系来说,Java在安全性方面要好很多。

  JavaScript和Java没有任何直接的关系。

  不过对于计划使用Java进行B/S应用系统开发的人员来说,学习掌握JavaScript还是非常有用的。AJAX等更是以JavaScript为基础。在浏览器端使用AJAX、JavaScript和HTML与用户交互,并将用户输入发送到服务器端,在服务器端使用Servlet、JSP等Java技术根据用户输入进行业务逻辑和数据处理,并将结果返回浏览器中,浏览器再通过AJAX、JavaScript和HTML将结果展示给用户,这就是一个完整的web应用实现过程。

即将转出来的那一面,是快乐或痛苦,是爱还是恨。

Java核心技术:没必要为了学Java而先去学C++

相关文章:

你感兴趣的文章:

标签云: