JAVA程序員筆試面試題匯總及答案_第1頁(yè)
JAVA程序員筆試面試題匯總及答案_第2頁(yè)
JAVA程序員筆試面試題匯總及答案_第3頁(yè)
JAVA程序員筆試面試題匯總及答案_第4頁(yè)
JAVA程序員筆試面試題匯總及答案_第5頁(yè)
已閱讀5頁(yè),還剩121頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、面向?qū)ο蟮奶卣饔心男┓矫?1)抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過(guò)程抽象,二是數(shù)據(jù)抽象。(2)繼承:繼承是一種聯(lián)結(jié)類(lèi)的層次模型,并且允許和鼓勵(lì)類(lèi)的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類(lèi)可以從現(xiàn)有的類(lèi)中派生,這個(gè)過(guò)程稱(chēng)為類(lèi)繼承。新類(lèi)繼承了原始類(lèi)的特性,新類(lèi)稱(chēng)為原始類(lèi)的派生類(lèi)(子類(lèi)),而原始類(lèi)稱(chēng)為新類(lèi)的基類(lèi)(父類(lèi))。派生類(lèi)可以從它的基類(lèi)那里繼承方法和實(shí)例變量,并且類(lèi)可以修改或增加新的方法使之更適合特殊的需要。(3)封裝:封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)只能通過(guò)已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對(duì)象,這些對(duì)象通過(guò)一個(gè)受保護(hù)的接口訪(fǎng)問(wèn)其他對(duì)象。(4)多態(tài)性:多態(tài)性是指允許不同類(lèi)的對(duì)象對(duì)同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問(wèn)題。2、String是最基本的數(shù)據(jù)類(lèi)型嗎?基本數(shù)據(jù)類(lèi)型包括byte、int、char、long、float、double、boolean和short。java.lang.String類(lèi)是final類(lèi)型的,因此不可以繼承這個(gè)類(lèi)、不能修改這個(gè)類(lèi)。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類(lèi)3、int和Integer有什么區(qū)別Java提供兩種不同的類(lèi)型:引用類(lèi)型和原始類(lèi)型(或內(nèi)置類(lèi)型)。Int是java的原始數(shù)據(jù)類(lèi)型,Integer是java為int提供的封裝類(lèi)。

Java為每個(gè)原始類(lèi)型提供了封裝類(lèi)。原始類(lèi)型封裝類(lèi)booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble引用類(lèi)型和原始類(lèi)型的行為完全不同,并且它們具有不同的語(yǔ)義。引用類(lèi)型和原始類(lèi)型具有不同的特征和用法,它們包括:大小和速度問(wèn)題,這種類(lèi)型以哪種類(lèi)型的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),當(dāng)引用類(lèi)型和原始類(lèi)型用作某個(gè)類(lèi)的實(shí)例數(shù)據(jù)時(shí)所指定的缺省值。對(duì)象引用實(shí)例變量的缺省值為null,而原始類(lèi)型實(shí)例變量的缺省值與它們的類(lèi)型有關(guān)。4、String和StringBuffer的區(qū)別JAVA平臺(tái)提供了兩個(gè)類(lèi):String和StringBuffer,它們可以?xún)?chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類(lèi)提供了

數(shù)值不可改變的字符串。而這個(gè)StringBuffer類(lèi)提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer

。典型地,你可以使用StringBuffers來(lái)動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。5、運(yùn)行時(shí)異常與一般異常有何異同?(1)基本概念異常表示程序運(yùn)行過(guò)程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見(jiàn)運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。(2)運(yùn)行時(shí)異常與非運(yùn)行時(shí)異常有什么區(qū)別參考網(wǎng)址:/space.php?uid=122120&do=blog&id=12723(Java提供了兩類(lèi)主要的異常:runtimeexception和checkedexception

。checked異常也就是我們經(jīng)常遇到的IO異常,以及SQL異常都是這種異常。對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫(xiě)一大堆catch塊去處理可能的異常。但是另外一種異常:runtimeexception,也稱(chēng)運(yùn)行時(shí)異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來(lái)沒(méi)有人去處理過(guò)NullPointerException異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見(jiàn)的異常之一。)(3)每個(gè)類(lèi)型的異常的特點(diǎn)

1、Error體系

Error類(lèi)體系描述了Java運(yùn)行系統(tǒng)中的內(nèi)部錯(cuò)誤以及資源耗盡的情形.應(yīng)用程序不應(yīng)該拋出這種類(lèi)型的對(duì)象(一般是由虛擬機(jī)拋出).假如出現(xiàn)這種錯(cuò)誤,除了盡力使程序安全退出外,在其他方面是無(wú)能為力的.所以,在進(jìn)行程序設(shè)計(jì)時(shí),應(yīng)該更關(guān)注Exception體系.

2、Exception體系

Exception體系包括RuntimeException體系和其他非RuntimeException的體系

2.1RuntimeException(程序邏輯錯(cuò)誤)

RuntimeException體系包括錯(cuò)誤的類(lèi)型轉(zhuǎn)換、數(shù)組越界訪(fǎng)問(wèn)和試圖訪(fǎng)問(wèn)空指針等等.處理RuntimeException的原則是:假如出現(xiàn)RuntimeException,那么一定是程序員的錯(cuò)誤.例如,可以通過(guò)檢查數(shù)組下標(biāo)和數(shù)組邊界來(lái)避免數(shù)組越界訪(fǎng)問(wèn)異常.

2.2其他(IOException等等)

這類(lèi)異常一般是外部錯(cuò)誤,例如試圖從文件尾后讀取數(shù)據(jù)等,這并不是程序本身的錯(cuò)誤,而是在應(yīng)用環(huán)境中出現(xiàn)的外部錯(cuò)誤.(4)異常的使用方法

參考網(wǎng)址:

/jiaocheng/2008-09/1452.htm1、聲明方法拋出異常

1.1語(yǔ)法:throws(略)

1.2為什么要聲明方法拋出異常?

方法是否拋出異常與方法返回值的類(lèi)型一樣重要.假設(shè)方法拋出異常確沒(méi)有聲明該方法將拋出異常,那么客戶(hù)程序員可以調(diào)用這個(gè)方法而且不用編寫(xiě)處理異常的代碼.那么,一旦出現(xiàn)異常,那么這個(gè)異常就沒(méi)有合適的異常控制器來(lái)解決.

1.3為什么拋出的異常一定是已檢查異常?

RuntimeException與Error可以在任何代碼中產(chǎn)生,它們不需要由程序員顯示的拋出,一旦出現(xiàn)錯(cuò)誤,那么相應(yīng)的異常會(huì)被自動(dòng)拋出.而已檢查異常是由程序員拋出的,這分為兩種情況:客戶(hù)程序員調(diào)用會(huì)拋出異常的庫(kù)函數(shù)(庫(kù)函數(shù)的異常由庫(kù)程序員拋出);客戶(hù)程序員自己使用throw語(yǔ)句拋出異常.碰到Error,程序員一般是無(wú)能為力的;碰到RuntimeException,那么一定是程序存在邏輯錯(cuò)誤,要對(duì)程序進(jìn)行修改(相當(dāng)于調(diào)試的一種方法);只有已檢查異常才是程序員所關(guān)心的,程序應(yīng)該且僅應(yīng)該拋出或處理已檢查異常.6、說(shuō)出Servlet的生命周期,并說(shuō)出Servlet和CGI的區(qū)別。(1)總括:Servlet被服務(wù)器實(shí)例化后,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法,service方法自動(dòng)派遣運(yùn)行與請(qǐng)求對(duì)應(yīng)的doXXX方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實(shí)例銷(xiāo)毀的時(shí)候調(diào)用其destroy方法。與cgi的區(qū)別在于servlet處于服務(wù)器進(jìn)程中,它通過(guò)多線(xiàn)程方式運(yùn)行其service方法,一個(gè)實(shí)例可以服務(wù)于多個(gè)請(qǐng)求,并且其實(shí)例一般不會(huì)銷(xiāo)毀,而CGI對(duì)每個(gè)請(qǐng)求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷(xiāo)毀,所以效率上低于servlet。

