第一篇 Java技术入门
第1章 Java语言概述
本章主要介绍什么是Java语言,以及Java语言具有哪些特点。在讲解的时候,为了能突出Java语言的特点,详细地分析了它与C/C++语言的区别。另外,本章还为初学者特意安排了一节,针对如何学习Java语言,提出了一些中肯的建议。
本章主要介绍的内容有:
❑Java语言与C、C++语言的区别
❑Java语言的特点
❑Java的不同版本
❑面向对象程序设计的原理
1.1 Java的语言特点
Java是由Sun公司开发的一种语言,是一种面向对象的编程语言。它在很多方面与C/C++相似,但在实际编程时又有很多区别。下面通过对它们的比较,来了解Java语言的特点。
1.1.1 Java语言与C/C++的区别
首先应该清楚,Java是由C++发展而来的,保留了C++的大部分内容,其编程方式也类似于C++。但Java的句法更清晰、规模更小、更易学。Sun公司对多种程序设计语言进行了深入研究,摒弃了其他语言的不足之处,最终开发出了Java。正因为这样,Java从根本上解决了C++的固有缺陷,形成了一种新的完全面向对象的语言。
Java和C/C++的相似之处多于不同之处,有C/C++语言基础的读者,学习Java会更容易。相比较而言,Java的编程环境更为简单。因篇幅所限,这里不能列出全部的不同之处,仅列出一些比较显著的区别。
❑指针:Java没有指针的概念,从而有效地防止了在C/C++语言中容易出现的指针操作失误的问题(如指针悬空所造成的系统崩溃)。在C/C++中,指针操作内存时,经常会出现错误。在Java中没有指针,更有利于保证Java程序的安全。
❑多重继承:C++支持多重继承,它允许多父类派生一个子类。也就是说,一个类允许继承多个父类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。所以Java不支持多重继承,但允许一个类实现多个接口。可见,Java既实现了C++多重继承的功能,又避免了C++的许多缺陷。
❑数据类型:Java是完全面向对象的语言,所有方法和数据都必须是类的一部分。除了基本数据类型之外,其余类型的数据都作为对象型数据。例如对象型数据包括字符串和数组。类将数据和方法结合起来,把它们封装在其中,这样每个对象都可实现具有自己特点的行为。而C++将函数和变量定义为全局的,然后再来调用这些函数和变量,从而增加了程序的负担。此外,Java还取消了C/C++中的结构和联合,使编译程序更简洁。
❑自动内存管理:Java程序中所有的对象都是用new操作符建立在堆栈上的,这个操作符类似于C++的“new”操作符。Java自动进行无用内存回收操作,不需要程序员手工删除。当Java中的一个对象不再被用到时,无须使用内存回收器,只需要给它加上标签以示删除。无用内存的回收器在后台运行,利用空闲时间工作。而C++中必须由程序释放内存资源,增加了程序设计者的负担。
❑操作符重载:Java不支持操作符重载。操作符重载被认为是C++的突出特征。在Java中虽然类可以实现这样的功能,但不支持操作符重载,这样是为了保持Java语言尽可能简单。
❑预处理功能:C/C++在编译过程中都有一个预编译阶段,即预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。Java允许预处理,但不支持预处理器功能,因为Java没有预处理器,所以为了实现预处理,它提供了引入语句(import),该语句与C++预处理器的功能类似。
❑Java不支持默认函数参数而C++支持:在C语言中,代码组织在函数中,函数可以访问程序的全局变量。C++中增加了类,提供了类算法,该算法是与类相连的函数,C++中的类方法与Java中的类方法十分相似。由于C++仍然支持C语言,所以C++程序中仍然可以使用C语言的函数,结果导致函数和方法混合使用,使得C++程序比较混乱。Java没有函数。作为一种比C++更纯粹的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中。事实上,用方法实现例行程序可激励开发人员更好地组织编码。
❑字符串:C和C++不支持字符串变量,在C和C++程序中使用“Null”终止符代表字符串的结束。在Java中字符串是用类对象(String和StringBuffer)来实现的,在整个系统中建立字符串和访问字符串元素的方法是一致的。Java字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分。此外,Java还可以对字符串用“+”进行连接操作。
❑goto语句:“可怕”的goto语句是C和C++的“遗物”。它是C/C++语言技术上的合法部分,但引用goto语句造成了程序结构的混乱,不易理解。goto语句一般用于无条件转移子程序和多结构分支技术。Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,这使程序更简洁易读。
❑类型转换:在C/C++中,有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在C++中可将一个浮点值赋予整型变量,并去掉其尾数。Java不支持C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
1.1.2 Java面向对象的特性和多态性
Java是一种跨平台、适合于分布式计算机环境的面向对象编程语言。具体来说,它具有如下特性:简单性、面向对象、分布式、解释性、可靠、安全、平台无关、可移植、高性能、多线程、动态性等。下面将重点介绍Java语言的面向对象、平台无关、分布式、多线程、可靠和安全等特性。
面向对象其实是现实世界模型的自然延伸。现实世界中的任何实体都可以看作是对象,对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心,以算法为驱动的话,那面向对象的编程语言就是以对象为中心,以消息为驱动。用公式表示,过程式编程语言为:“程序=算法+数据”;面向对象编程语言为:“程序=对象+消息”。
所有面向对象编程语言都支持3个概念:封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为映射到计算机程序上。属性表示对象的数据,行为则表示对象的方法。
封装是用一个自主式的框架,把对象的数据和方法连接在一起,形成一个整体。对象支持封装,是封装的基本单位。Java语言的封装性较强,因为Java无全程变量,无主函数。在Java中,绝大部分成员是对象,只有简单的数字类型(字符类型和布尔类型除外)。对于这些类型,Java提供了相应的对象类型包装,以便与其他对象交互操作。有关封装的原理如图1.1所示。
多态性就是多种表现形式。具体来说,可以用“一个对外接口,多个内在实现方法”表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型、浮点型或字符型。不管存储的是何种数据,堆栈的算法实现都是一样的。针对不同的数据类型,编程人员不必手工选择,只需要使用统一方法名(参数不同),系统便可以自动选择。运算符重载一直被认为是一种优秀的多态机制体现。由于考虑到运算符重载会使程序变得难以理解,所以Java最终还是把它取消了。有关多态的原理如图1.2所示。
图1.1 封装的原理示意图
图1.2 多态的原理示意图
继承是指一个对象直接使用另一个对象的属性和方法。事实上,现实生活中遇到的很多实体,都具有继承的含义。例如,把汽车看成一个实体,它可以分成多个子实体,如轿车、公交汽车等。以上子实体都具有汽车的特性,因此汽车是它们的“父亲”,而这些子实体则是汽车的“孩子”。子类可以继承父类的属性和方法。与其他面向对象编程语言不同,Java只支持单一继承。有关继承的原理如图1.3所示。
图1.3 继承的原理示意图
1.1.3 Java的平台无关性
Java的平台无关性是指用Java写的应用程序不用修改,就可以在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C/C++具有一定程度的源代码级平台无关。源代码级平台无关表明了用C/C++写的程序无需修改,只需重新编译就可以在不同平台上运行。
Java主要靠Java虚拟机JVM(Java Virtual Machine),与目标代码及实现平台无关。JVM是一种抽象机器,附着在具体操作系统之上。它本身具有一套虚拟机器指令,并有自己的栈、寄存器组等。JVM通常是在软件上而不是在硬件上实现的。
目前,Sun系统公司已经设计实现了Java芯片,这些芯片主要使用在网络计算机上。另外,Java芯片的出现也会使Java更加容易嵌入到家用电器中。在JVM上,有一个Java解释器,用它来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器,将Java源程序编译为JVM的字节代码。任何机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。有关Java平台无关性的原理如图1.4所示。
图1.4 Java平台无关性示意图
另外,Java采用的是基于IEEE标准的数据类型,通过JVM保证数据类型的一致性,也确保了Java的平台无关性。
Java的平台无关性具有深远意义。首先,它的出现使编程人员梦寐以求的事情变成了事实,这将大大地加快和促进软件产品的开发。其次,Java的平台无关性正好迎合了“网络计算机”的思想。
如果常用的应用软件都使用Java重新编写,并且放在某个Internet服务器上,那么具有网络计算机的用户,将不需要占用大量空间安装软件,他们只需要一个Java解释器,每当需要使用某种应用软件时,下载该软件的字节代码即可,其运行结果也可以发回服务器。目前已有数家公司开始使用这种新型的计算机模式,以构筑自己的信息系统。
1.1.4 Java分布式应用和多线程的特点
本节讲述Java程序的分布式和多线程的特点。分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上。操作分布是指把一个计算分散在不同主机上处理。
Java支持客户机/服务器计算模式,因此它支持这两种分布。对于数据分布,Java提供了一个叫做URL的对象,利用这个对象,可以打开并且访问具有相同URL的对象,访问方式与访问本地文件系统相同。对于操作分布,Java的Applet小程序可以从服务器下载到客户端,即部分计算在客户端进行,以提高系统执行效率。有关分布式的原理如图1.5所示。
图1.5 分布式示意图
Java提供了一整套网络类库,开发人员可以利用这些类库进行网络程序设计,方便地实现Java的分布式特性。
线程是操作系统的一种新概念,又被称做轻量进程,是比传统进程更小的,并且可以并发执行的单位。C/C++采用单线程系统结构,而Java提供了多线程的支持。
Java在两方面支持多线程:
1)Java环境本身就是多线程的。若干个系统线程运行,负责必要的无用单元回收、系统维护等系统级操作。
2)Java语言内置多线程控制,可以大大简化多线程应用程序的开发。
Java提供了一个Thread类,由它负责启动、运行、终止线程,并且可以检查线程状态。Java线程还包括一组同步原语,这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便地写出支持多线程的应用程序,从而提高程序执行的效率。Java的多线程在一定程度上受运行时所在平台的限制。如果操作系统不支持多线程,那么Java程序的多线程特性就不能表现出来。
1.1.5 Java程序的可靠性、安全性
本节将详细讲述Java的可靠性和安全性。Java最初的设计目的是用于电子类消费品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++不可靠的因素,可以避免许多编程错误。
它的可靠性和安全性表现在如下几点:
❑Java是强类型的语言,要求用显式的方法声明。这样保证了编译器可以发现方法调用错误,保证程序更加可靠。
❑Java不支持指针,杜绝了内存的非法访问。
❑Java的自动单元收集功能,可以防止内存丢失等动态内存分配导致的问题。
❑Java解释器运行时实施检查,可以发现数组和字符串访问越界。
❑Java提供了异常处理机制。程序员可以把一组错误代码放在一个地方,这样可简化错误处理任务,便于恢复。
由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制,防止了病毒程序的产生,以及下载程序对本地系统的威胁破坏。
当Java字节码进入解释器时,首先必须经过字节码校验器的检查,然后Java解释器将决定程序中类的内存布局。随后,类装载器负责把来自网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏。最后,客户端用户还可以限制从网络上装载的类只能访问某些文件系统。上述几种机制结合起来,使得Java成为安全的编程语言。
1.1.6 Java小程序和应用程序
用Java可以写两种类型的程序:小程序和应用程序。小程序就是指嵌入在网页文档中的Java程序,而应用程序就是指在命令行中运行的程序。对Java而言,对小程序的大小和复杂性都没有限制。事实上,Java小程序在有些方面比Java应用程序更加强大。目前,由于Internet通信速度有限,因此大多数小程序规模较小。小程序和应用程序之间的技术差别就在于运行环境。Java应用程序运行在最简单的环境中,它的唯一外部输入就是命令行参数。另一方面,Java小程序需要来自Web浏览器的大量信息。它需要知道何时启动、何时放入浏览器窗口、何处和何时激活关闭等。运行环境不同的是Java应用程序和Java小程序这两类程序最大的不同。
1.2 Java的不同版本
Java拥有不同的版本,各种版本适合在什么样的场合使用呢?下面将详细介绍这些版本。
❑Java Developers Kits(JDK):JDK是指Java开发工具箱,是Sun公司发布的Java最初版本。自从Java 1.2发布后,Java改名为Java 2,相应的JDK也就改名为J2SE。
❑Java SDK Micro Edition(J2ME):此版本用来开发掌上电脑、手机等移动通信设备。现阶段,并不是所有移动设备都支持Java,只有具备其运行环境的设备才能运行它。
❑Java SDK Standard Edition(J2SE):主要用于开发一般的台式机应用程序,平时说的JDK其实就是指J2SE,本书也是围绕它来讲述的。
❑Java SDK Enterprise Edition(J2EE):用于开发分布式的企业级大型应用程序,其中的核心被称为EJB(Enterprise Java Beans)。
1.3 如何才能学好Java
如何学习Java?这个问题应该上升到如何学习程序设计这种境界。实际上,学习程序设计也可以说是接受一种编程思想。各种语言的程序设计思想都大同小异,只是有一些由语言特性而带来的细微差别,比如Java中的“Interface(接口)”,可能在以前的学习中没有碰到过。以下详细介绍几点:
❑必须明确一个大方向,也就是说在面向对象的编程范畴中,进行学习与研究。目前最流行的面向对象编程语言就是C++和Java,所以先锁定这两个目标。
❑掌握Java的精华特性,而且一定要知道为什么。比如,Interface和Multi-thread(多线程)。用Interface是更好地使用多继承的模型,而多线程则涉及并发的特性。要完全理解Interface是什么、用多线程有几种常用的编程模型等。
❑理解了语言的特性之后,就可以试着上升到设计这个层次,毕竟学习语言是为了应用。目前,比较好的开发模式是采用自顶向下、结合MVC模式的设计。首先要找出最顶层的对象(这往往是最难的),然后一层一层往下递归。所以说,一般有图形用户界面的程序应从界面开始设计。
❑有了基本设计模型后,可以学一些设计模式(Design Pattern)。设计模式有很多种,比如体系结构模式(分层Layering、管道或过滤器Pipe/Filter)、设计模式(如对象池Object Pool、缓冲池Cache等)、编程模式(比如Copy-on-Write)。掌握这些模式之后,就会对系统的整体结构有很好的把握。学术上倾向于一个系统完全由各种模式组合而成。
❑学习语言最好的方法就是实践。一般来说学习教科书上的例子并不能算是实践,只能算是掌握了语言的特性。而提倡做实际的项目(Project)也不是太好,因为还没有足够的能力去综合各种技术,这样只能使自己越来越迷糊。笔者认为比较好的方法是找一些经典的例子,对其进行进一步的修改。通过修改,找出觉得可以提高性能的地方,再加上自己的设计,这样才能真正有所收获。
1.4 什么是面向对象的程序设计
面向对象的程序设计语言有很多种,除Java之外,还有很多编程语言,例如大家熟悉的C++、C#等。本节将详细介绍面向对象的一些特征和概念。
1.4.1 什么是面向对象
面向对象程序的开发需要考虑多个对象及其相互间的关系。下面的实例就是由类Max完成求最大值的功能。面向对象的另外一个好处是实现代码的重复使用,如果其他程序需要求最大值的功能,只要通过类Max的对象就可以达到目的。而面向过程的程序设计中,把求最大值的算法都实现在该代码段中,就无法再复用。
早期的编程语言如Fortran、C语言基本上都是面向过程的语言,其编程的主要思路专注于算法的实现,例如下面是一个面向过程的求正整数最大值的程序:
//最大值maxSoFar的初始值为0,price是输入的值 //while循环输入price的值 //输入的值price大于最大值,则maxSoFar的值为price的值 //继续输入price //把字符串input转换成整数 //打印最大值maxSoFar int maxSoFar=0,price=1; while(price>0) { if(price>maxSoFar) maxSoFar=price; String input=JoptionPane.showInputDialog("Enter the next price"); price=Double.parseDouble(input); } System.out.println("The maximum is "+maxSoFar); }
上述程序段主要实现了求最大值的算法,但如果考虑用面向对象的编程,可以使用另外一种方式:
//max1是类Max的一个对象 //对象max1调用updateMax()方法,更新最大值 //对象max1调用getPrice()方法获得下一个price的值 //对象max1调用getMax()方法获得最大值,并打印出来 while(price>0) { max1.updateMax(price); price=max1.getPrice(); System.out.println("The maximum is "+max1.getMax()); }
1.4.2 模型分析:造房子
面向对象的程序设计其实就像是造房子,每一块砖瓦和木材都可以看成是一个对象,当这个房子被拆掉后,每一块砖瓦还可以拿来重新使用。也就是说,如果需要更改程序,前面设计的有些类,仍然可以被再次使用。
而编写程序时,也可以将某些实现方法或某些类型设计成一个类,然后在这些类中构造一些对象。在程序需要调用这些对象时,就调用它。这样,对于一个程序来说,不会牵一发而动全身。如果某个对象中有些变化,只需要改变这个类就可以,而整个程序不需要经过大的改变,其原理如图1.6所示。
图1.6 造房子模型原理图
所以,面向对象其实就是将每一个事物看做是一个对象,而这些对象可以被反复调用。当做另一件事情时,如果用到这个对象,就可以直接调用。
1.4.3 设计面向对象程序的思路
纯粹的面向对象程序设计方法如下:
❑所有的东西都是对象,可以将对象想象成一种新型变量,它保存着数据,而且还可以对自身数据进行操作。例如在上面的例子中,类Max中保留着数据的最大值,同时还有updateMax()方法,它根据新加入的price值产生新的最大值。另外,还有getMax()方法返回数据的最大值。
❑程序是一大堆对象的组合,通过消息传递,各个对象知道自己应该做什么。如果需要让对象做些事情,则需向该对象发送一条消息。具体来说,可以将消息想象成一个调用请求,它调用的是从属于目标对象的一个方法。
❑每个对象都有自己的存储空间,可容纳其他对象,或者说通过封装现有的对象,产生新型对象。尽管对象的概念非常简单,但经过封装后,却可以在程序中达到任意高的复杂程度。
❑每个对象都属于某个类,每个对象都是某个类的一个“实例”。
1.4.4 设计面向对象程序的技巧
下面主要介绍面向对象编程的一些小技巧。
❑要学会将实际生活中的事物抽象为一个类。
❑学会将类中各种各样的概念运用到设计中。
❑要学会将整个程序模块化。
❑要学会尽量减少类与类之间的联系,防止一变都变的情况发生。
1.4.5 面向对象与面向过程设计的不同
本节通过介绍两种类型的语言的不同设计原理,让读者学习如何设计更好的程序。
1. 过程式设计
总的来说,过程式的程序设计是一种自上而下的设计方法,设计者用一个main()函数,概括出整个应用程序需要做的事。main()函数由对一系列子函数的调用组成,其中的每一个子函数,都又可以再被拆分成更小的函数。过程式设计通过重复这个过程,就可以完成一个过程式的设计。过程式的特征是以函数为中心,用函数作为划分程序的基本单位。数据在过程式设计中,往往处于从属的位置,其结构可以使用如图1.7所示的示意图来表示。
过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法,与大多数人的思维方式比较接近。然而,过程式设计对于比较复杂的问题,或是在开发中需求变化比较多的问题,往往显得力不从心。因为过程式的设计是自上而下,这就要求设计者在开始时要对需要解决的问题有一定的了解,然而在问题比较复杂的时候,要做到这一点会比较困难。当开发需求变化的时候,以前对问题的理解会变得不再适用。
图1.7 过程式设计的示意图
事实上,开发一个系统的过程,往往也是一个对系统不断了解和学习的过程,而过程式的设计方法忽略了这一点。
在过程式设计的语言中,既有定义数据的元素(如C语言中的结构),也有定义操作的元素(如C语言中的函数),这样做的结果是数据和操作分离,导致对一种数据的操作分布在整个程序的各个角落,一个操作也可能会用到很多种数据。这种情况下,对数据和操作的任何一部分进行修改,都会变得很困难。
在过程式设计中,设计者是在main()函数中,对整个系统进行一个概括的描述,再以此为起点,逐步细化出整个应用程序。假设编写一个图形界面的计算器程序和一个命令行界面的计算器程序,可以想象这两个版本的main()函数会有多大的差异,由此衍生出的程序也会迥然不同。而这两个版本的程序,本应该有很大部分可以共用,这也就是过程式程序设计的一大弊病。
2. 面向对象设计
面向对象是一种自下而上的程序设计方法,它不像过程式设计那样,一开始就要用main()函数概括出整个程序。面向对象设计往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计以数据为中心。类作为表现数据的工具,是划分程序的基本单位,而函数在面向对象设计中,是类的接口。面向对象程序设计的模式如图1.8所示。
图1.8 面向对象设计的模式
面向对象设计自下而上的特性,允许开发者从问题的局部开始,在开发过程中逐步加深对系统的理解。这些新的理解以及开发中遇到的需求变化,都会再作用到系统开发本身,形成一种螺旋式的开发方式。在这种开发方式中,对于已有的代码,常使用代码重构的技术,从而体现系统的变化。
和函数相比,数据应该是程序中更稳定的部分。比如一个网上购物程序,无论怎么变化,大概都会处理货物、客户这些数据对象。但是,从抽象的角度看,数据不是稳定的,如果考虑这些数据对象的具体实现,它们甚至比函数还要不稳定。这是由于在一个数据对象中,增减字段是程序开发中的常事。在以数据为中心构建程序的同时,需要一种手段来抽象地描述数据,这种手段就是使用函数。
在面向对象设计中,类封装了数据,而类的成员函数作为其对外的接口,抽象地描述了类。用类将数据和操作这些数据的函数放在一起,就是面向对象设计方法的本质。
在面向对象设计中,类之间的关系有两种:客户(Client)关系和继承(Inheritance)关系。客户关系,表示一个类(Client)会使用到另一个类(Server),一般将这种关系中的Client类称为客户端,Server类称为服务器。继承关系,表示一个类(Child)对另一个类(Parent)的继承,一般将这种关系中的Parent类称为父类,Child类称为子类。
面向对象设计的过程,就是将各个类按以上的两种关系组合在一起。这两种关系都非常简单,组合在一起却能提供强大的设计能力。
1.5 常见面试题分析
1.5.1 初学者如何选择Java参考书
答:一个程序员如果没有半米多高的技术书堆,就没有人会认为他是真正的程序员。如何从眼花缭乱的开发丛书中,找到适合自己的书,也是一门学问。可参考以下几个方面来选择图书。
❑书评:比较成功的书籍在上市的前后,都会出现名家撰写的书评,这些书评包括对该书积极一面的评价,也有对书中内容的指摘。通过正反评价对比,相信可以帮助初学者做出购买的选择。
❑道听途说:口碑的重要性在现代社会中日益突出,如果真是一本好书,可能会在不同场合,听到不同的人对它相同的赞许,这就能体现该书的价值。
❑不要忘记旧书摊:这不是在鼓励怀旧,而事实是很多老书的质量较高,作者的写作态度非常严谨而又端正。对于多次重印和改版的书,也是值得考虑购买的对象。多版本说明作者对该书的精益求精和对新技术的更新,同时也反映了该书在市场上的受欢迎程度。
❑预先阅览:购买前最好是自己能够预先浏览,从朋友那里借也好,在网上看看电子版也好,只要自己喜欢,或是觉得有收藏的价值,就去购买它。
1.5.2 Java应用在哪些方面
答:Java的应用可以简单分为以下几个方面。
1. Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。
2. Java Web应用
Java的Web应用至少需要安装JDK和一个Web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为3层:
❑Browser层:浏览器显示用户页面。
❑Web层:运行Servlet/JSP。
❑DB层:后端数据库,向Java程序提供数据访问服务。
3. Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单的情况会分为4层:
❑Browser层:浏览器显示用户页面。
❑Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互。
❑Web层:运行Servlet/JSP。
❑EJB层:运行EJB,完成业务逻辑运算。
❑DB层:后端数据库,向Java程序提供数据访问服务。
4. Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域。嵌入式开发,需要下载J2ME开发包。J2ME包含了嵌入式设备专用虚拟机KVM,这和普通的JDK中包含的JVM有所不同。另外,还需要到特定的嵌入式厂商那里下载模拟器。
1.6 本章习题
一、选择题
1.以下( )不是面向对象的特点。
A.封装
B.多态性
C.继承
D.编译
2.以下( )不是Java的特点( )。
A.平台无关性
B.可靠性和安全性
C.指针
D.分布式应用和多线程
二、简答题
1. Java语言与C/C++语言的区别是什么?
2.什么是面向对象编程?