Java基础回顾(1)

本小结主要包括:
1.java语言特点
2.java技术框架的四个组成部分
3.java三大平台
4.java程序执行的几个阶段
5.java常见术语:JDK,JRE,JVM,以及七种常用命令


  一.java语言特点
   
1.简单  


Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单性主要体现在以下三个方面: 

1) Java的风格类似于C++,因而C++程序员是非常熟悉的。从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快就掌握Java编程技术。 

2) Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。 

3) Java提供了丰富的类库。 

2.面向对象 

面向对象可以说是Java最重要的特性。Java语言的设计完全是面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及重用。单从面向对象的特性来看,Java类似于Small Talk,但其它特性、尤其是适用于分布式计算环境的特性远远超越了Small Talk。 

3.分布式 

Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。为分布环境尤其是Internet提供的动态内容无疑是一项非常宏伟的任务,但Java的语法特性却使我们很容易地实现这项目标。 

4.健壮 

Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大缩短了开发Java应用程序的周期。Java提供Null指针检测数组边界检测异常出口字节代码校验。 

5.结构中立 

另外,为了建立Java作为网络的一个整体,Java将它的程序编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。现在,Java运行系统有Solaris2.4(SPARC),Win32系统(Windows95和WindowsNT)等.Java源程序被编译成一种高层次的与机器无关的byte-code格式语言,这种语言被设计在虚拟机上运行,由机器相关的运行调试器实现执行。 

6.安全 

Java的安全性可从两个方面得到保证。一方面,在Java语言里,象指针和释放内存等C++功能被删除,避免了非法内存操作。另一方面,当Java用来创建浏览器时,语言功能和浏览器本身提供的功能结合起来,使它更安全。Java语言在你的机器上执行前,要经过很多次的测试。它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及试图改变一个对象的类型。 

7.可移植的 

这句话一直是Java程序设计师们的精神指标,也是Java之所以能够受到程序设计师们喜爱的原因之一,最大的功臣就是JVM的技术。大多数编译器产生的目标代码只能运行在一 种CPU上(如Intel的x86系列),即使那些能支持多种CPU的编译器也不能同时产生适合多 种CPU的目标代码。如果你需要在三种CPU( 如x86、SPARC 和MIPS)上运行同一程序, 就必须编译三次。 

但JAVA编译器就不同了。JAVA编译器产生的目标代码(J-Code) 是针对一种并不 存在的CPU--JAVA虚拟机(JAVA Virtual Machine),而不是某一实际的CPU。JAVA虚拟机能掩盖不同CPU之间的差别,使J-Code能运行于任何具有JAVA虚拟机的机器上。 

虚拟机的概念并不AVA 所 特 有 的:加州大学几年前就提出了PASCAL虚拟机的概念;广泛用于Unix服务器的Perl脚本也是产生与机器无关的中间代码用于执行。但针对Internet应用而设计的JAVA虚拟机的特别之处在于它能产生安全的不受病毒威胁的目标代码。正是由于Internet对安全特性的特别要求才使得JVM能够迅速被人们接受。 当今主 流的操作系统如OS/2、MacOS、Windows95/NT都已经或很快提供对J-Code的支持。 

作为一种虚拟的CPU,JAVA 虚拟机对于源代码(Source Code) 来说是独立的。我们不仅可以用JAVA语言来生成J-Code,也可以用Ada95来生成。事实上,已经有了针对若干种源代码的J-Code 编译器,包括Basic、Lisp 和Forth。源代码一经转换成J-Code以后,JAVA虚拟机就能够执行而不区分它是由哪种源代码生成的。这样做的结果就是CPU可移植性。 将源程序编译为J-Code的好处在于可运行于各种机器上,而缺点是它不如本机代码运行的速度快。 

同体系结构无关的特性使得Java应用程序可以在配备了Java解释器和运行环境的任何计算机系统上运行,这成为Java应用软件便于移植的良好基础。但仅仅如此还不够。如果基本数据类型设计依赖于具体实现,也将为程序的移植带来很大不便。例如在Windows3.1中整数(Integer)为16bits,在Windows95中整数为32bits,在DECAlpha中整数为64bits,在Intel486中为32bits。通过定义独立于平台的基本数据类型及其运算,Java数据得以在任何硬件平台上保持一致。Java语言的基本数据类型及其表示方式如下:byte8-bit二进制补码short16-bit二进制补码int32-bit二进制补码long64-bit二进制补码float32-bitIEEE754浮点数double32-bitIEEE754浮点数char16-bitUnicode字符在任何Java解释器中,数据类型都是依据以上标准具体实现的。因为几乎目前使用的所有CPU都能支持以上数据类型、8~64位整数格式的补码运算和单/双精度浮点运算。Java编译器本身就是用Java语言编写的。Java运算系统的编制依据POSIX方便移植的限制,用ANSIC语言写成。Java语言规范中也没有任何"同具体实现相关"的内容。 

8.解释的 

Java解释器(运行系统)能直接运行目标代码指令。链接程序通常比编译程序所需资源少,所以程序员可以在创建源程序上花上更多的时间。 

9.高性能 

如果解释器速度不慢,Java可以在运行时直接将目标代码翻译成机器指令。Sun用直接解释器一秒钟内可调用300,000个过程。翻译目标代码的速度与C/C++的性能没什么区别。 

10.多线程 

多线程功能使得在一个程序里可同时执行多个小任务。线程--有时也称小进程--是一个大进程里分出来的小的独立的进程。因为Java实现的多线程技术,所以比C和C++更键壮。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh等),在开发难易程度和性能上都比单线程要好。任何用过当前浏览器的人,都感觉为调一副图片而等待是一件很烦恼的事情。在Java里,你可用一个单线程来调一副图片,而你可以访问HTML里的其它信息而不必等它。 

11.动态 

Java的动态特性是其面向对象设计方法的发展。它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一种成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从如下几方面采取措来解决这个问题。Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,一个在存储器生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定的。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。Java还简化了使用一个升级的或全新的协议的方法。如果你的系统运行Java程序时遇到了不知怎样处理的程序,没关系,Java能自动下载你所需要的功能程序。四.与C和C++语言的异同 Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C++安全性不好,但C和C++还是被大家所接受,所以Java设计成C++形式,让大家很容易学习。Java去掉了C++语言的许多功能,让Java的语言功能很精炼,并增加了一个很有用的功能,Java去掉了以下几个C和C++功能和特征:指针运算结构typedefs#define需要释放内存全局变量的定义这个功能都是很容易引起错误的地方。 

12. Unicode 

Java使用Unicode作为它的标准字符,这项特性使得Java的程序能在不同语言的平台上都能撰写和执行。简单的说,你可以把程序中的变量、类别名称使用中文来表示<注>,当你的程序移植到其它语言平台时,还是可以正常的执行。Java也是目前所有计算机语言当中,唯一天生使用Unicode的语言。