服務(wù)方法

答:1)每當(dāng)服務(wù)接收到對(duì)Servlet的請(qǐng)求時(shí),服務(wù)器就會(huì)產(chǎn)生一個(gè)新線(xiàn)程,并調(diào)用Service。service方法檢查HTTP請(qǐng)求類(lèi)型(GET、POST、PUT、DELETE等),并相應(yīng)地調(diào)用doGet、doPost、doPut、doDelete等。

2)doGet/doPost方法接收HttpServletRequest和HttpServletResponse對(duì)象。

3)99%的時(shí)間里,只需注意GET和/或POST請(qǐng)求;

4)沒(méi)有任何doHead方法。(2)sevlet學(xué)習(xí)摘要/sevlet-Learning-Summary.html

2.1什么是servlet:1)在web容器中運(yùn)行的服務(wù)器端JAVA程序,主要用于響應(yīng)HTTP請(qǐng)求。Servlet一般用于MVC中的控制器部分。2)模塊化的程序,運(yùn)行在服務(wù)器端,增強(qiáng)了請(qǐng)求/響應(yīng)導(dǎo)向服務(wù);

3)應(yīng)用示例:

a.訪(fǎng)問(wèn)遠(yuǎn)端對(duì)象;

b.跟蹤大量信息;

c.多用戶(hù)協(xié)作

2.2JSP構(gòu)架模型

Model1:純jsp維護(hù)難,代碼可復(fù)用性差

Model2:jsp+javabean在jsp中使用usebean標(biāo)簽,代碼在jsp中本質(zhì)同Model1

Mvc:jsp+servlet+javabean

2.3

servlet中如何

1)

從HTML表單中獲得參數(shù)

request.getParameterNames();enumer;

request.getParameter();String

2)

如何獲得請(qǐng)求頭部的信息

Enumerationenumer=request.getHeaderNames();

While(enumer.HasMoreElements())

{

Stringheader=enumer.next();

Stringresult=request.getHeader(header);

Out.print(result);

}

3)

如何獲得客戶(hù)cookie的信息

request.getCookies();array[]

4)

如何設(shè)置response的頭部信息

response.setHeader();

5)

如何設(shè)置響應(yīng)的contenttype

response.setContentType(“text/htmlcharset=utf-8”);

6)

如何獲得I/O流、text流、二進(jìn)制流

7)

如何從當(dāng)前的servlet重定向到其他的URL

response.sendRedirect(“url”)

RequstDispatcherrd=request.getRequstDispatcher(“url”)

Rd.forword(request,response);

8)

如何向客戶(hù)端寫(xiě)cookie

Cookiecookie=newCookie(“object”,”jklj”);

Cookie.setMaxAge(時(shí)間);

Response.addCookie(cookie);

2.4

如何創(chuàng)建RequestDispatcher對(duì)象,如何將請(qǐng)求轉(zhuǎn)發(fā)給其它的web資源(包含其它的web資源),描述如何利用request來(lái)存狀態(tài),以及與其它保存狀態(tài)方法有什么區(qū)別

RequstDispatcherrd=request.getRequstDispatcher(“url”)

Rd.forword(request,response);

Request.setAttribute(“object”,”內(nèi)容”);

一旦產(chǎn)生響應(yīng)request的生命周期就結(jié)束了

2.5

描述servlet的生命周期,誰(shuí)來(lái)控制servlet的生命周期,servlet生命周期在J2EE規(guī)范中是如何來(lái)定義的

服務(wù)器實(shí)例化一個(gè)servlet對(duì)象,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法,service方法根據(jù)請(qǐng)求的類(lèi)型調(diào)用(doGet,doPost)方法,當(dāng)服務(wù)器決定將實(shí)例銷(xiāo)毀時(shí)調(diào)用其destory方法。

2.6

如何創(chuàng)建RequestDispatcher對(duì)象,如何將請(qǐng)求轉(zhuǎn)發(fā)給其它的web資源(包含其它的web資源),描述如何利用request來(lái)存狀態(tài),以及與其它保存狀態(tài)方法有什么區(qū)別

RequstDispatcherrd=request.getRequstDispatcher(“url”)

Rd.forword(request,response);

Request.setAttribute(“object”,”內(nèi)容”);

一旦產(chǎn)生響應(yīng)request的生命周期就結(jié)束了

2.7

如何在web.xml中配置servlet

定義

<servlet>

<servlet-name>name</servlet-name>

<servlet-class>package</servlet-class>

</servlet>

映射

<servlet-mapping>

<servlet-name>name</servlet-name>

<url-patten>/patten</url-patten>

</servlet-mapping>

2.8

獲得ServletConfig對(duì)象

ServletConfigsc=getServletConfig();

2.9

如何獲得servletContext對(duì)象

servletContextsc=getservletContext();

18.

<html><body>

<ahref=”/servlet/HelloServlet”>POST</a>

</body></html>

調(diào)用servlet時(shí)采用了doPost、doGet、doForm、doHref中的哪個(gè)方法

doGet方法

2.10

doGet:

PrintWriterout=res.getWriter();

Out.println(“<html><body>Hello</body></html>”);

If(!res.isCommitted())判斷是否response提交了

If(reg.getParameter(”name”)==null)

{

res.sendError(HttpServletResponse.SC_UNAUTHORIZED);

}

2.11

說(shuō)明如下的web的資源應(yīng)該放在web容器中的什么目錄下,靜態(tài)頁(yè)面JSP、servletclass、web.xml、Taglibraries、JARFile、javaclass以及需要保護(hù)的資源文件tomcat容器

web.xml,Taglibraries:\webapps\工程名\WEB-INF

servlet,javaclass:\webapps\工程名\WEB-INF\classes\

jar:\webapps\工程名\WEB-INF\lib\

2.12

如何打war包

將web項(xiàng)目壓縮成rar文件然后將后綴名改為war。

2.13

如何利用ServletContext對(duì)象獲得初始化參數(shù)

servletContextsc=getservletContext();

Strings=sc.getInitParameter(key);

2.14

如何在配置文件中配置ServletContext初始化參數(shù)

<init-param>

<param-name>name</param-name>

<param-value>vlaue</param-value>

</init-param>

2.15

寫(xiě)代碼來(lái)將對(duì)象放入ServletContext中以及取出對(duì)象

servletContextsc=getservletContext();

sc.setAttribute(key,value);

2.16

描述requestsessionwebapplication的區(qū)別,創(chuàng)建監(jiān)聽(tīng)器類(lèi)來(lái)監(jiān)聽(tīng)每個(gè)scope的生命周期

生命周期不同。request產(chǎn)生響應(yīng)時(shí)生命周期結(jié)束,session在web.xml中設(shè)置生命周期時(shí)間、手動(dòng)清除web容器重啟生命周期結(jié)束。Webapplication容器重啟、手動(dòng)清除2.17start

26.

如何配置listener

27.

如何來(lái)寫(xiě)以及配置filter

28.

創(chuàng)建一個(gè)request或response對(duì)象的包裝類(lèi)

29.

寫(xiě)一段servlet代碼,用來(lái)將對(duì)象存入session以及從session中取出該對(duì)象

HttpSessionsession=request.getSession();

session.setAttribute(key,value);

30.

描述用來(lái)訪(fǎng)問(wèn)session對(duì)象的API

31.

說(shuō)明session對(duì)象的生命周期

session在web.xml中設(shè)置生命周期時(shí)間、手動(dòng)清除web容器重啟生命周期結(jié)束

32.

寫(xiě)一段代碼來(lái)響應(yīng)當(dāng)對(duì)象加入session時(shí)的事件

33.

描述web容器使用了什么機(jī)制來(lái)管理session

34.

如何使session失效

session在web.xml中設(shè)置生命周期時(shí)間、手動(dòng)清除web容器重啟生命周期結(jié)束

35.

描述將session與客戶(hù)端Birding的流程及方法

36.

當(dāng)client不支持cookie時(shí),如何使用session

37.

