1. java中匿名對象和變數的問題
可以使用 文本框,密碼框的 getText() 獲取對應輸入的值,如下:
area.addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
if(e.getClickCount()==1){
//獲取用戶名
Stringname=nameField.getText();
//獲取密碼
Stringpassword=passField.getText();
System.out.println("用戶名:"+name+",密碼:"+password);
DaoToolemploye=newEmploye();
Object[]checkoneline=employe.Checkoneline(name,password);
if(checkoneline.length==0){//表示沒用該用戶
JOptionPane.showMessageDialog(frame,"用戶名或密碼錯誤!","",JOptionPane.WARNING_MESSAGE);
}
}
}
});
2. 用JAVA語句在控制台輸入(石頭)1 (剪刀)2 (布)3 統計你贏了多少次(次數無論)
剛剛沒考慮到勝利的判斷規則,現在補上,不好意思哦
-------------------------------------代碼------------------------------
packagecom.hx.;
importjava.util.Random;
importjava.util.Scanner;
/**
*@項目名稱:JavaGame_March
*@文件名稱:ShitouJian.java
*@所在包:com.hx.
*@功能描述:用JAVA語句在控制台輸入(石頭)1(剪刀)2(布)3統計你贏了多少次(次數無論)
*這是在網路上看到的題目:http://..com/question/231284633.html
*
*@創建者:集成顯卡[email protected]
*@創建日期:2011-3-1
*@修改記錄:
*/
publicclassShitouJian{
privateScannerscanner;//控制台的監視
privateintcount;//計數器
privateintwin_count;//贏了多少次
privateRandomrandom;//產生隨機數
privateStringname[]={"石頭","剪刀","布"};
/**
*@構造方法:
*@類名:ShitouJian.java
*/
publicShitouJian(){
//如果scanner為null時,使用控制台的in這個inputstream實例化
if(scanner==null){
scanner=newScanner(System.in);
}
//同上面的scanner
if(random==null){
random=newRandom();
}
System.out.println("系統初始化完成。By:集成顯卡2011");
System.out.println("輸入(石頭)1(剪刀)2(布)3,並按回車便可以進行游戲。輸入『e』退出遊戲。");
process();
}
privatevoidprocess(){
intsysResult;//程序後台得到的答案
intuserResult;//用戶輸入的
while(true){
sysResult=random.nextInt(2)+1;
System.out.print("第"+(++count)+"次,你出:");
if(scanner.hasNext()){
Stringtemp=scanner.next();
try{
userResult=Integer.valueOf(temp);
intresult=isWin(userResult,sysResult);
if(result==0){
win_count++;
System.out.println("恭喜您答對了!您已經答對了:"+win_count+"次");
}elseif(result==2){
System.out.println("平局");
}else{
System.out.println("嘻嘻,你答錯了哦,答案是:"+name[sysResult-1]+"可您出:"+name[userResult-1]);
}
}catch(Exceptione){
if(temp.equalsIgnoreCase("e")){
System.out.println("現在退出遊戲:您進行了"+count+"次游戲,答對:"+win_count+"次");
System.out.println("多謝游戲!");
break;
}
}
}
}
}
/**
*@方法名稱:isWin
*@功能描述:判斷是否勝利(石頭)1(剪刀)2(布)31勝2,2勝3,3勝1,返回值:0為勝利,1為錯了,2為平
*@返回值類型:boolean
*@paramuer
*@paramsys
*@return
*
*@創建日期:2011-3-1
*@修改記錄:
*/
privateintisWin(intuer,intsys){
if(uer==sys)
return2;
if((uer==1&&sys==2)||(uer==2&&sys==3)||(uer==3&&sys==1))
return0;
return1;
}
publicstaticvoidmain(Stringa[]){
newShitouJian();
}
}
============運行結果==========
系統初始化完成。By:集成顯卡2011
輸入(石頭)1(剪刀)2(布)3,並按回車便可以進行游戲。輸入『e』退出遊戲。
第1次,你出:1
平局
第2次,你出:2
嘻嘻,你答錯了哦,答案是:石頭可您出:剪刀
第3次,你出:3
恭喜您答對了!您已經答對了:1次
第4次,你出:1
平局
第5次,你出:1
恭喜您答對了!您已經答對了:2次
第6次,你出:2
嘻嘻,你答錯了哦,答案是:石頭可您出:剪刀
第7次,你出:e
現在退出遊戲:您進行了7次游戲,答對:2次
多謝游戲!
3. java多線程編程實戰指南 怎麼樣
Active Object模式簡介
Active Object模式是一種非同步編程模式。它通過對方法的調用與方法的執行進行解耦來提高並發性。若以任務的概念來說,Active Object模式的核心則是它允許任務的提交(相當於對非同步方法的調用)和任務的執行(相當於非同步方法的真正執行)分離。這有點類似於 System.gc()這個方法:客戶端代碼調用完gc()後,一個進行垃圾回收的任務被提交,但此時JVM並不一定進行了垃圾回收,而可能是在gc() 方法調用返回後的某段時間才開始執行任務——回收垃圾。我們知道,System.gc()的調用方代碼是運行在自己的線程上(通常是main線程派生的子 線程),而JVM的垃圾回收這個動作則由專門的線程(垃圾回收線程)來執行的。換言之,System.gc()這個方法所代表的動作(其所定義的功能)的 調用方和執行方是運行在不同的線程中的,從而提高了並發性。
再進一步介紹Active Object模式,我們可先簡單地將其核心理解為一個名為ActiveObject的類,該類對外暴露了一些非同步方法,如圖1所示。
圖 1. ActiveObject對象示例
doSomething方法的調用方和執行方運行在各自的線程上。在並發的環境下,doSomething方法會被多個線程調用。這時所需的線程安 全控制封裝在doSomething方法背後,使得調用方代碼無需關心這點,從而簡化了調用方代碼:從調用方代碼來看,調用一個Active Object對象的方法與調用普通Java對象的方法並無太大差別。如清單1所示。
清單 1. Active Object方法調用示例
ActiveObject ao=...;
Future future = ao.doSomething("data");
//執行其它操作
String result = future.get();
System.out.println(result);
Active Object模式的架構
當Active Object模式對外暴露的非同步方法被調用時,與該方法調用相關的上下文信息,包括被調用的非同步方法名(或其代表的操作)、調用方代碼所傳遞的參數等,會 被封裝成一個對象。該對象被稱為方法請求(Method Request)。方法請求對象會被存入Active Object模式所維護的緩沖區(Activation Queue)中,並由專門的工作線程負責根據其包含的上下文信息執行相應的操作。也就是說,方法請求對象是由運行調用方代碼的線程通過調用Active Object模式對外暴露的非同步方法生成的,而方法請求所代表的操作則由專門的線程來執行,從而實現了方法的調用與執行的分離,產生了並發。
Active Object模式的主要參與者有以下幾種。其類圖如圖2所示。
圖 2. Active Object模式的類圖
(點擊圖像放大)
Proxy:負責對外暴露非同步方法介面。當調用方代碼調用該參與者實例的非同步方法doSomething時,該方法會生成一個相 應的MethodRequest實例並將其存儲到Scheler所維護的緩沖區中。doSomething方法的返回值是一個表示其執行結果的外包裝 對象:Future參與者的實例。非同步方法doSomething運行在調用方代碼所在的線程中。
MethodRequest:負責將調用方代碼對Proxy實例的非同步方法的調用封裝為一個對象。該對象保留了非同步方法的名稱及調用方代碼傳遞的參數等上下文信息。它使得將Proxy的非同步方法的調用和執行分離成為可能。其call方法會根據其所包含上下文信息調用Servant實例的相應方法。
ActivationQueue:負責臨時存儲由Proxy的非同步方法被調用時所創建的MethodRequest實例的緩沖區。
Scheler:負責將Proxy的非同步方法所創建的MethodRequest實例存入其維護的緩沖區中。並根據一定的調 度策略,對其維護的緩沖區中的MethodRequest實例進行執行。其調度策略可以根據實際需要來定,如FIFO、LIFO和根據 MethodRequest中包含的信息所定的優先順序等。
Servant:負責對Proxy所暴露的非同步方法的具體實現。
Future:負責存儲和返回Active Object非同步方法的執行結果。
Active Object模式的序列圖如圖3所示。
圖 3. Active Object模式的序列圖
(點擊圖像放大)
第1步:調用方代碼調用Proxy的非同步方法doSomething。
第2~7步:doSomething方法創建Future實例作為該方法的返回值。並將調用方代碼對該方法的調用封裝為MethodRequest 對象。然後以所創建的MethodRequest對象作為參數調用Scheler的enqueue方法,以將MethodRequest對象存入緩沖 區。Scheler的enqueue方法會調用Scheler所維護的ActivationQueue實例的enqueue方法,將 MethodRequest對象存入緩沖區。
第8步:doSomething返回其所創建的Future實例。
第9步:Scheler實例採用專門的工作線程運行dispatch方法。
第10~12步:dispatch方法調用ActivationQueue實例的dequeue方法,獲取一個MethodRequest對象。然後調用MethodRequest對象的call方法
第13~16步:MethodRequest對象的call方法調用與其關聯的Servant實例的相應方法doSomething。並將Servant.doSomething方法的返回值設置到Future實例上。
第17步:MethodRequest對象的call方法返回。
上述步驟中,第1~8步是運行在Active Object的調用者線程中的,這幾個步驟實現了將調用方代碼對Active Object所提供的非同步方法的調用封裝成對象(Method Request),並將其存入緩沖區。這幾個步驟實現了任務的提交。第9~17步是運行在Active Object的工作線程中,這些步驟實現從緩沖區中讀取Method Request,並對其進行執行,實現了任務的執行。從而實現了Active Object對外暴露的非同步方法的調用與執行的分離。
如果調用方代碼關心Active Object的非同步方法的返回值,則可以在其需要時,調用Future實例的get方法來獲得非同步方法的真正執行結果。
Active Object模式實戰案例
某電信軟體有一個彩信短號模塊。其主要功能是實現手機用戶給其它手機用戶發送彩信時,接收方號碼可以填寫為對方的短號。例如,用戶13612345678給其同事13787654321發送彩信時,可以將接收方號碼填寫為對方的短號,如776,而非其真實的號碼。
該模塊處理其接收到的下發彩信請求的一個關鍵操作是查詢資料庫以獲得接收方短號對應的真實號碼(長號)。該操作可能因為資料庫故障而失敗,從而使整 個請求無法繼續被處理。而資料庫故障是可恢復的故障,因此在短號轉換為長號的過程中如果出現資料庫異常,可以先將整個下發彩信請求消息緩存到磁碟中,等到 資料庫恢復後,再從磁碟中讀取請求消息,進行重試。為方便起見,我們可以通過Java的對象序列化API,將表示下發彩信的對象序列化到磁碟文件中從而實 現請求緩存。下面我們討論這個請求緩存操作還需要考慮的其它因素,以及Active Object模式如何幫助我們滿足這些考慮。
首先,請求消息緩存到磁碟中涉及文件I/O這種慢的操作,我們不希望它在請求處理的主線程(即Web伺服器的工作線程)中執行。因為這樣會使該模塊 的響應延時增大,降低系統的響應性。並使得Web伺服器的工作線程因等待文件I/O而降低了系統的吞吐量。這時,非同步處理就派上用場了。Active Object模式可以幫助我們實現請求緩存這個任務的提交和執行分離:任務的提交是在Web伺服器的工作線程中完成,而任務的執行(包括序列化對象到磁碟 文件中等操作)則是在Active Object工作線程中執行。這樣,請求處理的主線程在偵測到短號轉長號失敗時即可以觸發對當前彩信下發請求進行緩存,接著繼續其請求處理,如給客戶端響 應。而此時,當前請求消息可能正在被Active Object線程緩存到文件中。如圖4所示。
圖 4 .非同步實現緩存
其次,每個短號轉長號失敗的彩信下發請求消息會被緩存為一個磁碟文件。但我們不希望這些緩存文件被存在同一個子目錄下。而是希望多個緩存文件會被存 儲到多個子目錄中。每個子目錄最多可以存儲指定個數(如2000個)的緩存文件。若當前子目錄已存滿,則新建一個子目錄存放新的緩存文件,直到該子目錄也 存滿,依此類推。當這些子目錄的個數到達指定數量(如100個)時,最老的子目錄(連同其下的緩存文件,如果有的話)會被刪除。從而保證子目錄的個數也是 固定的。顯然,在並發環境下,實現這種控制需要一些並發訪問控制(如通過鎖來控制),但是我們不希望這種控制暴露給處理請求的其它代碼。而Active Object模式中的Proxy參與者可以幫助我們封裝並發訪問控制。
下面,我們看該案例的相關代碼通過應用Active Object模式在實現緩存功能時滿足上述兩個目標。首先看請求處理的入口類。該類就是本案例的Active Object模式的客調用方代碼。如清單2所示。
清單 2. 彩信下發請求處理的入口類
public class MMSDeliveryServlet extends HttpServlet {
private static final long serialVersionUID = 5886933373599895099L;
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//將請求中的數據解析為內部對象
MMSDeliverRequest mmsDeliverReq = this.parseRequest(req.getInputStream());
Recipient shortNumberRecipient = mmsDeliverReq.getRecipient();
Recipient originalNumberRecipient = null;
try {
// 將接收方短號轉換為長號
originalNumberRecipient = convertShortNumber(shortNumberRecipient);
} catch (SQLException e) {
// 接收方短號轉換為長號時發生資料庫異常,觸發請求消息的緩存
AsyncRequestPersistence.getInstance().store(mmsDeliverReq);
// 繼續對當前請求的其它處理,如給客戶端響應
resp.setStatus(202);
}
}
private MMSDeliverRequest parseRequest(InputStream reqInputStream) {
MMSDeliverRequest mmsDeliverReq = new MMSDeliverRequest();
//省略其它代碼
return mmsDeliverReq;
}
private Recipient convertShortNumber(Recipient shortNumberRecipient)
throws SQLException {
Recipient recipent = null;
//省略其它代碼
return recipent;
}
}
4. java問題
5. Java應該怎麼學才能拿到好的offer
1.1 Java學習總體方向
對於剛學習Java的同學,了解Java學習的大致結構。當然你能在Orace Java的主頁上看到還有如Java FX、Java DB這樣的技術。但是既然要和市場接軌,必然要有所取捨。
Java SE是我們Java入門的開端,這塊內容也就是大家所熟悉的坦克大戰、聊天軟體、五子棋這些桌面級項目所組成的。學完了Java SE部分,接下來就該選擇方向了。
1.2 Java SE中應該關注的內容
Java SE大致可分為以下幾塊內容:
對象導論:如何用面向對象的思路來開發
深入JVM:Java運行機制以及JVM原理
面向對象的特徵:封裝、繼承、抽象、多態
數組和容器:容器的線程安全問題
I/O和IO:IO工作原理和應用
並發編程:cocurret包
網路編程:TCP/IP+BIO/IO UDP/IP+BIO/IO
JDBC框架和反射:JDI、連接池、aotatio等
其他:正則表達式、字元串等
1.3 Java EE中該學點什麼
Java EE很雜,但是也很容易學,因為你做幾個網站大概就能把所有知識點串聯起來。所以Java EE方向說好聽點兒的叫企業級應用開發,說難聽點兒的其實就是做網站。當然並不局限於做網站。
對於Java EE方向的學習,重點在於能夠熟練的運用各種框架,以及掌握各種框架構成的核心思想。
至於學什麼框架,用什麼應用伺服器,在學習的時候可以採用容易配置的,所有的同類服務都是類似的,精通了一個,相似的學習就很快了。
1.4 關於Java EE之後應該學點兒什麼
對於大多數企業來說,如果你能掌握上面提到的相關技術,並且熟悉SQ和iux,那找個Java相關工作應該是沒有問題的了。如果你想更深入的去應用上面所學的知識,分布式、搜索引擎、大數據處理等互聯網熱門技術都是你擴寬技能的方向。
1.5 你還需要了解點什麼
學無止境,要想在計算機里走的順利點兒,你真的需要不斷的學習。
當然有幾點在計算機學習中相當重要:
學好英語:最好的資料往往都是英文的文檔。
學好專業基礎課:數據結構、操作系統、網路這些核心課程都是後續提高的基石。
多關心技術發展。
6. 這段JAVA代碼是什麼結構! ShoutAbility ao_shout=new AoShout()
ShoutAbility應該是個介面或抽象類、普通類,AoShout繼承了ShoutAbility類或實現了介面。
7. 求個用JAVA或者C++寫的AO*演算法的程序
http://lhs8600.ycool.com/post.3039919.html
還有下面的
C++中AO裁剪關鍵代碼
ITopologicalOperatorPtr ipTopolog(CLSID_Line);
long lCount = 0;
while (SUCCEEDED(ipSorCursor->NextFeature(&ipFeature))
&& (NULL != ipFeature)) {
result = ipFeature->get_Shape(&ipGeometry);
if (FAILED(result) || NULL == ipGeometry) {
TRACE("%ld\n", result);
continue;
}
((IZAwarePtr)ipGeometry)->put_ZAware(VARIANT_FALSE);
((IMAwarePtr)ipGeometry)->put_MAware(VARIANT_FALSE);
// 入庫圖形都需要裁剪才能入庫的。
ipTopolog = ipGeometry;
result = ipTopolog->Intersect((IGeometryPtr)ipGridPolygon, esriGeometry1Dimension, &ipResult);
if (FAILED(result) || NULL == ipResult) {
TRACE("%ld\n", result);
continue;
}
result = ipResult->get_IsEmpty(&vb);
if (VARIANT_TRUE == vb) {
TRACE("%ld\n", result);
continue;
}
...
}
希望可以幫到你
8. Java中的對象轉型問題
比如有A類,有成員變數 int a
有B類繼承了A類,它新增了成員變數 int b;
那「一個基類的引用類型變數可以「指向」其子類的對象。」指:
A ao = new B(); //合法
那「一個基類的引用不可以訪問其子類對象新增加的成員「就是指:對上一步創建的ao
System.out.println(ao.a);//合法
System.out.println(ao.b);//不合法,不可以訪問超出A自身的任何屬性