二.java技术框架的四个组成部分 
 
 
我们对Java EE的框架有过很多介绍, 本文将对java快速开发中Java EE常用的四个框架做一下系统的归纳,希望大家喜欢。

       Struts
       Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。
       Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:
       1、模型 (Model),本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config.xml文件描述的配置信息的。
    2、视图(View),View是由与控制器Servlet配合工作的一整套JSP定制标签库构成,利用她们我们可以快速建立应用系统的界面。
    3、控制器(Controller),本质上是一个Servlet,将客户端请求转发到相应的Action类。
    4、一堆用来做XML文件解析的工具包,Struts是用XML来描述如何自动产生一些JavaBean的属性的,此外Struts还利用XML来描述在国际化应用中的用户提示信息的java快速开发(这样一来就实现了应用系统的多语言支持)。
      Spring
      Spring是轻量级的Java EE应用程序框架。
       Spring的核心是个轻量级容器(container),实现了IoC(Inversion of Control)模式的容器,Spring的目标是实现一个全方位的整合框架,在Spring框架下实现多个子框架的组合,这些子框架之间彼此可以独立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop shop的框架整合方案 。
       Spring不会特別去提出一些子框架来与现有的OpenSource框架竞争,除非它觉得所提出的框架夠新夠好,例如Spring有自己的 MVC框架方案,因为它觉得现有的MVC方案有很多可以改进的地方,但它不强迫您使用它提供的方案,您可以选用您所希望的框架来取代其子框架,例如您仍可以在Spring中整合您的Struts框架 。
       Spring的核心概念是IoC,IoC的抽象概念是「依赖关系的转移」,像是「高层模组不应该依赖低层模组,而是模组都必须依赖于抽象」是 IoC的一种表现,「实现必须依赖抽象,而不是抽象依赖实现」也是IoC的一种表现,「应用程序不应依赖于容器,而是容器服务于应用程序」也是IoC的一种表现。
       Spring的架构性的好处
       Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了Java EE特有APIs的framework,你会发现Spring关注了遗留下的问题。
       Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
       Spring 能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
       Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
       使用Spring构建的应用程序易于单元测试。
       Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
       Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
       Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
       Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
       Spring能做什么?
       Spring提供许多功能,在此我将快速地依次展示其各个主要方面。
       任务描述:
       首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。
       Spring的主要目的是使Java EE易用和促进好编程习惯。
       Spring 不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如 Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/R mapping层,对此,已有有好的解决办法如Hibernate和JDOjava快速开发。
       Spring的目标是使已存在的技术更加易用。例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。
       Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的 IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)