什么是Authentication(識(shí)別(用戶(hù))):識(shí)別用戶(hù)是誰(shuí)?什么是Authorization(授權(quán))對(duì)識(shí)別后的用戶(hù)給予什么樣的權(quán)限。數(shù)據(jù)的完整性:提交數(shù)據(jù),操作數(shù)據(jù),數(shù)據(jù)庫(kù)數(shù)據(jù)。數(shù)據(jù)的機(jī)密性:加密,HTTPS

38.

JSP中指令標(biāo)簽的形式

JSP中聲明標(biāo)簽的形式

JSP中代碼段標(biāo)簽的形式

JSP中動(dòng)作標(biāo)簽的形式

JSP中注釋標(biāo)簽的形式

JSP中的表達(dá)式標(biāo)簽的形式

39.

指令標(biāo)簽有哪些?

40.

action標(biāo)簽有哪些?

41.

page的屬性

42.

<%!inti;%>→成員變量

<%intj;%>→局部變量

<%=i++%><%=j++%>

43.

JSP中的內(nèi)置對(duì)象

44.

<%@includefile=””%>與<jsp:includepage=””/>不同

45.

jsp:useBean(id,scope,type,type,class)的使用end7、說(shuō)出ArrayList,Vector,LinkedList的存儲(chǔ)性能和特性ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線(xiàn)程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。8、EJB是基于哪些技術(shù)實(shí)現(xiàn)的?并說(shuō)出SessionBean和EntityBean的區(qū)別,StatefulBean和StatelessBean的區(qū)別。EJBEJB是sun的服務(wù)器端組件模型,最大的用處是部署分布式應(yīng)用程序當(dāng)然,還有許多方式可以實(shí)現(xiàn)分布式應(yīng)用,類(lèi)似微軟的.net技術(shù)。憑借java跨平臺(tái)的優(yōu)勢(shì),用EJB技術(shù)部署的分布式系統(tǒng)可以不限于特定的平臺(tái)。EJB(EnterpriseJavaBean)是J2EE的一部分,定義了一個(gè)用于開(kāi)發(fā)基于組件的企業(yè)多重應(yīng)用程序的標(biāo)準(zhǔn)。其特點(diǎn)包括網(wǎng)絡(luò)服務(wù)支持和核心開(kāi)發(fā)工具(SDK)。在J2EE里,EnterpriseJavaBeans(EJB)稱(chēng)為Java企業(yè)Bean,是Java的核心代碼,分別是會(huì)話(huà)Bean(SessionBean),實(shí)體Bean(EntityBean)和消息驅(qū)動(dòng)Bean(MessageDrivenBean)。EJB簡(jiǎn)介1.SessionBean用于實(shí)現(xiàn)業(yè)務(wù)邏輯,它可以是有狀態(tài)的,也可以是無(wú)狀態(tài)的。每當(dāng)客戶(hù)端請(qǐng)求時(shí),容器就會(huì)選擇一個(gè)SessionBean來(lái)為客戶(hù)端服務(wù)。SessionBean可以直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),但更多時(shí)候,它會(huì)通過(guò)EntityBean實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn)。2.EntityBean是域模型對(duì)象,用于實(shí)現(xiàn)O/R映射,負(fù)責(zé)將數(shù)據(jù)庫(kù)中的表記錄映射為內(nèi)存中的Entity對(duì)象,事實(shí)上,創(chuàng)建一個(gè)EntityBean對(duì)象相當(dāng)于新建一條記錄,刪除一個(gè)EntityBean會(huì)同時(shí)從數(shù)據(jù)庫(kù)中刪除對(duì)應(yīng)記錄,修改一個(gè)EntityBean時(shí),容器會(huì)自動(dòng)將EntityBean的狀態(tài)和數(shù)據(jù)庫(kù)同步。3.MessageDrivenBean是EJB2.0中引入的新的企業(yè)Bean,它基于JMS消息,只能接收客戶(hù)端發(fā)送的JMS消息然后處理。MDB實(shí)際上是一個(gè)異步的無(wú)狀態(tài)SessionBean,客戶(hù)端調(diào)用MDB后無(wú)需等待,立刻返回,MDB將異步處理客戶(hù)請(qǐng)求。這適合于需要異步處理請(qǐng)求的場(chǎng)合,比如訂單處理,這樣就能避免客戶(hù)端長(zhǎng)時(shí)間的等待一個(gè)方法調(diào)用直到返回結(jié)果。EJB實(shí)際上是SUN的J2EE中的一套規(guī)范,并且規(guī)定了一系列的API用來(lái)實(shí)現(xiàn)把EJB概念轉(zhuǎn)換成EJB產(chǎn)品.EJB是BEANS,BEANS是什么概念,那就是得有一個(gè)容納她,讓她可勁造騰的地方,就是得有容器.EJB必須生存在EJB容器中.這個(gè)容器可是功能強(qiáng)大之極!她首先要包裝你BEAN,EJB的客戶(hù)程序?qū)嶋H上從來(lái)就不和你編寫(xiě)的EJB直接打交道,他們之間是通過(guò)HOME/REMOTE接口來(lái)發(fā)生關(guān)系的.它負(fù)責(zé)你的BEAN的所有的吃喝拉撒睡,比如BEAN的持續(xù)化,安全性,事務(wù)管理...一.什么是EJB?一個(gè)技術(shù)規(guī)范:EJB從技術(shù)上而言不是一種"產(chǎn)品"EJBEJB是一種標(biāo)準(zhǔn)描述了構(gòu)建應(yīng)用組件要解決的:可擴(kuò)展(Scalable)分布式(Distributed)事務(wù)處理(Transactional)數(shù)據(jù)存儲(chǔ)(Persistent)安全性(Secure)二.Sun對(duì)EJB的期望提供一個(gè)標(biāo)準(zhǔn)的分布的、基于

OO

的組件架構(gòu)屏蔽復(fù)雜的系統(tǒng)級(jí)功能需求Writeonce,runanywhere與非Java應(yīng)用之間的互操作能力兼容CORBA

標(biāo)準(zhǔn)三.為什么選擇EJB?EJB服務(wù)器完成"繁雜"的工作:應(yīng)用開(kāi)發(fā)人員關(guān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn)而不是底層的實(shí)現(xiàn)機(jī)制(類(lèi)似于

4GL

語(yǔ)言設(shè)計(jì)的目標(biāo))支持事務(wù)處理多個(gè)業(yè)務(wù)操作同時(shí)成功,或全部失敗可以通過(guò)在代碼外的描述來(lái)定義事務(wù)處理級(jí)別EJB可擴(kuò)展性EJB可以根據(jù)您應(yīng)用的增長(zhǎng)而擴(kuò)展EJB服務(wù)器往往還提供了負(fù)載均衡和安全性:由EJB服務(wù)器提供資源的訪(fǎng)問(wèn)權(quán)限控制四.EJB架構(gòu)為了滿(mǎn)足架構(gòu)的目標(biāo),規(guī)范中描述了服務(wù)器(Server)容器(Container)類(lèi)(Class)和實(shí)例(Instance)Home和Remote接口客戶(hù)端(Client)五.簡(jiǎn)化的編程模型關(guān)注于業(yè)務(wù)邏輯實(shí)現(xiàn):EJB負(fù)責(zé)生命周期(lifecycle),數(shù)據(jù)存儲(chǔ)(persistence),事務(wù)處理語(yǔ)義(transactionalsemantic),安全(security),...通用的編程模型:各種服務(wù)的高層

