EJB方面
94、EJB2.0有哪些內容?分別用在什么場合? EJB2.0和EJB1.1的區別?
答:規范內容包括Bean提供者,應用程序裝配者,EJB容器,EJB配置工具,EJB服務提供者,系統管理員。這里面,EJB容器是EJB之所以能夠運行的核心。EJB容器管理著EJB的創建,撤消,激活,去活,與數據庫的連接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....
95、EJB與JAVA BEAN的區別?
答:Java Bean 是可復用的組件,對Java Bean并沒有嚴格的規范,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java Bean是被容器所創建(如Tomcat)的,所以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實現Serializable接口用于實現Bean的持久性。Java Bean實際上相當于微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創建和管理。客戶通過容器來訪問真正的EJB組件。
96、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?的優勢卻在于他可以維持使用者的狀態。
97、EJB與JAVA?BEAN的區別?
答:Java?Bean?是可復用的組件,對Java?Bean并沒有嚴格的規范,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java?Bean是被容器所創建(如Tomcat)的,所以Java?Bean應具有一個無參的構造器,另外,通常Java?Bean還要實現Serializable接口用于實現Bean的持久性。Java?Bean實際上相當于微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise?Java?Bean?相當于DCOM,即分布式組件。它是基于Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創建和管理。客戶通過容器來訪問真正的EJB組件。
EJB包括(SessionBean,EntityBean)說出他們的生命周期,及如何管理事務的?
SessionBean:Stateless?Session?Bean?的生命周期是由容器決定的,當客戶機發出請求要建立一個Bean的實例時,EJB容器不一定要創建一個新的Bean的實例供客戶機調用,而是隨便找一個現有的實例提供給客戶機。當客戶機第一次調用一個Stateful?Session?Bean?時,容器必須立即在服務器中創建一個新的Bean實例,并關聯到客戶機上,以后此客戶機調用Stateful?Session?Bean?的方法時容器會把調用分派到與此客戶機相關聯的Bean實例。
EntityBean:Entity?Beans能存活相對較長的時間,并且狀態是持續的。只要數據庫中的數據存在,Entity?beans就一直存活。而不是按照應用程序或者服務進程來說的。即使EJB容器崩潰了,Entity?beans也是存活的。Entity?Beans生命周期能夠被容器或者?Beans自己管理。
EJB通過以下技術管理實務:對象管理組織(OMG)的對象實務服務(OTS),Sun?Microsystems的Transaction?Service(JTS)、Java?Transaction?API(JTA),開發組(X/Open)的XA接口。
98、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類
99、EJB容器提供的服務
答:主要提供聲明周期管理、代碼產生、持續性管理、安全、事務管理、鎖和并發行管理等服務。
100、EJB規范規定EJB中禁止的操作有哪些??
?答:1.不能操作線程和線程API(線程API指非線程對象的方法如notify,wait等),2.不能操作awt,3.不能實現服務器功能,4.不能對靜態屬生存取,5.不能使用IO操作直接存取文件系統,6.不能加載本地庫.,7.不能將this作為變量和返回,8.不能循環調用。
101、remote接口和home接口主要作用
答:remote接口定義了業務方法,用于EJB客戶端調用業務方法。
home接口是EJB工廠用于創建和移除查找EJB實例
102、bean?實例的生命周期
答:對于Stateless?Session?Bean、Entity?Bean、Message?Driven?Bean一般存在緩沖池管理,而對于Entity?Bean和Statefull?Session?Bean存在Cache管理,通常包含創建實例,設置上下文、創建EJB?Object(create)、業務方法調用、remove等過程,對于存在緩沖池管理的Bean,在create之后實例并不從內存清除,而是采用緩沖池調度機制不斷重用實例,而對于存在Cache管理的Bean則通過激活和去激活機制保持Bean的狀態并限制內存中實例數量。
103、EJB的激活機制
答:以Stateful?Session?Bean?為例:其Cache大小決定了內存中可以同時存在的Bean實例的數量,根據MRU或NRU算法,實例在激活和去激活狀態之間遷移,激活機制是當客戶端調用某個EJB實例業務方法時,如果對應EJB?Object發現自己沒有綁定對應的Bean實例則從其去激活Bean存儲中(通過序列化機制存儲實例)回復(激活)此實例。狀態變遷前會調用對應的ejbActive和ejbPassivate方法。
104、EJB的幾種類型
答:會話(Session)Bean?,實體(Entity)Bean?消息驅動的(Message?Driven)Bean
會話Bean又可分為有狀態(Stateful)和無狀態(Stateless)兩種
實體Bean可分為Bean管理的持續性(BMP)和容器管理的持續性(CMP)兩種
105、客服端調用EJB對象的幾個基本步驟
答:設置JNDI服務工廠以及JNDI服務地址系統屬性,查找Home接口,從Home接口調用Create方法創建Remote接口,通過Remote接口調用其業務方法。
應用服務器方面
106、如何給weblogic指定大小的內存??
答:在啟動Weblogic的腳本中(位于所在Domian對應服務器目錄下的startServerName),增加set?MEM_ARGS=-Xms32m?-Xmx200m,可以調整最小內存為32M,最大200M
EJB需直接實現它的業務接口或Home接口嗎,請簡述理由。
遠程接口和Home接口不需要直接實現,他們的實現代碼是由服務器產生的,程序運行中對應實現類會作為對應接口類型的實例被使用。
107、應用服務器有那些?
答:BEA?WebLogic?Server,IBM?WebSphere?Application?Server,Oracle9i?Application?Server,jBoss,Tomcat
108、如何設定的weblogic的熱啟動模式(開發模式)與產品發布模式?
答:可以在管理控制臺中修改對應服務器的啟動模式為開發或產品模式之一。或者修改服務的啟動文件或者commenv文件,增加set?PRODUCTION_MODE=true。
109、如何啟動時不需輸入用戶名與密碼?
答:修改服務啟動文件,增加?WLS_USER和WLS_PW項。也可以在boot.properties文件中增加加密過的用戶名和密碼.
110、在weblogic管理制臺中對一個應用域(或者說是一個網站,Domain)進行jms及ejb或連接池等相關信息進行配置后,實際保存在什么文件中?
答:保存在此Domain的config.xml文件中,它是服務器的核心配置文件。
111、說說weblogic中一個Domain的缺省目錄結構?比如要將一個簡單的helloWorld.jsp放入何目錄下,然的在瀏覽器上就可打入
答:Domain目錄服務器目錄applications,將應用目錄放在此目錄下將可以作為應用訪問,如果是Web應用,應用目錄需要滿足Web應用目錄要求,jsp文件可以直接放在應用目錄中,Javabean需要放在應用目錄的WEB-INF目錄的classes目錄中,設置服務器的缺省應用將可以實現在瀏覽器上無需輸入應用名。
112、在weblogic中發布ejb需涉及到哪些配置文件
答:不同類型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP實體Bean一般還需要weblogic-cmp-rdbms-jar.xml?
86、如何在weblogic中進行ssl配置與客戶端的認證配置或說說j2ee(標準)進行ssl的配置
缺省安裝中使用DemoIdentity.jks和DemoTrust.jks??KeyStore實現SSL,需要配置服務器使用Enable?SSL,配置其端口,在產品模式下需要從CA獲取私有密鑰和數字證書,創建identity和trust?keystore,裝載獲得的密鑰和數字證書。可以配置此SSL連接是單向還是雙向的。
113、如何查看在weblogic中已經發布的EJB?
答:可以使用管理控制臺,在它的Deployment中可以查看所有已發布的EJB
說說在weblogic中開發消息Bean時的persistent與non-persisten的差別
persistent方式的MDB可以保證消息傳遞的可靠性,也就是如果EJB容器出現問題而JMS服務器依然會將消息在此MDB可用的時候發送過來,而non-persistent方式的消息將被丟棄。
J2EE,MVC方面
114、MVC的各個部分都有那些技術來實現?如何實現?
答:MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現),"View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
115、J2EE是什么?
答:Je22是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。
116、WEB SERVICE名詞解釋。JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。
答:Web Service描述語言WSDL
SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用于交換XML編碼信息的輕量級協議。
UDDI 的目的是為電子商務建立標準;UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊中心的實現標準規范,同時也包含一組使企業能將自身提供的Web Service注冊,以使別的企業能夠發現的訪問協議的實現標準。
117、J2EE是技術還是平臺還是框架?
答:J2EE本身是一個標準,一個為企業分布式應用的開發提供的標準平臺。
?J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。
118、STRUTS的應用(如STRUTS架構)
答:Struts是采用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。采用Struts能開發出基于MVC(Model-View-Controller)設計模式的應用構架。Struts有如下的主要功能:
一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。
二.JSP自由tag庫,并且在controller servlet中提供關聯支持,幫助開發員創建交互式表單應用。
三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。
119、WEB?SERVICE名詞解釋。JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。?
答:Web?ServiceWeb?Service是基于網絡的、分布式的模塊化組件,它執行特定的任務,遵守具體的技術規范,這些規范使得Web?Service能與其他兼容的組件進行互操作。
JAXP(Java?API?for?XML?Parsing)?定義了在Java中使用DOM,?SAX,?XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當你需要改變具體的實現時候也不需要修改代碼。
JAXM(Java?API?for?XML?Messaging)?是為SOAP通信提供訪問方法和傳輸機制的API。
WSDL是一種?XML?格式,用于將網絡服務描述為一組端點,這些端點對包含面向文檔信息或面向過程信息的消息進行操作。這種格式首先對操作和消息進行抽象描述,然后將其綁定到具體的網絡協議和消息格式上以定義端點。相關的具體端點即組合成為抽象端點(服務)。
SOAP即簡單對象訪問協議(Simple?Object?Access?Protocol),它是用于交換XML編碼信息的輕量級協議。?
UDDI?的目的是為電子商務建立標準;UDDI是一套基于Web的、分布式的、為Web?Service提供的、信息注冊中心的實現標準規范,同時也包含一組使企業能將自身提供的Web?Service注冊,以使別的企業能夠發現的訪問協議的實現標準。
120、C/S?與?B/S?區別:
答:有如下八個方面的不同:
1.硬件環境不同:?
C/S?一般建立在專用的網絡上,?小范圍里的網絡環境,?局域網之間再通過專門服務器提供連接和數據交換服務.
B/S?建立在廣域網之上的,?不必是專門的網絡硬件環境,例與電話上網,?租用設備.?信息自己管理.?有比C/S更強的適應范圍,?一般只要有操作系統和瀏覽器就行?
2.對安全要求不同?
C/S?一般面向相對固定的用戶群,?對信息安全的控制能力很強.?一般高度機密的信息系統采用C/S?結構適宜.?可以通過B/S發布部分可公開信息.
B/S?建立在廣域網之上,?對安全的控制能力相對弱,?可能面向不可知的用戶。
3.對程序架構不同?
C/S?程序可以更加注重流程,?可以對權限多層次校驗,?對系統運行速度可以較少考慮.
B/S?對安全以及訪問速度的多重的考慮,?建立在需要更加優化的基礎之上.?比C/S有更高的要求?B/S結構的程序架構是發展的趨勢,?從MS的.Net系列的BizTalk?2000?Exchange?2000等,?全面支持網絡的構件搭建的系統.?SUN?和IBM推的JavaBean?構件技術等,使?B/S更加成熟.?
4.軟件重用不同?
C/S?程序可以不可避免的整體性考慮,?構件的重用性不如在B/S要求下的構件的重用性好.
B/S?對的多重結構,要求構件相對獨立的功能.?能夠相對較好的重用.就入買來的餐桌可以再利用,而不是做在墻上的石頭桌子?
5.系統維護不同??
C/S?程序由于整體性,?必須整體考察,?處理出現的問題以及系統升級.?升級難.?可能是再做一個全新的系統
B/S?構件組成,方面構件個別的更換,實現系統的無縫升級.?系統維護開銷減到最小.用戶從網上自己下載安裝就可以實現升級.?
6.處理問題不同?
C/S?程序可以處理用戶面固定,?并且在相同區域,?安全要求高需求,?與操作系統相關.?應該都是相同的系統
B/S?建立在廣域網上,?面向不同的用戶群,?分散地域,?這是C/S無法作到的.?與操作系統平臺關系最小.?
7.用戶接口不同?
C/S?多是建立的Window平臺上,表現方法有限,對程序員普遍要求較高
B/S?建立在瀏覽器上,?有更加豐富和生動的表現方式與用戶交流.?并且大部分難度減低,減低開發成本.?
8.信息流不同?
C/S?程序一般是典型的中央集權的機械式處理,?交互性相對低
B/S?信息流向可變化,?B-B?B-C?B-G等信息、流向的變化,?更像交易中心。
121、什么是web容器
答:給處于其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接**互,不必關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵守J2EE規范中的WEB?APPLICATION?標準。我們把遵守以上標準的WEB服務器就叫做J2EE中的WEB容器。122、什么是EJB容器
答:Enterprise?java?bean?容器。更具有行業領域特色。他提供給運行在其中的組件EJB各種管理功能。只要滿足J2EE規范的EJB放入該容器,馬上就會被容器進行高效率的管理。并且可以通過現成的接口來獲得系統級別的服務。例如郵件服務、事務管理
123、什么是JNDI
答:(Java?Naming?&?Directory?Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下自己的索引,從而滿足快速查找和定位分布式應用程序的功能。
124、什么是JMS
答:(Java?Message?Service)JAVA消息服務。主要實現各個應用程序之間的通訊。包括點對點和廣播。
125、什么是JTA
答:(Java?Transaction?API)JAVA事務服務。提供各種分布式事務服務。應用程序只需調用其提供的接口即可。
126、什么是JAF
答:(Java?Action?FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者通過各種部署和自定義實現自己的個性安全控制策略。
RMI/IIOP:(Remote?Method?Invocation?/internet對象請求中介協議)他們主要用于通過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,我們可以在本地計算機上實現對其直接調用。當然這是要通過一定的規范才能在異構的系統之間進行通信。RMI是JAVA特有的。
127、MVC的各個部分都有那些技術來實現?如何實現??
答:MVC是Model-View-Controller的簡寫。"Model"?代表的是應用的業務邏輯(通過JavaBean,EJB組件實現),?"View"?是應用的表示面(由JSP頁面產生),"Controller"?是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
設計模式方面
128、開發中都用到了那些設計模式?用在什么場合?
答:每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重復相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。
129、說說你所熟悉或聽說過的j2ee中的幾種常用模式?及對設計模式的一些看法
答:Session?Facade?Pattern:使用SessionBean訪問EntityBean
Message?Facade?Pattern:實現異步調用
EJB?Command?Pattern:使用Command?JavaBeans取代SessionBean,實現輕量級訪問
Data?Transfer?Object?Factory:通過DTO?Factory簡化EntityBean數據提供特性
Generic?Attribute?Access:通過AttibuteAccess接口簡化EntityBean數據提供特性
Business?Interface:通過遠程(本地)接口和Bean類實現相同接口規范業務邏輯一致性
EJB架構的設計好壞將直接影響系統的性能、可擴展性、可維護性、組件可重用性及開發效率。項目越復雜,項目隊伍越龐大則越能體現良好設計的重要性。
130、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(責任鏈模式)
工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。
131、UML方面
答:標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行為圖,交互圖(順序圖,合作圖),實現圖,
UML方面?
CORBA方面
132、CORBA是什么?用途是什么?
答:CORBA 標準是公共對象請求代理結構(Common Object Request Broker Architecture),由對象管理組織(Object Management Group,縮寫為OMG)標準化。它的組成是接口定義語言(IDL), 語言綁定(binding:也譯為聯編)和允許應用程序間互操作的協議。其目的為:
用不同的程序設計語言書寫
在不同的進程中運行
為不同的操作系統開發
LINUX方面
133、LINUX下線程,GDI類的解釋。
答:LINUX實現的就是基于核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的管理在核外函數庫中實現。
GDI類為圖像設備編程接口類庫。
134、LINUX下線程,GDI類的解釋。
LINUX實現的就是基于核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的管理在核外函數庫中實現。?
GDI類為圖像設備編程接口類庫。
代碼與編程題
135、寫一個Singleton出來
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式:?定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public?class?Singleton?{
private?Singleton(){}
????//在自己內部定義自己一個實例,是不是很奇怪?
????//注意這是private?只供內部調用
????private?static?Singleton?instance?=?new?Singleton();
????//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
????public?static?Singleton?getInstance()?{
????return?instance;?
????}?
????}?
????第二種形式:?
public?class?Singleton?{?
private?static?Singleton?instance?=?null;
public?static?synchronized?Singleton?getInstance()?{
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 ?
//使用時生成實例,提高了效率!
if?(instance==null)
instance=new?Singleton();
return?instance;? }?
}?
其他形式:
定義一個類,它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些?
136、繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什么?
答:父類:
package test;
public class? FatherClass
{
??? public FatherClass()
?{
??System.out.println("FatherClass Create");
?}
}
子類:
package test;
import test.FatherClass;
public class? ChildClass extends FatherClass
{
?public ChildClass()
?{
??System.out.println("ChildClass Create");
?}
?public static void main(String[] args)
?{
??FatherClass fc = new FatherClass();
??ChildClass cc = new ChildClass();
?}
}
輸出結果:
C:\>java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create
137、內部類的實現方式?
答:示例代碼如下:
package test;
public class? OuterClass
{
?private class InterClass
?{
??public InterClass()
??{
???System.out.println("InterClass Create");
??}
?}
?public OuterClass()
?{
??InterClass ic = new InterClass();
??System.out.println("OuterClass Create");
?}
?public static void main(String[] args)
?{
??OuterClass oc = new OuterClass();
?}
}
輸出結果:
C:\>java test/OuterClass
InterClass Create
OuterClass Create
再一個例題:
public class OuterClass {
? private double d1 = 1.0;
??? //insert code here
}
You need to insert an inner class declaration at line 3. Which two inner class declarations are
valid?(Choose two.)
A. class InnerOne{
???? public static double methoda() {return d1;}
?? }
B. public class InnerOne{
???? static double methoda() {return d1;}
?? }
C. private class InnerOne{
???? double methoda() {return d1;}
?? }
D. static class InnerOne{
???? protected double methoda() {return d1;}
?? }
E. abstract class InnerOne{
???? public abstract double methoda();
?? }
說明如下:
一.靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。故A、B 錯
二.靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;return d1 出錯。
故D 錯
三.非靜態內部類的非靜態成員可以訪問外部類的非靜態變量。故C 正確
四.答案為C、E
138、Java 的通信編程,編程題(或問答),用JAVA SOCKET編程,讀服務器幾個字符,再寫入本地顯示?
答:Server端程序:
package test;
import java.net.*;
import java.io.*;
public class Server
{
?private ServerSocket ss;
?private Socket socket;
?private BufferedReader in;
?private PrintWriter out;
?public Server()
?{
??try
??{
???ss=new ServerSocket(10000);
???while(true)
???{
????socket = ss.accept();
????String RemoteIP = socket.getInetAddress().getHostAddress();
????String RemotePort = ":"+socket.getLocalPort();
????System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
????in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
????String line = in.readLine();
????System.out.println("Cleint send is :" + line);
????out = new PrintWriter(socket.getOutputStream(),true);
????out.println("Your Message Received!");
????out.close();
????in.close();
????socket.close();
???}
??}catch (IOException e)
??{
???out.println("wrong");
??}
?}
?public static void main(String[] args)
?{
??new Server();
?}
};
Client端程序:
package test;
import java.io.*;
import java.net.*;
public class Client
{
?Socket socket;
?BufferedReader in;
?PrintWriter out;
?public Client()
?{
??try
??{
???System.out.println("Try to Connect to 127.0.0.1:10000");
???socket = new Socket("127.0.0.1",10000);
???System.out.println("The Server Connected!");
???System.out.println("Please enter some Character:");
???BufferedReader line = new BufferedReader(new
InputStreamReader(System.in));
???out = new PrintWriter(socket.getOutputStream(),true);
???out.println(line.readLine());
???in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
???System.out.println(in.readLine());
???out.close();
???in.close();
???socket.close();
??}catch(IOException e)
??{
???out.println("Wrong");
??}
?}
?public static void main(String[] args)
?{
??new Client();
?}
};
139、用JAVA實現一種排序,JAVA類實現序列化的方法(二種)?如在COLLECTION框架中,實現比較要實現什么樣的接口?
答:用插入法進行排序代碼如下
package test;
import java.util.*;
class? InsertSort
{
?ArrayList al;
?public InsertSort(int num,int mod)
?{
??al = new ArrayList(num);
??Random rand = new Random();
??System.out.println("The ArrayList Sort Before:");
??for (int i=0;i<num ;i++ )
??{
???al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
???System.out.println("al["+i+"]="+al.get(i));
??}
?}
?public void SortIt()
?{
??Integer tempInt;
??int MaxSize=1;
??for(int i=1;i<al.size();i++)
??{
?????? tempInt = (Integer)al.remove(i);
????if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())
????{
?????al.add(MaxSize,tempInt);
?????MaxSize++;
?????System.out.println(al.toString());
????} else {
?????for (int j=0;j<MaxSize ;j++ )
?????{
??????if
(((Integer)al.get(j)).intValue()>=tempInt.intValue())
??????{
???????al.add(j,tempInt);
???????MaxSize++;
???????System.out.println(al.toString());
???????break;
??????}
?????}
????}
??}
??System.out.println("The ArrayList Sort After:");
??for(int i=0;i<al.size();i++)
??{
???System.out.println("al["+i+"]="+al.get(i));
??}
?}
?public static void main(String[] args)
?{
??InsertSort is = new InsertSort(10,100);
??is.SortIt();
?}
}
140、編程:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。
答:代碼如下:
package test;
class? SplitString
{
?String SplitStr;
?int SplitByte;
?public SplitString(String str,int bytes)
?{
??SplitStr=str;
??SplitByte=bytes;
??System.out.println("The String is:'"+SplitStr+"';SplitBytes="+SplitByte);
?}
?public void SplitIt()
?{
??int loopCount;
??
loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/
Byte+1);
??System.out.println("Will Split into "+loopCount);
??for (int i=1;i<=loopCount ;i++ )
??{
???if (i==loopCount){
????
System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
???} else {
????
System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
???}
??}
?}
?public static void main(String[] args)
?{
??SplitString ss = new SplitString("test中dd文dsaf中男大3443n中國43中國人
0ewldfls=103",4);
??ss.SplitIt();
?}
}
141、JAVA多線程編程。用JAVA寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出。
希望大家補上,謝謝
142、可能會讓你寫一段Jdbc連Oracle的程序,并實現數據查詢.
答:程序如下:
package hello.ant;
import java.sql.*;
public class? jdbc
{
?String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
?String theUser="admin";
?String thePw="manager";
?Connection c=null;
?Statement conn;
?ResultSet rs=null;
?public jdbc()
?{
??try{
??? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
????????? c = DriverManager.getConnection(dbUrl,theUser,thePw);
??? conn=c.createStatement();
??}catch(Exception e){
???e.printStackTrace();
??}
?}
?public boolean executeUpdate(String sql)
?{
???try
???{
?????conn.executeUpdate(sql);
?????return true;
???}
???catch (SQLException e)
???{
?????e.printStackTrace();
?????return false;
???}
?}
?public ResultSet executeQuery(String sql)
?{
???rs=null;
???try
???{
?????rs=conn.executeQuery(sql);
???}
???catch (SQLException e)
???{
?????e.printStackTrace();
???}
???return rs;
?}
?public void close()
?{
???try
???{
?????conn.close();
?????c.close();
???}
???catch (Exception e)
???{
?????e.printStackTrace();
???}
?}
?public static void main(String[] args)
?{
??ResultSet rs;
??jdbc conn = new jdbc();
??rs=conn.executeQuery("select * from test");
??try{
??while (rs.next())
??{
???System.out.println(rs.getString("id"));
???System.out.println(rs.getString("name"));
??}
??}catch(Exception e)
??{
???e.printStackTrace();
??}
?}
}
143、ORACLE大數據量下的分頁解決方法。一般用截取ID方法,還有是三層嵌套方法。
答:一種分頁方法
<%
? int i=1;
? int numPages=14;
? String pages = request.getParameter("page") ;
? int currentPage = 1;
? currentPage=(pages==null)?(1):{Integer.parseInt(pages)}
? sql = "select count(*) from tables";
? ResultSet rs = DBLink.executeQuery(sql) ;
? while(rs.next()) i = rs.getInt(1) ;
? int intPageCount=1;
? intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
? int nextPage ;
? int upPage;
? nextPage = currentPage+1;
? if (nextPage>=intPageCount) nextPage=intPageCount;
? upPage = currentPage-1;
? if (upPage<=1) upPage=1;
? rs.close();
? sql="select * from tables";
? rs=DBLink.executeQuery(sql);
? i=0;
? while((i<numPages*(currentPage-1))&&rs.next()){i++;}
%>
//輸出內容
//輸出翻頁連接
合計:<%=currentPage%>/<%=intPageCount%><a href="List.jsp?page=1">第一頁</a><a
href="List.jsp?page=<%=upPage%>">上一頁</a>
<%
? for(int j=1;j<=intPageCount;j++){
? if(currentPage!=j){
%>
? <a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
<%
? }else{
? out.println(j);
? }
? }
%>
<a href="List.jsp?page=<%=nextPage%>">下一頁</a><a href="List.jsp?page=<%=intPageCount%>">最后頁
</a>
144、用jdom解析xml文件時如何解決中文問題?如何解析?
答:看如下代碼,用編碼方式加以解決
package test;
import java.io.*;
public class DOMTest
{
?private String inFile = "c:\\people.xml";
?private String outFile = "c:\\people.xml";?
?public static void main(String args[])
?{
??? ?new DOMTest();
??? }
?public DOMTest()
?{
??try
???? {?
???? ?javax.xml.parsers.DocumentBuilder builder =
???? ??
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
???? ?org.w3c.dom.Document doc = builder.newDocument();
???? ?org.w3c.dom.Element root = doc.createElement("老師");
???? ?org.w3c.dom.Element wang = doc.createElement("王");
???org.w3c.dom.Element liu = doc.createElement("劉");
???? ?wang.appendChild(doc.createTextNode("我是王老師"));
???? ?root.appendChild(wang);
???? ?doc.appendChild(root);
???? ?javax.xml.transform.Transformer transformer =
???? ??javax.xml.transform.TransformerFactory.newInstance().newTransformer();
???? ?transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
???? ?transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");??
? ?
???? ?transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
???? ???????new
javax.xml.transform.stream.StreamResult(outFile));
???? }
???? catch (Exception e)
???? {
???? ?System.out.println (e.getMessage());
???? }
??? }
}
145、編程用JAVA解析XML的方式.
答:用SAX方式解析XML,XML文件如下:
<?xml version="1.0" encoding="gb2312"?>
<person>
? <name>王小明</name>
? <college>信息學院</college>??
? <telephone>6258113</telephone>
? <notes>男,1955年生,博士,95年調入海南大學</notes>
?</person>
?事件回調類SAXHandler.java
?import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
? {
? private Hashtable table = new Hashtable();
? private String currentElement = null;
? private String currentValue = null;
? public void setTable(Hashtable table)
??? {
??? this.table = table;
??? }
? public Hashtable getTable()
??? {
??? return table;
??? }
? public void startElement(String tag, AttributeList attrs)
? throws SAXException
??? {
??? currentElement = tag;
??? }
? public void characters(char[] ch, int start, int length)
? throws SAXException
??? {
??? currentValue = new String(ch, start, length);
??? }
? public void endElement(String name) throws SAXException
??? {
??? if (currentElement.equals(name))
????? table.put(currentElement, currentValue);
??? }
? }
JSP內容顯示源碼,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\\people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>");
out.println("<TR><TD>姓名</TD>" + "<TD>" +
? (String)hashTable.get(new String("name")) + "</TD></TR>");
out.println("<TR><TD>學院</TD>" + "<TD>" +
? (String)hashTable.get(new String("college"))+"</TD></TR>");
out.println("<TR><TD>電話</TD>" + "<TD>" +
? (String)hashTable.get(new String("telephone")) + "</TD></TR>");
out.println("<TR><TD>備注</TD>" + "<TD>" +
? (String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>
146、EJB的基本架構
答:一個EJB包括三個部分:
? Remote Interface 接口的代碼
? package Beans;
? import javax.ejb.EJBObject;
? import java.rmi.RemoteException;
? public interface Add extends EJBObject
? {
?? //some method declare
? }
? Home Interface 接口的代碼
? package Beans;
? import java.rmi.RemoteException;
? import jaax.ejb.CreateException;
? import javax.ejb.EJBHome;
? public interface AddHome extends EJBHome
? {
??? //some method declare
? }
? EJB類的代碼
? package Beans;
? import java.rmi.RemoteException;
? import javax.ejb.SessionBean;
? import javx.ejb.SessionContext;
? public class AddBean Implements SessionBean
? {
??? //some method declare
? }?
147、如何校驗數字型?
var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null)
{
?? sign=-4;
?? break;
}
else{
?? document.form1.all(i).value=parseFloat(str);
}
148、將一個鍵盤輸入的數字轉化成中文輸出
(例如:輸入:1234567?????輸出:一百二拾三萬四千五百六拾七)
用java語言實現,,請編一段程序實現!
?public?class?Reader?{
??private?String?strNum;
??private?String?strNumChFormat;
??private?String?strNumTemp;
??private?int?intNumLen;
??private?String?strBegin;
??public?Reader(String?strNum)?{
????this.strNum?=?strNum;
??}
??public?boolean?check(String?strNum)?{
????boolean?valid?=?false;
????
????if?(strNum.substring(0,1).equals("0")){
?????this.strNum?=?strNum.substring(1);
????}
????try?{
??????new?Double(strNum);
??????valid?=?true;
????}
????catch?(NumberFormatException?ex)?{
??????System.out.println("Bad?number?format!");
????}
????return?valid;
??}
??public?void?init()?{
????strNumChFormat?=?"";
????intNumLen?=?strNum.length();
????strNumTemp?=?strNum;
????strNumTemp?=?strNumTemp.replace('1',?'一');
????strNumTemp?=?strNumTemp.replace('2',?'二');
????strNumTemp?=?strNumTemp.replace('3',?'三');
????strNumTemp?=?strNumTemp.replace('4',?'四');
????strNumTemp?=?strNumTemp.replace('5',?'五');
????strNumTemp?=?strNumTemp.replace('6',?'六');
????strNumTemp?=?strNumTemp.replace('7',?'七');
????strNumTemp?=?strNumTemp.replace('8',?'八');
????strNumTemp?=?strNumTemp.replace('9',?'九');
????strNumTemp?=?strNumTemp.replace('0',?'零');
????strNumTemp?=?strNumTemp.replace('.',?'點');
????strBegin?=?strNumTemp.substring(0,?1);
??}
??public?String?readNum()?{
????if?(check(strNum))?{
??????init();
??????try?{
????????for?(int?i?=?1,?j?=?1,?k?=?1;?i?<?intNumLen;?i++)?{
? ?????????if?(strNumTemp.charAt (intNumLen?-?1)?==?'零'?&&?i?= =?1)?{
????????????strNumChFormat?=?"位";
??????????}
? ?????????else?if?(strNumTemp.charAt (intNumLen?-?i)?==?'零'?&&?j?= =?1)?{
????????? ???strNumChFormat?=?"位"?+? strNumChFormat;
??????????}
? ?????????else?if?(strNumTemp.charAt (intNumLen?-?i)?==?'點')?{
????????????j?=?1;
????????????k?=?1;
????????????strNumChFormat?=?strNumTemp.charAt(intNumLen?-?i)?+?strNumChFormat;
????????????continue;
??????????}
??????????else?{
????????????strNumChFormat?=?strNumTemp.charAt(intNumLen?-?i)?+?strNumChFormat;
??????????}
? ?????????if?(strNumTemp.charAt (intNumLen?-?i?-?1)?!=?'位'?&&
? ????????????? strNumTemp.charAt(intNumLen?-?i?-?1)?!=?'零 ')?{
????????????if?(j?==?1?&&?i?<?intNumLen)?{
? ????????????? strNumChFormat?=?'拾'?+?strNumChFormat;
????????????}
????????????else?if?(j?==?2?&&?i?<?intNumLen)?{
? ????????????? strNumChFormat?=?'百'?+?strNumChFormat;
????????????}
????????????else?if?(j?==?3?&&?i?<?intNumLen)?{
? ????????????? strNumChFormat?=?'千'?+?strNumChFormat;
????????????}
??????????}
??????????if?(j?==?4?&&?i?<?intNumLen)?{
????????????j?=?0;
??????????}
??????????if?(k?==?4?&&?i?<?intNumLen)?{
? ???????????strNumChFormat? =?'萬'?+?strNumChFormat;
??????????}
??????????else?if?(k?==?8?&&?i?<?intNumLen)?{
????????????k?=?0;
? ???????????strNumChFormat? =?'億'?+?strNumChFormat;
??????????}
??????????j++;
??????????k++;
????????}
????????while?(strNumChFormat.indexOf("位")?!=?-1)?{
? ?????????strNumChFormat? =?strNumChFormat.replaceAll("位",?"?");
????????}
????????if?(strNumChFormat.substring(0,?2)?==?"一拾")?{
??????????strNumChFormat?=?strNumChFormat.substring(1,?strNumChFormat.length());
????????}
????????if?(strNumChFormat.indexOf("點")?>=?0)?{
??????????String?rebegin?=?strNumChFormat.substring(0,
??????????????strNumChFormat.indexOf("點"));
? ?????????String?relast? =?strNumChFormat.substring(strNumChFormat.indexOf("點"),
??????????????strNumChFormat.length());
??????????for?(int?i?=?1;?i?<=?relast.length();?i++)?{
????????????relast?=?relast.replaceAll("拾",?"");
????????????relast?=?relast.replaceAll("百",?"");
????????????relast?=?relast.replaceAll("千",?"");
????????????relast?=?relast.replaceAll("萬",?"");
????????????relast?=?relast.replaceAll("億",?"");
??????????}
??????????strNumChFormat?=?rebegin?+?relast;
????????}
??????}
??????catch?(ArrayIndexOutOfBoundsException?ex)?{
????????ex.printStackTrace();
??????}
??????catch?(Exception?ex)?{
????????ex.printStackTrace();
??????}
??????int?off?=?strNumChFormat.indexOf("點");
??????strNumChFormat?=?strBegin?+?strNumChFormat.substring(0);
????}
????else?{
??????strNumChFormat?=?"";
????}
????return?strNumChFormat;
??}
??public?static?void?main(String?args[])?{
????try?{
??????String?number?=?args[0].toString();
??????System.out.println("The?number?is:?"?+?number);
??????Reader?reader?=?new?Reader(number);
??????System.out.println("Output?String:?"?+?reader.readNum());
????}
????catch?(Exception?ex)?{
??????System.out.println("Please?input?like?that:?javac?Reader?<number>");
????}
??}
}
149、JAVA代碼查錯
1.
abstract?class?Name?{
???private?String?name;
???public?abstract?boolean?isStupidName(String?name)?{}
}
大俠們,這有何錯誤?
答案:?錯。abstract?method必須以分號結尾,且不帶花括號。
2.
public?class?Something?{
???void?doSomething?()?{
???????private?String?s?=?"";
???????int?l?=?s.length();
???}
}
有錯嗎?
答案:?錯。局部變量前不能放置任何訪問修飾符?(private,public,和protected)。final可以用來修飾局部變量
(final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)。
3.
abstract?class?Something?{
???private?abstract?String?doSomething?();
}
這好像沒什么錯吧?
答案:?錯。abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實現)具體細節的,怎么可以用private把abstract
method封鎖起來呢??(同理,abstract?method前不能加final)。
4.
public?class?Something?{
???public?int?addOne(final?int?x)?{
???????return?++x;
???}
}
這個比較明顯。
答案:?錯。int?x被修飾成final,意味著x不能在addOne?method中被修改。
5.
public?class?Something?{
???public?static?void?main(String[]?args)?{
???????Other?o?=?new?Other();
???????new?Something().addOne(o);
???}
???public?void?addOne(final?Other?o)?{
???????o.i++;
???}
}
class?Other?{
???public?int?i;
}
和上面的很相似,都是關于final的問題,這有錯嗎?
答案:?正確。在addOne?method中,參數o被修飾成final。如果在addOne?method里我們修改了o的reference
(比如:?o?=?new?Other();),那么如同上例這題也是錯的。但這里修改的是o的member?vairable
(成員變量),而o的reference并沒有改變。
6.
class?Something?{
????int?i;
????public?void?doSomething()?{
????????System.out.println("i?=?"?+?i);
????}
}?
有什么錯呢??看不出來啊。
答案:?正確。輸出的是"i?=?0"。int?i屬於instant?variable?(實例變量,或叫成員變量)。instant?variable有default?value。int的default?value是0。
7.
class?Something?{
????final?int?i;
????public?void?doSomething()?{
????????System.out.println("i?=?"?+?i);
????}
}
和上面一題只有一個地方不同,就是多了一個final。這難道就錯了嗎?
答案:?錯。final?int?i是個final的instant?variable?(實例變量,或叫成員變量)。final的instant?variable沒有default?value,必須在constructor?(構造器)結束之前被賦予一個明確的值。可以修改為"final?int?i?=?0;"。
8.
public?class?Something?{
?????public?static?void?main(String[]?args)?{
????????Something?s?=?new?Something();
????????System.out.println("s.doSomething()?returns?"?+?doSomething());
????}
????public?String?doSomething()?{
????????return?"Do?something?...";
????}
}
?看上去很完美。
答案:?錯。看上去在main里call?doSomething沒有什么問題,畢竟兩個methods都在同一個class里。但仔細看,main是static的。static?method不能直接call?non-static?methods。可改成"System.out.println("s.doSomething()?returns?"?+?s.doSomething());"。同理,static?method不能訪問non-static?instant?variable。
9.
此處,Something類的文件名叫OtherThing.java
class?Something?{
????private?static?void?main(String[]?something_to_do)?{????????
????????System.out.println("Do?something?...");
????}
}
?這個好像很明顯。
答案:?正確。從來沒有人說過Java的Class名字必須和其文件名相同。但public?class的名字必須和文件名相同。
10.
interface??A{
???int?x?=?0;
}
class?B{
???int?x?=1;
}
class?C?extends?B?implements?A?{
???public?void?pX(){
??????System.out.println(x);
???}
???public?static?void?main(String[]?args)?{
??????new?C().pX();
???}
}
答案:錯誤。在編譯時會發生錯誤(錯誤描述不同的JVM有不同的信息,意思就是未明確的x調用,兩個x都匹配(就象在同時import?java.util和java.sql兩個包時直接聲明Date一樣)。對于父類的變量,可以用super.x來明確,而接口的屬性默認隱含為?public?static?final.所以可以通過A.x來明確。
11.
interface?Playable?{
????void?play();
}
interface?Bounceable?{
????void?play();
}
interface?Rollable?extends?Playable,?Bounceable?{
????Ball?ball?=?new?Ball("PingPang");
}
class?Ball?implements?Rollable?{
????private?String?name;
????public?String?getName()?{
????????return?name;
????}
????public?Ball(String?name)?{
????????this.name?=?name;????????
????}
???public?void?play()?{
????????ball?=?new?Ball("Football");
????????System.out.println(ball.getName());
????}
}
這個錯誤不容易發現。
答案:?錯。"interface?Rollable?extends?Playable,?Bounceable"沒有問題。interface可繼承多個interfaces,所以這里沒錯。問題出在interface?Rollable里的"Ball?ball?=?new?Ball("PingPang");"。任何在interface里聲明的interface?variable?(接口變量,也可稱成員變量),默認為public?static?final。也就是說"Ball?ball?=?new?Ball("PingPang");"實際上是"public?static?final?Ball?ball?=?new?Ball("PingPang");"。在Ball類的Play()方法中,"ball?=?new?Ball("Football");"改變了ball的reference,而這里的ball來自Rollable?interface,Rollable?interface里的ball是public?static?final的,final的object是不能被改變reference的。因此編譯器將在"ball?=?new?Ball("Football");"這里顯示有錯。
28、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。
以下程序使用內部類實現線程,對j增減的時候沒有考慮順序問題。
public?class?ThreadTest1{
??private?int?j;
??public?static?void?main(String?args[]){
ThreadTest1?tt=new?ThreadTest1();
Inc?inc=tt.new?Inc();
Dec?dec=tt.new?Dec();
for(int?i=0;i<2;i++){
Thread?t=new?Thread(inc);
t.start();
t=new?Thread(dec);
t.start();
}
}
??private?synchronized?void?inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
??}
??private?synchronized?void?dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
??}
??class?Inc?implements?Runnable{
public?void?run(){
for(int?i=0;i<100;i++){
inc();
}
}
??}
??class?Dec?implements?Runnable{
public?void?run(){
for(int?i=0;i<100;i++){
dec();
}
?}
??}
}
?