Spring也得益于内在的一致性。
       所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One Java EE设计与开发的那些。
       并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。
       Spring在应用服务器之间是可移植的。
       当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户。
       Spring的核心即是个IoC/DI的容器,它可以帮程序设计人员完成组件之间的依赖关系注入,使得组件之间的依赖达到最小,进而提高组件的重用性,Spring是个低侵入性(invasive)的框架,Spring中的组件并不会意识到它正置身于Spring中,这使得组件可以轻易的从框架中脱离,而几乎不用任何的修改,反过来说,组件也可以简单的方式加入至框架中,使得组件甚至框架的整合变得容易。
       Spring最为人重视的另一方面是支持AOP(Aspect-Oriented Programming),然而AOP框架只是Spring支持的一个子框架,说Spring框架是AOP框架并不是一件适当的描述,人们对于新奇的 AOP关注映射至Spring上,使得人们对于Spring的关注集中在它的AOP框架上,虽然有所误解,但也突显了Spring的另一个令人关注的特色。
       Spring也提供MVC Web框架的解決方案,但您也可以将自己所熟悉的MVC Web框架与Spring解合,像是Struts、Webwork等等,都可以与Spring整合而成为进用于自己的解決方案。Spring也提供其它方面的整合,像是持久层的整合如JDBC、O/R Mapping工具(Hibernate、iBATIS)、事务处理等等,Spring作了对多方面整合的努力,故说Spring是个全方位的应用程序框架。
      Hibernate
       Hibernate是一个开放源代码的对象关系映射框架,java快速开发对JDBC进行了轻量级的对象封装,使得Java程序员可以使用对象编程思维来操纵数据库。Hibernate可以在应用EJB的Java EE架构中取代CMP,完成数据持久化。它还可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用
       Hibernate的工作方式
       Hibernate不会对您造成妨碍,也不会强迫您修改对象的行为方式。它们不需要实现任何不可思议的接口以便能够持续存在。惟一需要做的就是创建一份 XML“映射文档”,告诉Hibernate您希望能够保存在数据库中的类,以及它们如何关联到该数据库中的表和列,然后就可以要求它以对象的形式获取数据,或者把java快速开发justep.com/studio.html中对象保存为数据。与其他解决方案相比,它几乎已经很完美了。
       由于本文只是一篇介绍性的文章,所以不会引入构建和使用Hibernate映射文档的具体例子(我在《Hibernate: A Developer's Notebook》一书的头几章中已经介绍了一个例子)。此外,在网上和Hibernate的在线文档中,还可以找到一些不错的例子,请参见下面的“其他信息”部分。它实际上相当直观。应用程序对象中的属性以一种简单而自然的方式与正确的数据库结构相关联。
        运行时,Hibernate读取映射文档,然后动态构建Java类,以便管理数据库与Java之间的转换。在 Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询。要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉Hibernate保存修改即可。类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉Hibernate有关它们的信息,这样就能在数据库中保存它们。
       Hibernate API学习起来很简单,而且它与程序流的交互相当自然。在适当的位置调用它,就可以达成目的。它带来了很多自动化和代码节省方面的好处,所以花一点时间学习它是值得的。而且还可以获得另一个好处,即代码不用关心要使用的数据库种类(否则的话甚至必须知道)。我所在的公司就曾有过在开发过程后期被迫更换数据库厂商的经历。这会造成巨大的灾难,但是借助于Hibernate,只需要简单地修改Hibernate配置文件即可。
       这里的讨论假定您已经通过创建Hibernate映射文档,建立了一个关系数据库,并且拥有要映射的Java 类。有一个Hibernate“工具集”可在编译时使用,以支持不同的工作流。例如,如果您已经拥有Java类和映射文档,Hibernate可以为您创建(或更新)必需的数据库表。或者,java快速开发仅仅从映射文档开始,Hibernate也能够生成数据类。或者,它可以反向设计您的数据库和类,从而拟定映射文档。还有一些用于Eclipse的alpha 插件,它们可以在IDE中提供智能的编辑支持以及对这些工具的图形访问。
       使用Hibernate的场合
       既然Hibernate看起来如此灵活好用,为什么还要使用其他的工具呢?下面有一些场景,可以帮助您做出判断(或许通过提供一些比较和上下文,可以有助于鉴别非常适用Hibernate的场合)。
       如果应用对于数据存储的需要十分简单——例如,您只想管理一组用户优先选择——您根本不需要数据库,更不用说一个优秀的对象-关系映射系统了(即使它也如Hibernate这般易于使用)!从Java 1.4开始,有一个标准的Java Preferences API可以很好地发挥这个作用。
       对于熟悉使用关系数据库和了解如何执行完美的SQL查询与企业数据库交互的人来说,Hibernate似乎有些碍手碍脚,这就像带有动力和自动排挡的快艇车会使注重性能的赛车驾驶员不耐烦一样。如果您属于这种人,如果您所在的项目团队拥有一个强大的DBA,或者有一些存储过程要处理,您可能想研究一下iBATIS。Hibernate的创建者本身就把iBATIS当作是另一种有趣的选择。我对它很有兴趣,因为我们曾为一个电子商务站点开发了一个类似的系统(其功能更为强大),而且从那时到现在,我们已经在其他环境中使用过它,尽管在发现Hibernate之后,在新项目中我们通常更喜欢使用Hibernate。您可以认为,以SQL为中心的解决方案(比如iBATIS)是“反向的”对象/关系映射工具,而java快速开发Hibernate是一个更为传统的ORM。
       当然,还有其他的外部原因会导致采用另外的方法。比如,在一个企业环境中,必须使用成熟的EJB架构(或者其他的一些非普通对象映射系统)。可以为提供自己的数据存储工具的平台量身定做代码,比如Mac OS X's Core Data。使用的可能是像XML DTD这样的存储规范,而它根本不涉及关系数据库。
        但是,如果您再java快速开发中使用的是富对象模型,而且想要灵活、轻松且高效地保存它(无论您是否正要开始或已经决定使用关系数据库,只要这是一个选择——而且存在可用的优秀免费数据库,比如MySQL,或可嵌入Java的HSQLDB,它就应该始终是一个选择),那么 Hibernate很可能就是您理想的选择。您可能会惊讶于节省的时间之多,以及您将会多么地喜欢使用它。
       Swing
       图形用户接口(GUI)库最初的设计目的是让程序员构建一个通用的GUI,使其在所有的平台上都能够正常的显示。但是比较遗憾的是AWT产生的是在各系统看来都同样欠佳的图形用户接口,JAVA1.2为老的java1.0 AWT添加了Java基础类(JFC),这是一个被称为“Swing”的GUI的一部分。Swing是第二代GUI开发工具集,AWT采用了与特定平台相关的实现,而绝大部分Swing组件却不是。Swing是构筑在AWT上层的一组GUI组件的集合,为了保证可移植性,它完全用Java语言编写,与AWT相比,Swing提供了更完整的组件,引入了许多新的特性和能力。Swing提供了更多的组件库,如:JTable,JTree,Jcombox。Swing也增强了AWT中组件的功能。正是因为Swing具备了如此多的优势所以我们以后在开发中都使用Swing。JComponent类是Swing组件的基类,而JComponent继承自Container类,因此,所有的Swing组件都是AWT的容器。Swing采用了MVC设计模式。

三.java三大平台

Java SunOne体系---SunONE体系(Sun Open Net Environment)


Java发展到今天,已从编程语言发展成为全球第一大通用开发平台。Java技术已被计算机行业主要公司所采纳。1999年,Sun公司推出了以 Java2平台为核心的J2SE、J2EE和J2ME三大平台。随着三大平台的迅速推进,全球形成了一股巨大的Java应用浪潮。Sun提供有相对应的 JDK版本下载。

1.Java 2 Platform, Standard Edition(J2SE)
    Java 2平台标准版,适用于桌面系统应用程序的开发,以及低端的服务器。本书例程就是利用J2SE 5.0版的相关图形API包来开发的。J2SE包含那些构成Java语言核心的类。比如,数据库连接,接口定义,输入输出,网路编程。

2.Java 2 Platform, Enterprise Edition(J2EE)
    Java 2平台企业版,是一种利用Java 2平台来简化企业解决方案的开发、部署和管理等相关复杂问题的体系结构。J2EE技术的核心就是Java平台或Java 2平台的标准版,
主要用于分布式的网路程序的开发,构建企业级的服务器应用。如,电子商务网站和ERP系统。包含J2SE的类,并且还包含用于开发企业级应用的类。比如, EJB,Servlet,JSP,XML,JDBC,CORBA,以及能够在Internet应用中保护数据的安全模式等技术。
它包含标准版中的任何组件,并增加了附加库,以支持目录管理、交易管理以及企业消息处理等功能。

3.Java 2 Platform, Micro Edition(J2ME)
    Java 2平台微型版。Sun公司将J2ME定义为“一种以广泛的消费性产品为目标、高度优化的Java运行环境”。自1999年6月在JavaOne Developer Conference上声明之后,J2ME进入了小型设备开发的行列。通过Java的特性,遵循J2ME规范开发的Java程序可以运行在各种不同的小型 设备上。
用于嵌入式的消费型产品中,如呼机,手机,掌上电脑,智能卡,机顶盒,汽车导航系统或其他无线设备。

简单地,
J2SE用于小型程序,J2EE用于大型程序,J2ME用于手机等程序。
J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专用类。语言都是相同的,只是捆绑的类库API不同。也就是,J2SE是基 础;压缩一点,再增加一些CLDC等方面的特性就是J2ME;扩充一点,再增加一些EJB等企业应用方面的特性就是J2EE。

在jdk1.2之前的JAVA被称为JAVA1.0;jdk1.2及之后的jdk称之为JAVA2;Jdk5.0以后,Sun改称为JavaSE、JavaEE、JavaME。

--------------------------------------------------------------------------
J2EE平台本质上是一个分布式的服务器应用程序设计环境---一个Java环境,提供了:
a,宿主应用的一个运行基础框架环境;
b,一套用来创建应用的Java扩展API。
----《J2EE服务器端高级编程》
-------------------------------------------------------------------------- 

四.java程序执行的几个阶段

 
首先编译:虚拟机会根据java预言的规则进行语法分析,词法分析,语义分析等等,以及类变量常量的提取等等,然后依据class文件的格式把程序转化为字节码文件。这就是你用javac命令的结果。

运行:要经过装载———》链接——》初始化的步骤,进入内存(分配空间,初始化变量方法区,常量池,堆栈等等),然后在用到的时间就从main方法入口区执行程序!这里面的每一个步骤都是很复杂的过程

---->Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码--字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。

      运行JVM字节码的工作是由解释器( java命令 )来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。

     随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转化等多种错误。通过校验后,代码便开始执行了。

五.java术语 

JDK:java develope kit:java开发工具包。
JDK包含有两层意思:
        一是,运行环境(Java及基础核心类,包含API,集成API,用户界面API,发布技术,Java虚拟机五大部分);
        二是,开发工具(Java及基础核心类)
        JDK包含标准的编译java小程序和applet应用程序的类库,servlet在JSWDK中。

J2SDK:
    1.java2 stander develope kit:java2标准开发工具包。
    2.java2 softerware development kits:SUN对再后来的开发包的另一称呼。
    J2SDK有几个版本对应于java2的各个平台:
    -J2EE:需要用到开发工具就是J2eeSdk,只不过大部分应用服务器(weblogicjbOSs等)都内置了j2eesdk。只不过大部分应用服 务器(weblogic jboss等)都内置了j2eesdk。当然了,j2sdk标准版是基础,所以要安装先;j2eesdk因为是企业应用嘛,所以是注册后才能下载。
    -J2SE: j2sdk也就是标准版,一般来说j2sdk指的就是j2se.
    -J2ME: ......
J2SDK包含了Java Development kit(JDK)、Java Runtime Environment(JRE)和Java Plug-in。
jre:java runtime enviroment:java运行环境,jdk中包括了它,但是对于不需要开发只是运行的用户是可以只单独安装jre的,所以sun提供了jre的下 载。Jre是JAVA程序要运行所需要的环境 ,所谓跨平台就是要各种平台都有一个中间代理,那就是JRE。一般采用JAVA技术开发出的软件都得带这个,所以sun就单独提供了JRE安装文件,以供 JAVA应用程序发布时所用。  
plug-in:JRE包含了java plug-in。
实际上jdk和j2sdk和jsdk都是一样的,只是有各自的版本和各自版本的不相同。

JFC(Java Foundation Class)--Java基础类,是早期Sun对JDK的功能扩展,不是Java的公共规范。
Swing是JFC中的一项用户界面扩展技术。最新的JAVA2技术则包含了JFC技术,不需要再扩展了。
说白了,其实就是Sun将JFC纳入了JAVA核心类库。原先要用到JFC技术,用户必须在原有的JRE前提下再添加JFC,现在少了一步,只需JRE了。

JFC提供了丰富的GUI组件、开放框架、图形等功能,它由5部分组成
    1.Java IDL(Interface Definition Language):
      在Java平台上提供了CORBA功能,提供基于标准的互操作性和连接性;
    2.容器类库:提供了一种用于存储对象的、与实现无关的框架结构;
    3.引用对象:引用对象用来存储其它对象的引用,它与C指针相似,但是不提供对确定内存地址的引用;
    4.包版本识别:允许applet和应用获得某一特定Java包的版本信息,实现自动升级;
    5.输入法类库:对于国际化支持的补充,输入法允许支持非英语语言文本的输入.
 JRE:JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。

六.java相关 

 

JDK与JRE的区别

Jdk是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆java工具和java基础的类库(rt.jar),不论什么java应用服务器实质都是内置了某个版本的JDK。最主流的jdk数sun公司发布的jdk,除了sun之外,还有很多公司和组织都开发了自己的jdk,例如IBM公司开发的jdk,BEA公司开发的Jrocket,还有GNU组织开发的jdk等等。其中IBM的JDK包含了JVM(java Virtual Machine),运行效率要比Sun JDK包含的JVM高出很多。而专门运行在x86平台的Jrocket在服务器端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

    JDK一般有三种版本:SE(J2SE),standard edition,标准版,是我们通常用的一个版本,EE(J2EE),enterpsise edtion企业版,使用这种jdk开发J2ee应用程序,ME(J2ME)micro edtion主要用于移动设备、嵌入式设备上的java应用程序。Java开发工具(jdk)是许多java专家最初使用的开发环境。尽管许多编程人员已经使用第三方的开发工具,但jdk仍被当作java开发的重要工具。Jdk由一个标注类库和一组建立、测试及建立文档的java实用程序组成。其核心java API是一些预定义的类库,java开发人员需要用这些类来访问java语言的功能。Java API包括一些重要的语言结构以及基本图形、网络和文件I/O。一般来说,java API的非I/O部分对于运行java的所有平台式相同的,而I/O部分则仅在通用的java环境中实现。

    作为jdk的实用程序,工具库中有七种主要程序。

    Javac:java编译器,将java源代码转换成字节码。

    Java:java解释器,直接从类文件执行java应用程序字节代码。

    Appletviewer:小程序浏览器,一种执行HTML文件上的java小程序的java浏览器。

    Javadoc:根据java源码及说明语句生成的HTML文档。

    Jdb:java调试器,可以逐行执行程序,设置断点和检查变量。

    Javah:产生可以调用java过程的C过程,或建立能被java程序调用的C过程的头文件。

    Javap:java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

   JRE,java运行环境,运行java程序所必须的环境的集合,包括JVM标准实现及java核心类库。是Sun的产品,包括两部分JRE和JPJRE,JRE是可以在其上运行,测试和传输应用程序的java平台。它包括java虚拟机、java平台核心和支持文件。它不包括开发工具编译器、调试器和其他工具。JRE需要辅助软件javaPlugin以便在浏览器中运行applet。J2RE是java2 runtime Environment既JAVA运行环境,有时简称JRE,如果你只需要运行java程序或者applet,下载并安装它即可。如果你要自行开发java软件,请下载JDK,在JDK中附带有JRE。

 JAVA_HOME、PATH、CLASSPATH用途

1、 设置JAVA_HOME

一、 为了方便引用,比如,你的JDK安装在C盘,则设置JAVA_HOME为该目录路径,那么以后你要使用这个路径的时候,只要输入%JAVA_HOME%即可,避免每次引用都输入很长的字符串。

二、 归一原则,当你的JDK路径被迫改变时,你仅需要改变JAVA_HOME变量的值即可,否则,你就要更改任何绝对路径引用JDK目录的文档,要是万一你没有改全,后果可想而知。

三、 第三方软件会引用约定好的JAVA_HOME变量,不然,你将不能正常使用该软件,以后用JAVA久了就会知道,要是那个软件不能正常使用,不妨想想是不是这个问题导致的。

2、 设置CLASSPATH

这个变量的设置目的是为了让程序找到相应的.class文件。

3、 设置PATH

把%JAVA_HOME%\Bin添加到PATH路径下,这样,我们在任何路径下就可以使用java来执行命令了。

JAVA开发工具

适合做java开发的工具主要有Eclipse,Jbuilder,Idea等等。

内存溢出与内存泄漏的区别

内存溢出就是要求分配的的内存超出了系统能给你的,系统不能满足你,于是就产生了溢出。

    内存泄漏是指你向系统申请分配内存,可是使用完了没有释放,结果你自己申请的那块内存你自己再也不能访问,而系统也不能把它分配给需要的程序。

    内存泄漏的分类:

1、 常发性内存泄漏。发生内存泄漏的代码会被多次执行,每次被执行都会导致一部分内存泄漏。

2、 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定的环境或者操作过程中才被执行。常发性和偶发性是相对的。对于在特定环境中,偶发性也许就变成了常发性。所以测试环境和测试方法对于检测内存泄漏时至关重要的。

3、 一次性的内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致有一块且仅有一块内存发生泄漏。比如在构造函数中分配内存,在析构函数中却没有释放内存,所以内存泄漏只有一次。

4、 隐式的内存泄漏。程序在运行过程中不停的申请并分配内存,但直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏。但是对于一个服务器程序,也许运行需要几天,几周甚至几个月,如果不及时释放内存也可能导致最终耗尽系统的所有内存。

JAVA语言的特点

1、 面向对象:其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心算法为驱动的话,面向对象的编程语言则是以对象为中心的消息为驱动。用公式来表示,过程式编程语言为:程序=算法+数据。面向对象编程语言为:程序=对象+消息。所有面向对象语言都支持三个概念:封装、多态和继承。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。JAVA语言的封装性较强,因为java语言无全程变量,无主函数,在java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,java也提供了相应的对象类型以便于其他对象交互操作。多态性就是多种表现形式,具体的说,可以用“一个对外接口,多个内在实现方法”表示。举一个例子,计算机中的堆栈可以存储各种各样的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。重载一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变的复杂难以理解,所以JAVA最后还是把它取消了。继承是指一个对象可以使用另一个对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如把汽车当成一个实体,它可以分成多个子实体,如卡车,公共汽车等。这些子实体都具有汽车的特性,因此,汽车是他们的“父亲”,而这些子实体都是汽车的“孩子”。Java提供给用户一些类,Java类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。

2、 可移植性:就是在这个系统上做的程序经过一次编译后可以移植到别的系统上解释执行。只要经过简单的粘贴和复制就行了,不影响程序的效果。平台无关性有两种,源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C和C++写的程序不用修改只需重新编译就可以在不同平台上运行。Java主要靠Java虚拟机(JVM)在目标代码级实现平台无关性。JVM是一种抽象机器,它附着在具体的操作系统之上,本身具有一套虚拟机指令,并有自己的栈、寄存器组等。但JVM通常是在软件上实现而不是在硬件上实现。JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释java编译器编译后的程序。Java编程人员在编写完软件后,通过Java解释器将Java源程序编译为JVM的字节码。任何一台机器只要具有Java解释器,就可以运行这个程序。而不用去这中字节码是在何种平台上生成的。另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。Java解释器,每当需要使用某种应用软件时,下载该软件的字节代码即可,运行结果也可以发回服务器。

3、 分布式。分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。Java支持wwwC/S计算模式,因此,它支持这两种分布式。对于前者,Java提供了一个叫做URL的对象,利用这个对象,你可以打开并访问具有相同URl地址上的对象,访问方式与访问本地文件系统相同。对于后者,Java的applet小程序可以从服务器下载到客户端,即部分计算在客户端进行,提高系统执行效率。

4、 可靠性和安全性。Java最初的设计目的是应用于电子类消费产品,因此要求较高的安全性。Java虽然源于C++,但它消除了许多C++不可靠的因素,可以防止许多编程错误。首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。Java主要应用于网络程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络上下载程序直接执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。Java字节码进入解释器时,首先必须经过字节码效验器的检查,然后,Java解释器将决定程序中类的内存布局,随后,类装载器负责把来自网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏。最后,客户端用户还可以限制从网络上装载的类只能访问某些文件系统。

5、 多线程。线程是操作系统的一种新概念,它有被称为轻量进程,是比传统进程更小的可并发执行的单位。Java在两方面支持多线程。一方面,Java环境本来就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序的开发。Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。

类名称命名规范

类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均为大写;如果类名称中包含单词缩写,则这个缩写的单词每个字母都得大写,还有一点命名技巧就是由于类都是设计用来代表对象的,所以在命名类时尽量选择名词。

类成员命名规范

变量命名采用匈牙利命名法。它使用三个字母的前缀来表示数据类型,这三个字符必须小写,前缀后面是由表达意强的一个或多个单词组成的名字,而且每个单词的首字母要大写,其他字母小写。比如记录一个文档的数量:intDocCount。

 类方法命名规范

方法的命名规则是第一个单词小写作为开头,后面的单词首字母要大写。

包的命名规范

Java包的名字都是由小写字母组成。程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。

Main函数

主函数的一般写法是:public static void main(String [] args){………}

1、 public关键字,声名主函数为public就是告诉其他类可以访问这个函数。

2、 static关键字,告知编译器main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的,即当定义了类以后这段代码就已经存在了。如果main方法没有使用static修饰符,编译不会报错,但是你如果试图执行该程序将会报错,提示main方法不存在。因为包含main的类并没有实例化(即没有这个类的对象),所以其方法也不存在,而使用static修饰符则表示方法是静态的,不需实例化即可使用。

3、 void关键字。表示main方法的返回值是无类型的。

4、 参数String [] args。第一,程序使用者可以在命令行状态下向某个类传递参数。第二,可以在另一个类中向main的类传递参数。参数agrs的主要作用是为程序使用者在命令行状态下与程序交互提供了一种手段。

实例成员与类成员区别

在类中声明一个变量和方法时,可以指示他们是实例成员还是类成员。类成员是指有static保留修饰符的成员变量和成员方法;如果在声明时没有static修饰符,就是实例成员,变量和方法分别称为实例变量和实例方法。在生成每个类的实例对象时,Java运行时系统为每个对象的实例变量分配一块内存,然后通过对象来访问这些实例变量;而对于类变量来说,在生产类的第一个实例对象时,Java运行时系统对这个对象的每个类变量分配一个内存,以后再生成该类的实例对象时,所有的实例对象都共享同一个类变量,每个实例对象对类变量的改变都会直接影响到其他实例对象,类变量除了可以通过类名直接访问外,还可以通过实例对象来访问。实例方法不仅可以对当前对象的实例变量可以操作,对类变量可以操作,而类方法只能对类变量操作,也就是没有static修饰的方法对有static修饰的和没有static修饰的变量都可以访问,而有static修饰的方法只能对static修饰的变量进行操作。

String与StringBuffer区别

String类型字符里面的内容不能修改,如需要修改,编译器会创建一个新的字符串对象, 有时在编程中并不希望这样,希望能改变字符串对象里的内容,就需要用StringBuffer类,即字符串缓冲区类。StringBuffer与String最大的区别在于StringBuffer不仅可以改变字符串的长度,还能修改里面的内容,此外,在多线程编程中,StringBuffer对象比较安全。StringBuffer类提供了对字符串修改的操作方法,如append方法可以追加操作。Insert方法是插入操作。Replace方法是替换操作。 Delete方法是删除操作。

String是否可被继承

不可以,String是final类型的,不能被继承。基本类型的类都是final的,无法被继承或修改。比如Integer,Float,Boolean,Byte,Short,Character等等。

JSP与Servlet的区别

Jsp在本质上就是servlet,但两者的创建方式不一样。

    Servlet完全是Java程序代码构成,擅长流程控制和事务处理,通过Servlet生成动态页面很不直观。Jsp由HTML代码和Jsp标签组成,可以方便的编写动态页面。因此在实际应用中采用Servlet来控制业务流程,而采用Jsp来生成动态页面。在Struts框架中,Jsp位于MVC设计模式的视图层,而Servlet位于控制层。Jsp是Servlet技术的扩展,本质上就是Servlet的简易方式。Jsp编译后就是类Servlet。两者最大的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全是从表示层中的HTML分离开来,而Jsp是Java和HTML组合成一个扩展名为.JSP的文件。Jsp侧重于视图,而Servelt主要用于控制逻辑。

 Servlet的init()与service()区别

Init方法是在Servlet实例化之后执行的,并且只执行一次。

    有时候希望Servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这个任务的时候,用init方法,他在Servlet初次创建时被调用,之后处理每个用户的请求时,则不再调用这个方法。因此他主要用于一次性的初始化,和applet的init方法相同。由于Servlet的初始化参数的使用非常依赖于部署文件(web.xml),该文件可存放Servlet所需要的起始参数以及web应用程序的结构数据。当Servlet容器读取web.xml文件内容后,可以将这些起始参数封装成一个对象并在调用init方法时传递给Servlet。这个对象就是Servletconfig对象,所以我们可以在Servlet内复写init方法,并通过Servletconfig对象来取得某些初始参数。

    Service方法是Servlet的核心。每当一个用户请求一个httpservlet对象,该对象的service方法就要被调用,而且传递给这个方法一个“请求”对象(Servletrequest)和一个“响应”对象(Servletresponse)作为参数。在httpservlet中已存在service方法缺省的服务功能是调用与http请求的方法相应的do功能。Service方法是javax.servlet.Servlet接口中的方法,Servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到do方法中,如果你重载了改方法,默认操作被覆盖,不再进行转发操作。Service是在javax.servlet.Servlet接口中定义的。在javax.service.GenericServlet中实现了这个接口,而doGet和doPost则是在javax.servlet.http.HttpServlet中实现的。Javax.servlet.http.HttpServlet是在javax.service.GenericServlet中的子类。当一个客户通过HTML表单发出一个Httppost请求时,dopost方法被调用。与POST请求相关的参数作为一个单独的HTTP请求从浏览器发送到服务器。 当需要修改服务器端的数据时,应该使用doPost方法。当一个客户通过HTML表单发出一个HTTPGET请求时或者直接请求一个URL时,doGet方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet方法。Servlet应该为Servlet支持的HTTP方法覆盖do功能。因为HTTPServlet.service方法会检查请求方法是否调用了适当的处理方法,没必要覆盖service方法,只需要覆盖相应的do方法就可以了。

运行时异常与一般性异常的区别

异常表示程序运行过程中可能出现的非正常情况。运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行异常。Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须抛出未被捕获的运行时异常。

Final、finally、finalize的区别

Final是一个修饰字,如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明成abstract的,又被声明成final的。将变量和方法声明为final,可以保证他们在使用中不被修改。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法同样只能使用,不能重载。

    Finally在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块。

    Finalize 方法名。Java技术允许使用finalize方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾回收器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize方法以整理系统资源或者执行其他清理工作。Finalize方法是在垃圾收集器删除对象之前对这个对象调用的。

同步与异步区别

如果数据将在线程间共享,例如正在写的数据可能被另一线程读出,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下,异步途径往往更有效率。

抽象类与接口区别

抽象类和接口是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予Java强大的面相对象能力。两者对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换。其实,两者之间还是有很大的区别。

    抽象类和接口都是Java语言中对抽象类进行定义的。在面向对象的概念中,所有对象都是通过类来描述的,但是反过来却不是。并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表示我们对问题领域分析设计得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

    例如进行一个图形编辑软件的开发,就会发现问题领域存在圆,三角形等这样一些具体概念,他们都是不同的,但是他们又都属于形状这一概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

    在面向对象领域,抽象类主要用于进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类。而这一组可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

     从语法层面,Java语言对于抽象类和接口给出了不同的定义方式,下面以定义一个名为demo的抽象类为例来说明这种不同,使用抽象类的方式定义Demo抽象类的方式如下:

     Java代码

     abstract class Demo{

      abstract void method1();

      abstract void method2();  

}

      使用接口的方式定义Demo抽象类的方式如下:

       interface Demo{

       void method1();

       void method2();

}

     在抽象方式中,Demo可以有自己的数据成员,也可以有非抽象的成员方法,而在接口方式的实现中,Demo只能有静态的,不能被修改的数据成员(也就是必须是static final的,不过在接口中一般不定义数据成员),所有的成员方法都是抽象的。从某种意义上说,接口是一种特殊形式的抽象类。

    从编程角度来看,抽象类和接口都可以用来实现“design by contract”的思想。但是在具体的使用上还是有一些区别。

    首先,抽象类在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是一个类却可以实现多个接口。

抽象类和接口的区别
(1)接口可以被多重implements,抽象类只能被单一extends
(2)接口只有定义,抽象类可以有定义和实现
(3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)

abstract class和interface有什么区别? 

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
Hashtable的原理,并说出HashMap与Hashtable的区别
HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函 数),得到函数值H(k),将此值解释为该节点的存储地址.
HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.