APIJava是其編程語(yǔ)言EJB(業(yè)務(wù)邏輯代碼)表示了與特定商業(yè)領(lǐng)域(例如銀行、零售等行業(yè))相適應(yīng)的邏輯。它由運(yùn)行在業(yè)務(wù)邏輯層的enterprisebean處理。一個(gè)enterprisebean可以從客戶(hù)端接受數(shù)據(jù),對(duì)它進(jìn)行處理,并將其發(fā)送到企業(yè)信息系統(tǒng)層以作存儲(chǔ);同時(shí)它也可以從存儲(chǔ)器獲取數(shù)據(jù),處理后將其發(fā)送到客戶(hù)端應(yīng)用程序。有三種類(lèi)型的enterprisebeans:sessionbeans、entitybeans和message-drivenbeans。Sessionbean描述了與客戶(hù)端的一個(gè)短暫的會(huì)話(huà)。當(dāng)客戶(hù)端的執(zhí)行完成后,sessionbean和它的數(shù)據(jù)都將消失;與之相對(duì)應(yīng)的是一個(gè)entitybean描述了存儲(chǔ)在數(shù)據(jù)庫(kù)表中的一行持久穩(wěn)固的數(shù)據(jù),如果客戶(hù)端終止或者服務(wù)結(jié)束,底層的服務(wù)會(huì)負(fù)責(zé)entitybean數(shù)據(jù)的存儲(chǔ)。Message-drivenbean結(jié)合了sessionbean和Java信息服務(wù)(JMS)信息監(jiān)聽(tīng)者的功能,它允許一個(gè)商業(yè)組件異步地接受JMS消息。其它EJB包括SessionBean、EntityBean、MessageDrivenBean,基于JNDI、RMI、JAT等技術(shù)實(shí)現(xiàn)。SessionBean在J2EE應(yīng)用程序中被用來(lái)完成一些服務(wù)器端的業(yè)務(wù)操作,例如訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)、調(diào)用其他EJB組件。EntityBean被用來(lái)代表應(yīng)用系統(tǒng)中用到的數(shù)據(jù)。對(duì)于客戶(hù)機(jī),SessionBean是一種非持久性對(duì)象,它實(shí)現(xiàn)某些在服務(wù)器上運(yùn)行的業(yè)務(wù)邏輯。對(duì)于客戶(hù)機(jī),EntityBean是一種持久性對(duì)象,它代表一個(gè)存儲(chǔ)在持久性存儲(chǔ)器中的實(shí)體的對(duì)象視圖,或是一個(gè)由現(xiàn)有企業(yè)應(yīng)用程序?qū)崿F(xiàn)的實(shí)體。SessionBean還可以再細(xì)分為StatefulSessionBean與StatelessSessionBean,這兩種的SessionBean都可以將系統(tǒng)邏輯放在method之中執(zhí)行,不同的是StatefulSessionBean可以記錄呼叫者的狀態(tài),因此通常來(lái)說(shuō),一個(gè)使用者會(huì)有一個(gè)相對(duì)應(yīng)的StatefulSessionBean的實(shí)體。StatelessSessionBean雖然也是邏輯組件,但是他卻不負(fù)責(zé)記錄使用者狀態(tài),也就是說(shuō)當(dāng)使用者呼叫StatelessSessionBean的時(shí)候,EJBContainer并不會(huì)找尋特定的StatelessSessionBean的實(shí)體來(lái)執(zhí)行這個(gè)method。換言之,很可能數(shù)個(gè)使用者在執(zhí)行某個(gè)StatelessSessionBean的methods時(shí),會(huì)是同一個(gè)Bean的Instance在執(zhí)行。從內(nèi)存方面來(lái)看,StatefulSessionBean與StatelessSessionBean比較,StatefulSessionBean會(huì)消耗J2EEServer較多的內(nèi)存,然而StatefulSessionBean的優(yōu)勢(shì)卻在于他可以維持使用者的狀態(tài)。9、Collection和Collections的區(qū)別。Collection是集合類(lèi)的上級(jí)接口,繼承與他的接口主要有Set和List.Collections是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線(xiàn)程安全化等操作。10、&和&&的區(qū)別。&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and)。11、HashMap和Hashtable的區(qū)別。HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線(xiàn)程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線(xiàn)程安全,效率上可能高于Hashtable。HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。Hashtable繼承自Dictionary類(lèi),而HashMap是Java1.2引進(jìn)的Mapinterface的一個(gè)實(shí)現(xiàn)。最大的不同是,Hashtable的方法是Synchronize(同步)的,而HashMap不是,在多個(gè)線(xiàn)程訪(fǎng)問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步。Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。12、final,finally,finalize的區(qū)別。一、概述final用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,類(lèi)不可繼承。finally是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。finalize是Object類(lèi)的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。/news/show/194.html二、finalize

C++

支持局部對(duì)象(基于棧)和全局對(duì)象(基于堆)。棧對(duì)象由編譯器檢測(cè)釋放,堆對(duì)象由程序員來(lái)釋放。在許多方面,Java

類(lèi)似于

C++。Java

的語(yǔ)法非常類(lèi)似于

C++,Java

有類(lèi)、方法和數(shù)據(jù)成員;Java

的類(lèi)有構(gòu)造函數(shù);

Java

有異常處理。

但是,如果你使用過(guò)

C++

會(huì)發(fā)現(xiàn)

Java

也丟掉一些可能是你熟悉的特性。這些特性之一就是析構(gòu)函數(shù)。取代使用析構(gòu)函數(shù),Java

支持finalize()

方法。

在本文中,我們將描述

finalize()

C++

析構(gòu)函數(shù)的區(qū)別。另外,我們將創(chuàng)建一個(gè)簡(jiǎn)單的

Applet

來(lái)演示

finalize()

是如何工作的。

最終的界限

Java

不同,C++

支持局部對(duì)象(基于棧)和全局對(duì)象(基于堆)。因?yàn)檫@一雙重支持,C++

也提供了自動(dòng)構(gòu)造和析構(gòu),這導(dǎo)致了對(duì)構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用,(對(duì)于堆對(duì)象)就是內(nèi)存的分配和釋放。

Java

中,所有對(duì)象都駐留在堆內(nèi)存,因此局部對(duì)象就不存在。結(jié)果,Java

的設(shè)計(jì)者覺(jué)得不需要析構(gòu)函數(shù)(象

C++

中所實(shí)現(xiàn)的)。

取而代之,Java

定義了一個(gè)特殊的方法叫做finalize()

,它提供了

C++

析構(gòu)函數(shù)的一些功能。但是,finalize()

并不完全與

C++

的析構(gòu)函數(shù)一樣,并可以假設(shè)它會(huì)導(dǎo)致一系列的問(wèn)題。finalize()

方法作用的一個(gè)關(guān)鍵元素是

Java

的垃圾回收器。

垃圾回收器

C/C++、Pascal和其他幾種多種用途的編程語(yǔ)言中,開(kāi)發(fā)者有責(zé)任在內(nèi)存管理上發(fā)揮積極的作用。例如,如果你為一個(gè)對(duì)象或數(shù)據(jù)結(jié)構(gòu)分配了內(nèi)存,那么當(dāng)你不再使用它時(shí)必須釋放掉該內(nèi)存。

Java

中,當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí),Java

虛擬機(jī)(JVM)為該對(duì)象分配內(nèi)存、調(diào)用構(gòu)造函數(shù)并開(kāi)始跟蹤你使用的對(duì)象。當(dāng)你停止使用一個(gè)對(duì)象(就是說(shuō),當(dāng)沒(méi)有對(duì)該對(duì)象有效的引用時(shí)),JVM

通過(guò)垃圾回收器將該對(duì)象標(biāo)記為釋放狀態(tài)。

當(dāng)垃圾回收器將要釋放一個(gè)對(duì)象的內(nèi)存時(shí),它調(diào)用該對(duì)象的finalize()

方法(如果該對(duì)象定義了此方法)。垃圾回收器以獨(dú)立的低優(yōu)先級(jí)的方式運(yùn)行,只有當(dāng)其他線(xiàn)程掛起等待該內(nèi)存釋放的情況出現(xiàn)時(shí),它才開(kāi)始運(yùn)行釋放對(duì)象的內(nèi)存。(事實(shí)上,你可以調(diào)用System.gc()

方法強(qiáng)制垃圾回收器來(lái)釋放這些對(duì)象的內(nèi)存。)

在以上的描述中,有一些重要的事情需要注意。首先,只有當(dāng)垃圾回收器釋放該對(duì)象的內(nèi)存時(shí),才會(huì)執(zhí)行finalize()。如果在

Applet

或應(yīng)用程序退出之前垃圾回收器沒(méi)有釋放內(nèi)存,垃圾回收器將不會(huì)調(diào)用finalize()。

其次,除非垃圾回收器認(rèn)為你的

Applet

或應(yīng)用程序需要額外的內(nèi)存,否則它不會(huì)試圖釋放不再使用的對(duì)象的內(nèi)存。換句話(huà)說(shuō),這是完全可能的:一個(gè)

Applet

給少量的對(duì)象分配內(nèi)存,沒(méi)有造成嚴(yán)重的內(nèi)存需求,于是垃圾回收器沒(méi)有釋放這些對(duì)象的內(nèi)存就退出了。

顯然,如果你為某個(gè)對(duì)象定義了finalize()

方法,JVM

可能不會(huì)調(diào)用它,因?yàn)槔厥掌鞑辉尫胚^(guò)那些對(duì)象的內(nèi)存。調(diào)用System.gc()

也不會(huì)起作用,因?yàn)樗鼉H僅是給

JVM

一個(gè)建議而不是命令。

finalize()

有什么優(yōu)點(diǎn)呢?

如果finalize()

不是析構(gòu)函數(shù),JVM

不一定會(huì)調(diào)用它,你可能會(huì)疑惑它是否在任何情況下都有好處。事實(shí)上,在

Java1.0

中它并沒(méi)有太多的優(yōu)點(diǎn)。

根據(jù)

Java

文檔,finalize()

是一個(gè)用于釋放非

Java

資源的方法。但是,JVM

有很大的可能不調(diào)用對(duì)象的finalize()

方法,因此很難證明使用該方法釋放資源是有效的。

Java1.1

通過(guò)提供一個(gè)System.runFinalizersOnExit()

方法部分地解決了這個(gè)問(wèn)題。(不要將這個(gè)方法與

Java1.0

中的System.runFinalizations()

方法相混淆。)不象System.gc()

方法那樣,System.runFinalizersOnExit()

方法并不立即試圖啟動(dòng)垃圾回收器。而是當(dāng)應(yīng)用程序或

Applet

退出時(shí),它調(diào)用每個(gè)對(duì)象的finalize()

方法。

正如你可能猜測(cè)的那樣,通過(guò)調(diào)用System.runFinalizersOnExit()

方法強(qiáng)制垃圾回收器清除所有獨(dú)立對(duì)象的內(nèi)存,當(dāng)清除代碼執(zhí)行時(shí)可能會(huì)引起明顯的延遲。現(xiàn)在建立一個(gè)示例

Applet

來(lái)演示

Java

垃圾回收器和finalize()

方法是如何相互作用的。

回收垃圾

通過(guò)使用JavaAppletWizard

創(chuàng)建一個(gè)新的

Applet

開(kāi)始。當(dāng)提示這樣做時(shí),輸入

final_things

作為

Applet

名,并選擇不要生成源文件注釋。

接下來(lái),在JavaAppletWizard

進(jìn)行第三步,不要選擇多線(xiàn)程選項(xiàng)。在第五步之前,根據(jù)需要修改

Applet

的描述。

當(dāng)你單擊Finish

后,AppletWizard

將生成一個(gè)新的工作空間,并為該項(xiàng)目創(chuàng)建缺省的

Java

文件。從列表

A

中選擇適當(dāng)?shù)拇a輸入(我們已經(jīng)突出顯示了你需要輸入的代碼)。

當(dāng)你完成代碼的輸入后,配置Internet

瀏覽器將System.out

的輸出信息寫(xiě)到Javalog.txt

文件中。(在IE

選項(xiàng)對(duì)話(huà)框的高級(jí)頁(yè)面中選擇起用

JavaLogging。)編譯并運(yùn)行該

Applet。然后,等待

Applet

運(yùn)行(你將在狀態(tài)欄中看到

Applet

已啟動(dòng)的信息),退出瀏覽器,并打開(kāi)Javalog.txt

文件。你將會(huì)發(fā)現(xiàn)類(lèi)似于下列行的信息:

1000thingsconstructed

0thingsfinalized

正如你能夠看到的那樣,建立了1,000個(gè)對(duì)象仍然沒(méi)有迫使垃圾回收器開(kāi)始回收空間,即使在

Applet

退出時(shí)也沒(méi)有對(duì)象被使用。

現(xiàn)在,刪除在stop()

方法第一行中的注釋符以起用System.gc()

方法。再次編譯并運(yùn)行該

Applet

,等待

Applet

完成運(yùn)行,并退出瀏覽器。當(dāng)你再次打開(kāi)Javalog.txt文件,你將看到下列行:

1000thingsconstructed

963thingsfinalized

這次,垃圾回收器認(rèn)為大多數(shù)對(duì)象未被使用,并將它們回收。按順序,當(dāng)垃圾回收器開(kāi)始釋放這些對(duì)象的內(nèi)存時(shí),JVM

調(diào)用它們的finalize()

方法。

繼承finalize()?

順便,如果你在類(lèi)中定義了finalize()

,它將不會(huì)自動(dòng)調(diào)用基類(lèi)中的方法。在我們討論了finalize()

C++

的析構(gòu)函數(shù)的不同點(diǎn)后,對(duì)這個(gè)結(jié)論不會(huì)驚訝,因?yàn)闉槟硞€(gè)類(lèi)定制的清除代碼另一個(gè)類(lèi)不一定會(huì)需要。

如果你決定要通過(guò)派生一個(gè)類(lèi)的finalize()

方法來(lái)調(diào)用基類(lèi)中的finalize()

方法,你可以象其他繼承方法一樣處理。

protectedvoidfinalize()

{

super.finalize();

//otherfinalizationcode...

}

除了允許你控制是否執(zhí)行清除操作外,這個(gè)技術(shù)還使你可以控制當(dāng)前類(lèi)的finalize()方法何時(shí)執(zhí)行。

結(jié)論

然而有益的是,Java

的自動(dòng)垃圾回收器不會(huì)失去平衡。作為便利的代價(jià),你不得不放棄對(duì)系統(tǒng)資源釋放的控制。不象

C++

中的析構(gòu)函數(shù),JavaApplet

不會(huì)自動(dòng)執(zhí)行你的類(lèi)中的finalize()

方法。事實(shí)上,如果你正在使用

Java1.0,即使你試圖強(qiáng)制它調(diào)用finalize()

方法,也不能確保將調(diào)用它。

因此,你不應(yīng)當(dāng)依靠finalize()

來(lái)執(zhí)行你的

Applet

和應(yīng)用程序的資源清除工作。取而代之,你應(yīng)當(dāng)明確的清除那些資源或創(chuàng)建一個(gè)try...finally