forward和redirect的区别
forward: an internal transfer in servlet
redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等

什么是Web容器?
实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等 等.
解释下面关于J2EE的名词
(1)JNDI : Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统 ,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.
(2)JMS : Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.
(3)JTA : Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可 .
(4)JAF : Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和 自定义实现自己的个性安全控制策略.
(5)RMI : Remote Method Interface,远程方法调用

EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区 别.
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组 件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻 辑;EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一 个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用 者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之, 很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行.从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.

XML的解析方法
Sax,DOM,JDOM
什么是Web Service?
Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。
Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等, 所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。
注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络 信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这 有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。
优势:
(1).跨平台。
(2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。
(3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易 通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。
(4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。
(5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。
 (6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。
缺点:
(1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。

Servlet生命周期

Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。

Servlet的生命周期包含了下面4个阶段:

(1)加载和实例化

Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。

(2)初始化

在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立,Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可用。

(3)请求处理

Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可用)响应。如果UnavailableException异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂时忙,不能处理请求)响应。

(4)服务终止

当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。下面给出Servlet整个生命周期过程的UML序列图,如图所示。

webservice
1. 定义:
简单来说,webservices就是不同服务器间调用资源的一种方法。
与之对应的是本地服务,但本地服务存在缺陷:本地资源不足、成本因素、可移植性差等。
而webservices:平台无关,不管什么平台都能使用webservices;编程语言无关,无论使用什么语言,只要遵守相关协议,就可以调用webservices暴露的API。
2. 原理
实际上是一个应用程序,向外界暴露一个能通过web进行调用的API,可以使用任何语言。
服务端:
服务端生成wsdl文件,描述接口及访问方式。接受客户端发来的SOAP请求消息,解析其中的方法调用和参数格式,调用相应业务完成指定功能,并把返回值放入SOAP 回应消息返回给调用者。
客户端:
取得服务端的服务描述语言文件(WSDL),解析该文件,了解服务端的调用信息及方式。根据需要,生成恰当的SOAP请求(指定调用的方法、参数),发送到服务端,等待SOAP回应消息, 解析返回值。
3. 何时使用
Webservices在跨平台和跨网络进行通信时,是非常有用的

4. WSDL:
怎样向别人介绍你的Web Service有什么功能,以及每个函数调用时的参数呢,这就是WSDL
5. WSDL和SOAP的关系
SOAP是个通信协议, SOAP在HTTP协议的基础上,把编写成XML的REQUEST参数, 放在HTTP BODY上提交个WEB SERVICE服务器(SERVLET,ASP什么的) 处理完成后,结果也写成XML作为RESPONSE送回用户端, 为了使用户端和WEB SERVICE可以相互对应,可以使用WSDL作为这种通信方式的描述文件,利用WSDL工具可以自动生成WS和用户端的框架文件,SOAP具备把复杂对 象序列化捆绑到XML里去的能力。

SOAP的前身是RPC, 就是远程呼叫处理的协议,这个协议安全性不是很好,多数防火墙都会阻挡RPC的通信包,而SOAP则使用HTTP协议作为基本的协议,使用端口80使得SOAP可以透过防火墙,完成RPC的功能。

SOAP 协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的,现在我们编写WEB SERVICE不需要深入理解SOAP也没关系。如果SERVICE和CLIENT在同样的环境下使用SOAP,由于一般情况下都有自动生成SOAP程序 框架的工具,因此不知道细节也没关系. 可是, 如果CLIENT和SERVICE的环境不同,比如说JAVA的Client和.NET的SERVICE进行通信,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通信,还是要知道一点细节为好. 特别是, WSDL或者UDDI都不是标准,如果不让用就只好手工配制SOAP MESSAGE啦。

对session和cookie的理解
由于http协议是无状态的,请求时不保留上下文信息,这就需要一种机制,在用户请求时能保存用户需要信息,这就需要session和cookie
<1>session原理
 首先session是把信息已文件形式保存在服务端,文件名是sessionId,sessionId保存在cookie(浏览器缓存)中。当用户第一次
登录或访问时,把用户信息保存在session中,并产生一个唯一sessionId,在同一浏览器中,用户再次发起请求时,会把sessionId
发送到服务端,根据sessionId唯一标识找到用户相关信息。如果客户端禁止cookie(在浏览器中设置),在java中则根据url重定向
的方式,把sessionId添加到请求url末尾,发送到服务端,代替cookie的功能。
 session失效,原来理解认为是session信息失效,这是不正确的。当一会话结束后,关闭浏览器后,当前用户的sessionId
消失,而服务端的session并没有立即消失,而是等java回收机制来处理,一个系统中使用session较多的话,会产生垃圾文件 。
<2>cookie
 用户请求一网站后,会在本机生成一些cookie文件,用来保存用户名或密码等,这些文件以网址或其它唯一标识命名,
当用户再次请求时,会从cookie中获取相应信息,

java集合类
java中集合有三种set、list、map
<1>
set是简单的集合类,它只是把简单对象放到集合中,就像把东西装入袋子中一样,没有顺序,所以set集合中的对象不能重复。
对于TreeSet是set的实现类,可以对集合中的对象按一定规则排序。
<2>
list主要是以线性方式存储,与集合类不同,它有一个开头元素和结尾元素。主要有ArrayList、Vector、LinkList实现类。
Arraylist和Vector都是以数组形式存储数据的,Vector是线程安全的,而ArrayList是异步的,所以Vector性能较低。数组
程度增长时,Vector增长为原来的一倍,而ArrayList增长一半。
<3>
map是以键值的形式存储数据,它没有实现collection接口,主要实现类有HashMap和HashTable,HashMap是HashTable的轻量级实现,HashMap允许空的键值

对于高并发的处理
高并发的处理主要有三部分
<1>客户端到web应用服务器
当客户端对应用程序发起同一请求时,首先会对web服务器产生压力,一般情况下,使用集群技术,分担web服务器压力。
由一台服务器处理分配所有请求,负责把请求分配到各个服务器,水平扩展。
<2>web应用服务器到应用程序
也使用集群技术
<3>应用程序到数据库
应用程序对数据库的访问开销很大,处理方式很多,使用缓存技术可以提高速度,减少开销,减少对数据库的频繁操作。

Java数据库存取技术

1 直接访问数据库

2 EJB entity bean

3 JDO技术

4 第三方工具,如Hibernate、Castor、Toplink

过滤器和拦截器的区别

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 

2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器 

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能 

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只在容器初始化时调用一次 

拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

Java中finalize()的用法

垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法。

理解finalize( )正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。

finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

finalize()在什么时候被调用?

有三种情况

1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.

2.程序退出时为每个对象调用一次finalize方法。

3.显式的调用finalize方法

除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因

有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。

JAVA反射机制

JAVA反射机制是在运行状态中,(1)对于任意一个类,都能够知道这个类的所有属性和方法;(2)对于任意一个对象,都能够调用它的任意一个方法;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能: 

1在运行时判断任意一个对象所属的类;

2在运行时构造任意一个类的对象;

3在运行时判断任意一个类所具有的成员变量和方法;

4在运行时调用任意一个对象的方法;

5生成动态代理。

jsp和servlet的区别、共同点、各自应用的范围?

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层。

cookie和session的作用、区别、应用范围,session的工作原理?

Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有限。Session:保存在服务端,每一个session在服务端有一个sessionID作一个标识。存储的数据量大,安全性高。占用服务端的内存资源。

JSTL是什么?优点有哪些?

JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,由四个定制标记库(core、format、xml 和sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。优点有:

1、 在应用程序服务器之间提供了一致的接口,最大程度地提高了WEB应用在各应用服务器之间的(可)移植(性)。

2、 简化了JSP和WEB应用程序的开发。

3、 以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。

4、 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。

J2EE的优越性主要表现在哪些方面? 简述一下MVC。

a、J2EE基于JAVA 技术,与平台无关

b、J2EE拥有开放标准,许多大型公司实现了对该规范支持的应用服务器。如BEA ,IBM,ORACLE等。

c、 J2EE提供相当专业的通用软件服务。

d、 J2EE提供了一个优秀的企业级应用程序框架,为快速高质量的开发系统打下了基础。 

Model模型:应用程序的主体部分,是应用程序系统中数据模型的构建部分,在底层实现和数据库的连接,向上提供供控制层调用的接口。

View视图:应用程序中用户界面相关的部分,用于呈现经过处理后的数据,包括用户看到并与之交互的界面。

Controller控制器:应用程序系统用于实现主要功能的业务逻辑部分,包括如用于根据用户的输入,控制用户界面数据显示,更新Model对象状态等一些功能的实现。

MVC模式的出现不仅实现了功能模块和显示模块的分离,同时还提够了应用系统的可维护、可扩展性、可移植性、和组建的可复用性。 

int 和 Integer 有什么区别

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

原始类型封装类

boolean    Boolean 

char     Character

byte     Byte 

short     Short 

int    Integer 

long     Long 

float     Float 

double     Double

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

说出Servlet的生命周期,并说出Servlet和CGI的区别。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 

说出ArrayList,Vector, LinkedList的存储性能和特性 

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 

Collection 和 Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List。

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 

&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 

final, finally, finalize的区别。

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 

sleep() 和 wait() 有什么区别? 

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,将执行机会让给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 

Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 

error和exception有什么区别? 

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 

同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。  

heap和stack有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。

堆是栈的一个组成元素 

forward 和redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。  

JSP中动态INCLUDE与静态INCLUDE的区别

动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。

静态INCLUDE用include伪码实现,不会检查所含文件的变化,适用于包含静态页面。

什么时候用assert 

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。 

GC是什么? 为什么要有GC

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。    

Java有没有goto? 

java中的保留字,现在没有在java中使用。 

启动一个线程是用run()还是start()? 

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 

应用服务器有那些? 

BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat 

给我一个你最常见到的runtime exception。

NullPointerException, ArithmeticException, IllegalArgumentException, IndexOutOfBoundsException, 

接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。 

List, Set, Map是否继承自Collection接口? 

List,Set是,Map不是 

说出数据连接池的工作机制是什么? 

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数来决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 

都不能 

数组有没有length()这个方法? String有没有length()这个方法? 

数组没有length()这个方法,有length的属性。String有length()这个方法。 

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 

构造器Constructor是否可被override? 

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 

swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 

会执行,在return前执行。 

编程题: 用最有效率的方法算出2乘以8等於几? 

2 << 3 

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 

不对,有相同的hash code。 

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 

是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 

不能,一个对象的一个synchronized方法只能由一个线程访问(一个被设定为同步的对象只能由一个线程进行访问,所以其它方法也不行)。 

编程题: 写一个Singleton出来。 

Singleton模式主要作用是保证在Java应用程序中,一个类Class只能有一个实例存在。 

一般Singleton模式通常有几种种形式: 

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的对自身的类定义,在类初始化时实例化,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

Java代码

public class Singleton {     

private Singleton(){}     

   //在自己内部定义自己一个实例,是不是很奇怪?     

   //注意这是private 只供内部调用     

   private static Singleton instance = new Singleton();     

   //这里提供了一个供外部访问本class的静态方法,可以直接访问       

   public static Singleton getInstance() {     

     return instance;        

   }     

}    

第二种形式: 

Java代码

public class Singleton {     

  private static Singleton instance = null;     

  public static synchronized Singleton getInstance() {     

     //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次      

     //使用时生成实例,提高了效率!     

     if (instance==null)     

      instance=new Singleton();     

      return instance;       

    }     

}    

其他形式: 

定义一个类,它的构造函数为private的,所有方法为static的。 

一般认为第一种形式要更加安全些 

Java中的异常处理机制的简单原理和应用。 

当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。

一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。

另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。 

垃圾回收的优点和原理。并考虑2种回收机制。 

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域",不再考虑对象作用域的有效范围。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 

请说出你所知道的线程同步的方法。 

wait() :使一个线程处于等待状态,并且释放所持有的对象的lock。 

sleep() :使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 

notify() :唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 

Allnotity() :唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 

你所知道的集合类都有哪些?主要方法? 

最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。

描述一下JVM加载class文件的原理机制? 

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 

char型变量中能不能存贮一个中文汉字?为什么? 

能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的 

多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 

同步的实现方面有两种,分别是synchronized,wait与notify 

JSP的内置对象及方法。 

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等) 

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 

session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息 

applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 

page表示从该页面产生的一个servlet实例 

线程的基本概念、线程的基本状态以及状态之间的关系 

线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 

 什么情况下调用doGet()和doPost()? 

Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。 

四种会话跟踪技术的描述  

page是代表与一个页面相关的对象和属性。一个页面由一个编译好的Java servlet 类来表示。这既包括 servlet 又包括被编译成 servlet 的JSP页面; 

request是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;

session是代表与用于某个 Web 客户机的一个用户相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求;

application是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域;

Request对象的主要方法: 

setAttribute(String name,Object):设置名字为name的request的参数值 

getAttribute(String name):返回由name指定的属性值 

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 

getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 

getCharacterEncoding():返回请求中的字符编码方式 

getContentLength():返回请求的Body的长度 

getHeader(String name):获得HTTP协议定义的文件头信息 

getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例 

getHeaderNames():返回所有request Header的名字,结果是一个枚举的实例 

getInputStream():返回请求的输入流,用于获得请求中的数据 

getMethod():获得客户端向服务器端传送数据的方法 

getParameter(String name):获得客户端传送给服务器端的有name指定的参数值 

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 

getParameterValues(String name):获得有name指定的参数的所有值 

getProtocol():获取客户端向服务器端传送数据所依据的协议名称 

getQueryString():获得查询字符串 

getRequestURI():获取发出请求字符串的客户端地址 

getRemoteAddr():获取客户端的IP地址 

getRemoteHost():获取客户端的名字 

getSession([Boolean create]):返回和请求相关Session 

getServerName():获取服务器的名字 

getServletPath():获取客户端所请求的脚本文件的路径 

getServerPort():获取服务器的端口号 

removeAttribute(String name):删除请求中的一个属性 

J2EE是技术还是平台还是框架? 

J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 

J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。   

简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 

区别主要答两点:

a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型 

b.逻辑操作不会产生短路

XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

a: 两种形式 dtd schema 

b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的) 

c:有DOM,SAX,STAX等 

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问 

SAX:不同于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 

STAX:Streaming API for XML (StAX) 

解析xml文档有两种定义方法: 

dtd:数据类型定义(data type definition),用以描述XML文档的文档结构,是早期的XML文档定义形式。 

schema:其本身是基于XML语言编写的,在类型和语法上的限定能力比dtd强,处理也比较方便,因为此正逐渐代替dtd成为新的模式定义语言。 

简述synchronized和java.util.concurrent.locks.Lock的异同? 

主要相同点:Lock能完成synchronized所实现的所有功能 

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。 

EJB的角色和三个对象 

一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator) 

三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类 

EJB容器提供的服务 

主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。 

EJB规范规定EJB中禁止的操作有哪些? 

1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等),

2.不能操作awt,

3.不能实现服务器功能,

4.不能对静态属生存取,

5.不能使用IO操作直接存取文件系统,

6.不能加载本地库.,

7.不能将this作为变量和返回,

8.不能循环调用。 

remote接口和home接口主要作用 

remote接口定义了业务方法,用于EJB客户端调用业务方法。 

home接口是EJB工厂用于创建和移除查找EJB实例 

bean 实例的生命周期 

对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。 

EJB的激活机制 

以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。 

EJB的几种类型 

会话(Session)Bean ,实体(Entity)Bean ,消息驱动的(Message Driven)Bean 。

会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种; 

实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续(CMP)两种。

客服端调用EJB对象的几个基本步骤 

设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。 

如何给weblogic指定大小的内存? 

在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M 

如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 

可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。 

如何启动时不需输入用户名与密码? 

修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码. 

在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 

保存在此Domain的config.xml文件中,它是服务器的核心配置文件。

页面间对象传递的方法 

通过request,session,application,cookie等  

说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入 http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办? 

Domain目录服务器目录applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。 

在weblogic中发布ejb需涉及到哪些配置文件 

不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml 

如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置?

缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。 

如何查看在weblogic中已经发布的EJB? 

可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB 

CORBA是什么?用途是什么? 

CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。 

Servlet执行时一般实现哪几个方法? 

public void init(ServletConfig config) 

public ServletConfig getServletConfig() 

public String getServletInfo() 

public void service(ServletRequest request,ServletResponse response) 

public void destroy() 

init()方法在servlet的生命周期中仅执行一次,在服务器装载servlet时执行。缺省的init()方法通常是符合要求的,不过也可以根据需要进行override,比如管理服务器端资源,一次性装入GIF图像,初始化数据库连接等,缺省的inti()方法设置了servlet的初始化参数,并用它的ServeltConfig对象参数来启动配置,所以覆盖init()方法时,应调用super.init()以确保仍然执行这些任务。 

service()方法是servlet的核心,在调用service()方法之前,应确保已完成init()方法。对于HttpServlet,每当客户请求一个HttpServlet对象,该对象的service()方法就要被调用,HttpServlet缺省的service()方法的服务功能就是调用与HTTP请求的方法相应的do功能,doPost()和doGet(),所以对于HttpServlet,一般都是重写doPost()和doGet()方法。 

destroy()方法在servlet的生命周期中也仅执行一次,即在服务器停止卸载servlet时执行,把servlet作为服务器进程的一部分关闭。缺省的destroy()方法通常是符合要求的,但也可以override,比如在卸载servlet时将统计数字保存在文件中,或是关闭数据库连接。 

getServletConfig()方法返回一个servletConfig对象,该对象用来返回初始化参数和servletContext。servletContext接口提供有关servlet的环境信息。 

getServletInfo()方法提供有关servlet的信息,如作者,版本,版权。 

j2ee常用的设计模式?说明工厂模式。 

Java中的23种设计模式: 

Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)。

工厂模式的说明:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 

排序都有哪几种方法? 

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序) 

请对以下在J2EE中常用的名词进行解释(或简单描述) 

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接和容器中的环境变量接接口互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT、WEBLOGIC、WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。 

Web container:实现J2EE体系结构中Web组件协议的容器。这个协议规定了一个Web组件运行时的环境,包括安全,一致性,生命周期管理,事务,配置和其它的服务。一个提供和JSP和J2EE平台APIs界面相同服务的容器。一个Web container 由Web服务器或者J2EE服务器提供。 

EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。  

JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。 

JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。 

JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。 

JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。 

RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值