塊(或類(lèi)似的機(jī)制)來(lái)實(shí)現(xiàn)。(如reader對(duì)象資源的釋放)13、sleep()和wait()有什么區(qū)別?sleep是線(xiàn)程類(lèi)(Thread)的方法,導(dǎo)致此線(xiàn)程暫停執(zhí)行指定時(shí)間,把執(zhí)行機(jī)會(huì)給其他線(xiàn)程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。wait是Object類(lèi)的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線(xiàn)程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線(xiàn)程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。14、Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類(lèi)型?方法的重寫(xiě)Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫(xiě)Overriding是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)。如果在子類(lèi)中定義某方法與其父類(lèi)有相同的名稱(chēng)和參數(shù),我們說(shuō)該方法被重寫(xiě)(Overriding)。子類(lèi)的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類(lèi)中的定義,對(duì)它而言,父類(lèi)中的定義如同被"屏蔽"了。如果在一個(gè)類(lèi)中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類(lèi)型,則稱(chēng)為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類(lèi)型。15、error和exception有什么區(qū)別?error表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。16、同步和異步有何異同,在什么情況下分別使用他們?舉例說(shuō)明。如果數(shù)據(jù)將在線(xiàn)程間共享。例如正在寫(xiě)的數(shù)據(jù)以后可能被另一個(gè)線(xiàn)程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線(xiàn)程寫(xiě)過(guò)了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來(lái)執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。17、abstractclass和interface有什么區(qū)別?聲明方法的存在而不去實(shí)現(xiàn)它的類(lèi)被叫做抽象類(lèi)(abstractclass),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類(lèi),并為該類(lèi)聲明方法,但不能在該類(lèi)中實(shí)現(xiàn)該類(lèi)的情況。不能創(chuàng)建abstract類(lèi)的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類(lèi)型是一個(gè)抽象類(lèi),并讓它指向具體子類(lèi)的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類(lèi)的子類(lèi)為它們父類(lèi)中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類(lèi)為。取而代之,在子類(lèi)中實(shí)現(xiàn)該方法。知道其行為的其它類(lèi)可以在類(lèi)中實(shí)現(xiàn)這些方法。接口(interface)是抽象類(lèi)的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體。接口只可以定義staticfinal成員變量。接口的實(shí)現(xiàn)與子類(lèi)相似,除了該實(shí)現(xiàn)類(lèi)不能從接口定義中繼承行為。當(dāng)類(lèi)實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類(lèi)的任何對(duì)象上調(diào)用接口的方法。由于有抽象類(lèi),它允許使用接口名作為引用變量的類(lèi)型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類(lèi)型或從接口類(lèi)型轉(zhuǎn)換,instanceof運(yùn)算符可以用來(lái)決定某對(duì)象的類(lèi)是否實(shí)現(xiàn)了接口。18、heap和stack有什么區(qū)別。/view/93201.htm棧是一種線(xiàn)形集合,其添加和刪除元素的操作應(yīng)在同一端完成。棧按照后進(jìn)先出的方式進(jìn)行處理。堆是棧的一個(gè)組成元素19、forward和redirect的區(qū)別forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪(fǎng)問(wèn)目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來(lái)的,所以它的地址欄中還是原來(lái)的地址。redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址,一般來(lái)說(shuō)瀏覽器會(huì)用剛才請(qǐng)求的所有參數(shù)重新請(qǐng)求,所以session,request參數(shù)都可以獲取。20、EJB與JAVABEAN的區(qū)別?JavaBean是可復(fù)用的組件,對(duì)JavaBean并沒(méi)有嚴(yán)格的規(guī)范,理論上講,任何一個(gè)Java類(lèi)都可以是一個(gè)Bean。但通常情況下,由于JavaBean是被容器所創(chuàng)建(如Tomcat)的,所以JavaBean應(yīng)具有一個(gè)無(wú)參的構(gòu)造器,另外,通常JavaBean還要實(shí)現(xiàn)Serializable接口用于實(shí)現(xiàn)Bean的持久性。JavaBean實(shí)際上相當(dāng)于微軟COM模型中的本地進(jìn)程內(nèi)COM組件,它是不能被跨進(jìn)程訪(fǎng)問(wèn)的。EnterpriseJavaBean相當(dāng)于DCOM,即分布式組件。它是基于Java的遠(yuǎn)程方法調(diào)用(RMI)技術(shù)的,所以EJB可以被遠(yuǎn)程訪(fǎng)問(wèn)(跨進(jìn)程、跨計(jì)算機(jī))。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶(hù)從不直接訪(fǎng)問(wèn)真正的EJB組件,而是通過(guò)其容器訪(fǎng)問(wèn)。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理??蛻?hù)通過(guò)容器來(lái)訪(fǎng)問(wèn)真正的EJB組件。21、StaticNestedClass和InnerClass的不同。StaticNestedClass是被聲明為靜態(tài)(static)的內(nèi)部類(lèi),它可以不依賴(lài)于外部類(lèi)實(shí)例被實(shí)例化。而通常的內(nèi)部類(lèi)需要在外部類(lèi)實(shí)例化后才能實(shí)例化。定義——InnerClass內(nèi)部類(lèi)是定義在其他類(lèi)內(nèi)部的類(lèi)。它幾乎可以處于類(lèi)內(nèi)部任何位置,可以與實(shí)例變量處于同一級(jí),或處于方法之內(nèi),甚至是一個(gè)表達(dá)式的一部分!內(nèi)部類(lèi)是JAVA語(yǔ)言的主要附加部分。優(yōu)點(diǎn)——InnerClass⒈內(nèi)部類(lèi)對(duì)象可以訪(fǎng)問(wèn)創(chuàng)建它的對(duì)象的實(shí)現(xiàn),包括私有數(shù)據(jù);⒉內(nèi)部類(lèi)不為同一包的其他類(lèi)所見(jiàn),具有很好的封裝性;⒊使用內(nèi)部類(lèi)可以很方便的編寫(xiě)事件驅(qū)動(dòng)程序;⒋匿名內(nèi)部類(lèi)可以方便的定義運(yùn)行時(shí)回調(diào);區(qū)別/navyzh/archive/2009/02/26/3938447.aspxNestedClass(一般是C++的說(shuō)法),InnerClass(一般是JAVA的說(shuō)法)。Java內(nèi)部類(lèi)與C++嵌套類(lèi)最大的不同就在于是否有指向外部的引用上。Nestedclass!=innerclass,innerclass是一種特殊的Nestedclass。對(duì)內(nèi)部類(lèi)的限制:不能聲明static初始化操作22、JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?動(dòng)態(tài)INCLUDE用jsp:include動(dòng)作實(shí)現(xiàn)<!--includefile="included.htm"-->23、什么時(shí)候用assert。assertion(斷言)在軟件開(kāi)發(fā)中是一種常用的調(diào)試方式,很多開(kāi)發(fā)語(yǔ)言中都支持這種機(jī)制。在實(shí)現(xiàn)中,assertion就是在程序中的一條語(yǔ)句,它對(duì)一個(gè)boolean表達(dá)式進(jìn)行檢查,一個(gè)正確程序必須保證這個(gè)boolean表達(dá)式的值為true;如果該值為false,說(shuō)明程序已經(jīng)處于不正確的狀態(tài)下,系統(tǒng)將給出警告或退出。一般來(lái)說(shuō),assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查通常在開(kāi)發(fā)和測(cè)試時(shí)開(kāi)啟。為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的。J2SE1.4在語(yǔ)言上提供了一個(gè)新特性,就是assertion(斷言)功能,它是該版本在Java語(yǔ)言方面最大的革新。在軟件開(kāi)發(fā)中,assertion是一種經(jīng)典的調(diào)試、測(cè)試方式。/developerworks/cn/java/l-javaassertion/24、GC是什么?為什么要有GC?GC是垃圾收集的意思(GabageCollection),內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法。25、shorts1=1;s1=s1+1;有什么錯(cuò)?shorts1=1;s1+=1;有什么錯(cuò)?shorts1=1;s1=s1+1;(s1+1運(yùn)算結(jié)果是int型,需要強(qiáng)制轉(zhuǎn)換類(lèi)型)shorts1=1;s1+=1;(可以正確編譯)26、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?Math.round(11.5)==12Math.round(-11.5)==-11round方法返回與參數(shù)最接近的長(zhǎng)整數(shù),參數(shù)加1/2后求其floor.27、Strings=newString("xyz");創(chuàng)建了幾個(gè)StringObject?一、概括兩個(gè)(一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對(duì)象s)二、Java棧與堆

(詳解string實(shí)例的創(chuàng)建)

/u/20081123/12/f70f1632-24be-4caa-bc20-29cf8267afab.html測(cè)試用例1:存在棧中的數(shù)據(jù)可以共享Stringstr1="abc";

//開(kāi)辟一個(gè)存放字面值為"abc"的地址,接著創(chuàng)建一個(gè)新的String類(lèi)的對(duì)象o,并將o的字符串值指向這個(gè)地址,而且在棧中這個(gè)地址旁邊記下這個(gè)引用的對(duì)象o.創(chuàng)建一個(gè)引用str1指向?qū)ο髈的地址Stringstr2="abc";

//創(chuàng)建另一個(gè)引用str2指向?qū)ο髈的地址

str1="bcd";

//當(dāng)str1改完其值后,創(chuàng)建新的對(duì)象指向"bcd"的地址,并將引用str1指向新對(duì)象的地址

Stringstr3=str1;

//未創(chuàng)建新對(duì)象,str3指向str1相同的地址

System.out.println(str3);//bcd

Stringstr4="bcd";

//當(dāng)str1改完其值后,再創(chuàng)建一個(gè)String的引用str4,并指向因str1修改值而創(chuàng)建的新的對(duì)象。

System.out.println(str1==str4);//true

測(cè)試用例2:堆中創(chuàng)建string實(shí)例只要是用new()來(lái)新建對(duì)象的,都會(huì)在堆中創(chuàng)建,而且其字符串是單獨(dú)存值的Strings1=newString("abc");Strings2=newString("abc");System.out.println(s1+","+s2);//abc,abcSystem.out.println(s1.equals(s2));//trueSystem.out.println(s1==s2);//falseStrings3=s1;//將引用s1的值賦給s3,指向同一個(gè)對(duì)象地址System.out.println(s1==s3);//trues1="cde";Strings4="cde";System.out.println(s1==s4);//true28、設(shè)計(jì)4個(gè)線(xiàn)程,其中兩個(gè)線(xiàn)程每次對(duì)j增加1,另外兩個(gè)線(xiàn)程對(duì)j每次減少1。寫(xiě)出程序。以下程序使用內(nèi)部類(lèi)實(shí)現(xiàn)線(xiàn)程,對(duì)j增減的時(shí)候沒(méi)有考慮順序問(wèn)題。publicclassThreadTest1{privateintj;publicstaticvoidmain(Stringargs[]){ThreadTest1tt=newThreadTest1();Incinc=tt.newInc();Decdec=tt.newDec();for(inti=0;i<2;i++){Threadt=newThread(inc);t.start();t=newThread(dec);t.start();}}privatesynchronizedvoidinc(){j++;System.out.println(Thread.currentThread().getName()+"-inc:"+j);}privatesynchronizedvoiddec(){j--;System.out.println(Thread.currentThread().getName()+"-dec:"+j);}classIncimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){inc();}}}classDecimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){dec();}}}}29、Java有沒(méi)有g(shù)oto?java中的保留字,現(xiàn)在沒(méi)有在java中使用。Java不提供goto語(yǔ)句,它雖然指定goto作為關(guān)鍵字,但不支持它的使用,使程序簡(jiǎn)潔易讀。在Java中g(shù)oto語(yǔ)句被完全拋棄了,與此同時(shí),Java又?jǐn)U大了break語(yǔ)句和continue語(yǔ)句的功能,通過(guò)使用break和continue,程序流程被允許在多層循環(huán)中跳轉(zhuǎn)。30、啟動(dòng)一個(gè)線(xiàn)程是用run()還是start()?啟動(dòng)一個(gè)線(xiàn)程是調(diào)用start()方法,使線(xiàn)程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線(xiàn)程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線(xiàn)程。通過(guò)start調(diào)用run方法啟用一個(gè)線(xiàn)程31、EJB包括(SessionBean,EntityBean)說(shuō)出他們的生命周期,及如何管理事務(wù)的?SessionBean:StatelessSessionBean的生命周期是由容器決定的,當(dāng)客戶(hù)機(jī)發(fā)出請(qǐng)求要建立一個(gè)Bean的實(shí)例時(shí),EJB容器不一定要?jiǎng)?chuàng)建一個(gè)新的Bean的實(shí)例供客戶(hù)機(jī)調(diào)用,而是隨便找一個(gè)現(xiàn)有的實(shí)例提供給客戶(hù)機(jī)。當(dāng)客戶(hù)機(jī)第一次調(diào)用一個(gè)StatefulSessionBean時(shí),容器必須立即在服務(wù)器中創(chuàng)建一個(gè)新的Bean實(shí)例,并關(guān)聯(lián)到客戶(hù)機(jī)上,以后此客戶(hù)機(jī)調(diào)用StatefulSessionBean的方法時(shí)容器會(huì)把調(diào)用分派到與此客戶(hù)機(jī)相關(guān)聯(lián)的Bean實(shí)例。EntityBean:EntityBeans能存活相對(duì)較長(zhǎng)的時(shí)間,并且狀態(tài)是持續(xù)的。只要數(shù)據(jù)庫(kù)中的數(shù)據(jù)存在,Entitybeans就一直存活。而不是按照應(yīng)用程序或者服務(wù)進(jìn)程來(lái)說(shuō)的。即使EJB容器崩潰了,Entitybeans也是存活的。EntityBeans生命周期能夠被容器或者Beans自己管理。EJB通過(guò)以下技術(shù)管理實(shí)務(wù):對(duì)象管理組織(OMG)的對(duì)象實(shí)務(wù)服務(wù)(OTS),SunMicrosystems的TransactionService(JTS)、JavaTransactionAPI(JTA),開(kāi)發(fā)組(X/Open)的XA接口。32、應(yīng)用服務(wù)器有那些?BEAWebLogicServer,IBMWebSphereApplicationServer,Oracle9iApplicationServer,jBoss,Tomcat33、給我一個(gè)你最常見(jiàn)到的runtimeexception。ArithmeticException,ArrayStoreException,BufferOverflowException,BufferUnderflowException,CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcurrentModificationException,DOMException,EmptyStackException,IllegalArgumentException,IllegalMonitorStateException,IllegalPathStateException,IllegalStateException,ImagingOpException,IndexOutOfBoundsException,MissingResourceException,NegativeArraySizeException,NoSuchElementException,NullPointerException,ProfileDataException,ProviderException,RasterFormatException,SecurityException,SystemException,UndeclaredThrowableException,UnmodifiableSetException,UnsupportedOperationException34、接口是否可繼承接口?抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口?抽象類(lèi)是否可繼承實(shí)體類(lèi)(concreteclass)?接口可以繼承接口。抽象類(lèi)可以實(shí)現(xiàn)(implements)接口,抽象類(lèi)是否可繼承實(shí)體類(lèi),但前提是實(shí)體類(lèi)必須有明確的構(gòu)造函數(shù)。只要有抽象方法就是抽象類(lèi),所以抽象類(lèi)可以實(shí)現(xiàn)接口的方法而有其他抽象方法35、List,Set,Map是否繼承自Collection接口?List,Set是,Map不是Collection是任何對(duì)象組,元素各自獨(dú)立,通常擁有相同的套用規(guī)則。SetList由它派生。/art/200909/149543.htm介紹集合類(lèi)(collections)一、Collection和Collections的區(qū)別。Collections是個(gè)java.util下的類(lèi),它包含有各種有關(guān)java集合操作的靜態(tài)方法。

Collection是個(gè)java.util下的接口,它是各種java集合結(jié)構(gòu)的父接口二、set無(wú)重復(fù)、無(wú)序HashSet-基于散列表的集,加進(jìn)散列表的元素要實(shí)現(xiàn)hashCode()方法以判斷是否為同一個(gè)對(duì)象,無(wú)順序、無(wú)重復(fù)。三、List有重復(fù)、有序ArrayList(數(shù)組表)-有重復(fù)、有順序。類(lèi)似于Vector,都用于縮放數(shù)組維護(hù)集合。四、Map用于關(guān)鍵字/數(shù)值對(duì),較高的存取性能。不允許重復(fù)的key,但允許重復(fù)的Value。36、說(shuō)出數(shù)據(jù)連接池的工作機(jī)制是什么?J2EE服務(wù)器啟動(dòng)時(shí)會(huì)建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻?hù)端程序需要連接時(shí),池驅(qū)動(dòng)程序會(huì)返回一個(gè)未使用的池連接并將其表記為忙。如果當(dāng)前沒(méi)有空閑連接,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連接的數(shù)量由配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動(dòng)程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個(gè)連接。數(shù)據(jù)連接池源理與實(shí)現(xiàn)/blog/616100在Java語(yǔ)言中,JDBC(JavaDataBaseConnection)是應(yīng)用程序與數(shù)據(jù)庫(kù)溝通的橋梁,

一般來(lái)說(shuō),Java應(yīng)用程序訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的過(guò)程是:

①裝載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序;

②通過(guò)JDBC建立數(shù)據(jù)庫(kù)連接;

③訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),執(zhí)行SQL語(yǔ)句;

④斷開(kāi)數(shù)據(jù)庫(kù)連接。

37、abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?都不能abstract需要重載,static為類(lèi)方法,沒(méi)有重載一說(shuō)

abstract為沒(méi)有實(shí)現(xiàn)的方法,native為本機(jī)實(shí)現(xiàn)的方法,自相矛盾

(native是方法修飾符。Native方法是由另外一種語(yǔ)言(如c/c++,F(xiàn)ORTRAN,匯編)實(shí)現(xiàn)的本地方法。因?yàn)樵谕獠繉?shí)現(xiàn)了方法,所以在java代碼中,就不需要聲明了,有點(diǎn)類(lèi)似于借口方法。Native可以和其他一些修飾符連用,但是abstract方法和Interface方法不能用native來(lái)修飾。)

abstract方法沒(méi)有實(shí)現(xiàn),也不可能實(shí)際調(diào)用抽象方法,沒(méi)有必要synchronized修飾,當(dāng)然子類(lèi)可以根據(jù)需要同步該方法.Java本地接口(JavaNativeInterface(JNI))允許運(yùn)行在Java虛擬機(jī)(JavaVirtualMachine(JVM))上的代碼調(diào)用本地程序和類(lèi)庫(kù),或者被它們調(diào)用,這些程序和類(lèi)庫(kù)可以是其它語(yǔ)言編寫(xiě)的,比如C、C++或者匯編語(yǔ)言。當(dāng)一個(gè)程序無(wú)法完全使用Java編寫(xiě)時(shí),開(kāi)發(fā)者可以通過(guò)JNI來(lái)編寫(xiě)本地方法,比如標(biāo)準(zhǔn)Java類(lèi)庫(kù)并不支持的依賴(lài)于平臺(tái)的特色或者程序庫(kù)。JNI還可以用于修改現(xiàn)有的使用其它語(yǔ)言編寫(xiě)的程序,使它們可以通過(guò)Java編寫(xiě)的程序來(lái)訪(fǎng)問(wèn)。38、數(shù)組有沒(méi)有l(wèi)ength()這個(gè)方法?String有沒(méi)有l(wèi)ength()這個(gè)方法?數(shù)組沒(méi)有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個(gè)方法。39、Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢?是用==還是equals()?它們有何區(qū)別?Set里的元素是不能重復(fù)的,那么用iterator()方法來(lái)區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等。equals()和==方法決定引用值是否指向同一對(duì)象。equals()在類(lèi)中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類(lèi)型相配的話(huà),返回真值。40、構(gòu)造器Constructor是否可被override?構(gòu)造器Constructor不能被繼承,因此不能重寫(xiě)Overriding,但可以被重載Overloading。41、是否可以繼承String類(lèi)?String類(lèi)是final類(lèi)故不可以繼承。關(guān)于FINAL

1,被定義成FINAL的類(lèi)不能派生子類(lèi)

2,被定義成FINAL的方法不能夠被重寫(xiě)//注意!是重寫(xiě),不是重載

3,被聲明為FINAL的成員變量一經(jīng)賦值就不能改變.42、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?switch(expr1)中,expr1是一個(gè)整數(shù)表達(dá)式。因此傳遞給switch和case語(yǔ)句的參數(shù)應(yīng)該是int、short、char或者byte。

long,string都不能作用于swtich。43、try{}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally{}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?會(huì)執(zhí)行,在return前執(zhí)行。44、編程題:用最有效率的方法算出2乘以8等於幾?2<<3(有C背景的程序員特別喜歡問(wèn)這種問(wèn)題)之所以問(wèn)這樣問(wèn)題的人,他們只是基于這樣一個(gè)事實(shí),整數(shù)乘法或整數(shù)除法所需要的時(shí)鐘周期遠(yuǎn)遠(yuǎn)大于移位操作所需的時(shí)鐘周期,下面列出這個(gè)指令的基本執(zhí)行時(shí)間:移位指令

寄存器移1位

時(shí)鐘周期數(shù)為2

整數(shù)乘法IMUL

16位寄存器乘

時(shí)鐘周期為128~154

整數(shù)除法IDIV

16位寄存器

時(shí)鐘周期為165~184

而即使Java編譯器在編譯intj=i*8;時(shí)用的是

imul,但真正執(zhí)行這這段代碼,由虛擬機(jī)JVM轉(zhuǎn)換成本地代碼是時(shí)候會(huì)不會(huì)進(jìn)一步優(yōu)化成用移位操作的匯編指也未得而知,必要時(shí)當(dāng)然可追蹤一下java.exe的執(zhí)行過(guò)程,即使執(zhí)行時(shí)會(huì)作此優(yōu)化,在java中把intj=i*8寫(xiě)成intj=i<<3,可獲取一點(diǎn)點(diǎn)的效率,微不足道。/kypfos/archive/2006/06/18/810151.aspx45、兩個(gè)對(duì)象值相同(x.equals(y)==true),但卻可有不同的hashcode,這句話(huà)對(duì)不對(duì)?不對(duì),有相同的hashcode。這要求我們覆寫(xiě)equals同時(shí)必須overridden

hashCode方法;hashCode的默認(rèn)約定中有一條:

如果兩個(gè)對(duì)象根據(jù)equals(o)是相等的,則調(diào)用這個(gè)兩個(gè)對(duì)象中人一個(gè)對(duì)象的hashCode方法必產(chǎn)生同樣的整數(shù)結(jié)果

。因此一般推薦對(duì)象擴(kuò)展equals時(shí)都要擴(kuò)展hashCode在

Hashtable

中是這樣使用

equals()

hashCode()

的:get

put

時(shí),首先使用

hashCode()

進(jìn)行在

keys

中定位和查找,這樣會(huì)提高查找效率。如果現(xiàn)有多個(gè)

key

hashCode

相同,再用

equals

在具有相同

hashCode

的這幾個(gè)

key

中進(jìn)行依次查找。

也就是說(shuō),java

中的設(shè)計(jì)思想是:允許不同對(duì)象有相同的

hashCode(),但是

equal

的對(duì)象的

hashCode

肯定是相同的。equals()

java

中被認(rèn)為:對(duì)象之間

"一模一樣"。46、當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?是值傳遞。Java編程語(yǔ)言只有值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。/view/3904121614791711cc791713.html“在java中參數(shù)傳遞都是按值傳遞的”這句話(huà)的意思是:按值傳遞是傳遞的值的拷貝,按引用傳遞其實(shí)傳遞的是引用的地址值,所以統(tǒng)稱(chēng)為按值傳遞。在java中只有基本類(lèi)型和按照下面這種定義方式的String是按值傳遞,其他的都是按引用傳遞。就是直接使用雙引號(hào)字符串方式:Stringstr=”Java私塾”;那么能不能讓按照引用傳遞的值相互間不影響?辦法是在方法里面新new一個(gè)實(shí)例就可以了。47、當(dāng)一個(gè)線(xiàn)程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線(xiàn)程是否可進(jìn)入此對(duì)象的其它方法?不能,一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線(xiàn)程訪(fǎng)問(wèn)。/view/1207212.htmsynchronized

關(guān)鍵字,代表這個(gè)方法加鎖,相當(dāng)于不管哪一個(gè)線(xiàn)程A每次運(yùn)行到這個(gè)方法時(shí),都要檢查有沒(méi)有其它正在用這個(gè)方法的線(xiàn)程B(或者CD等),有的話(huà)要等正在使用這個(gè)方法的線(xiàn)程B(或者CD)運(yùn)行完這個(gè)方法后再運(yùn)行此線(xiàn)程A,沒(méi)有的話(huà),直接運(yùn)行它包括兩種用法:synchronized方法和synchronized塊。48、編程題:寫(xiě)一個(gè)Singleton出來(lái)。Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類(lèi)Class只有一個(gè)實(shí)例存在。/blog/static/62223494201081310439564/

Singleton模式的實(shí)現(xiàn)基于兩個(gè)要點(diǎn):

1)不直接用類(lèi)的構(gòu)造函數(shù),而另外提供一個(gè)Public的靜態(tài)方法來(lái)構(gòu)造類(lèi)的實(shí)例。通常這個(gè)方法取名為Instance。Public保證了它的全局可見(jiàn)性,靜

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論