導航:首頁 > 編程語言 > java代碼分析

java代碼分析

發布時間:2022-09-19 11:20:58

java代碼解析

一樓的說的夠全面了,不過稍有誤解.

再來表示抱歉,我對編程語言中的中文名詞非常不了解,所以如果以下的回復對你的閱讀或者理解造成困難,請見諒.

1.首先,要明白這個問題的答案,需要了解call(pass)byvalue和call(pass)byreference的區別.簡單來說:

callbyvalue通常是復制這個parameter的值去另外一塊內存里,然後傳給function,所以在method/function里邊對這個變數的所有變更,實際上都是對復制過來的鏡像進行操作,不會對原本的variable有任何影響.

callbyreference是將parameter的reference傳給function,簡單點理解就是直接把variable傳給function.所以說這個variable的值是可以被function改變的.這個用法在c/c++中非常常見,用法是&variable_name.

2.再來,在Java里邊,你可以很簡單的理解為:Java中只有callbyvalue,也就是說,所以所有傳給function的parameter本身都不會被改變.(這是最簡單直白的理解,當然也有另一種常從sun的人那邊聽到的說法:Java是callbyvalue+callbyreferencebyvalue)

3.那麼現在的問題就是為什麼第二個結果是2了.首先說一下sun官方的解釋:對於referencetype在作為parameter/argument的時候,也是callbyvalue,但是在你擁有足夠許可權時(比方說那個變數是public的,不是final的等等各種符合的情況),可以修改這個object中fields的值(也就是屬於這個object(嚴謹點講是aninstanceoftheobject)內部的變數,在你的例子中,ko里邊的a就是一個field,所以update(ko)會使ko.a變成2).

4.如果你是一個有過c/c++學習經驗的人或者你以上的解釋很難理解,以下這種說法或許更適合你(當然了,這只是大多包括我在內有c經驗的人的一種理解方式)

這里可以引入一個新的概念,pointer.這是一種比較特殊的變數,它內部所儲存的東西,其實只是另外一個變數的內存地址.如果對內存沒有概念,你可以把它簡單理解為是風箏的線軸,雖然看它本身看不出什麼端倪,但是順著摸過去總會找到風箏,看到它是什麼樣子.以pointer方式理解Java的人,通常會說:Typevariable=newType();這個過程中,最後生成的這個variable其實就是一個pointer,而不是instance本身.

在Java中,有c/c++經驗的人通常認為Java是callbyvalue.同時,當一個變數用在儲存referencetype的時候,實際上儲存的是它的pointer,這也一樣可以解釋為什麼ko.a會有2這個結果,因為雖然pointer被傳到function里邊時,本身是callbyvalue,無法被改變.但這並不影響function本身對這個pointer指向的object的內容做任何改變.當然,再次聲明,這只是一種幫助有c/c++經驗的人理解的方法.Sun本身嚴正聲明Java里邊沒有pointer這個東西的存在.

5.再來解釋一下為什麼說樓上所說的(或者說樓上引用的)理解略有偏差.

引用"我們上面剛學習了JAVA的數據類型,則有:值類型就是按值傳遞的,而引用類型是按引用傳遞的"這句話很明顯的有兩點錯誤.第一點,如果我上面所說的,Java是沒有callbyreference的.

第二點,暫且假設Java里邊是有callbyreference的,這句話依然不成立.

Java中的變數有兩種類型:primitivetypes和referencetype.

primitivetype包括byte,short,int,long,char,boolean,float和double.

而這8種之外的所有的,都是referencetype.

下面是一段對你的貼上來的code的一點延伸,希望可以幫助你更好的理解Java中的argument/parameter到底是如何運作的.

publicclassTest{

publicstaticvoidmain(String[]args){

inta=1;

Kookoo=newKoo();

Objecto=newInteger(1);

KoonewKoo=newKoo();

update(a);

update(koo);

update(o);

update(newKoo);

newUpdate(newKoo);

System.out.println(a);

System.out.println(koo.a);

System.out.println(o);

System.out.println(newKoo.a);

}

staticvoipdate(inta){

a++;

}

staticvoipdate(Kookoo){

koo.a++;

}

staticvoipdate(Objecto){

o=(int)(Integer.parseInt(o.toString())+1);

}

staticvoidnewUpdate(Kookoo){

koo=newKoo();

}

}

classKoo{

inta=1;

}

/*

o=(int)(Integer.parseInt(o.toString())+1);這一行中的(int)純粹是多餘的,是否有這個casting對code本身沒有任何影響.如果你高興也可以用

o=newInteger(Integer.parseInt(o.toString())+1);

或者乾脆

o=Integer.parseInt(o.toString())+1;

*/

以上這些code運行之後會得到1212的結果.後面兩個結果可以很好的說明,即使對objects(referencetypevariables)來看,Java所應用的也並不是callbyreference.否則的話,以上code運行結果應該是1221

希望你可以真正理解這個新的例子中,產生1212這個結果的原因,從而對Java中的arguments有一個系統全面的認識.

圖片是相關資料的鏈接,知道里貌似不能加網址

㈡ 用java寫一個代碼分析程序,謝謝。

哥們.....
這問題幫不了你了額........只能給你提示....
確實有點難度...
在正常運行情況下類的數量,函數的數量容易得到,但是程序的規模這就難了啊...
代碼行數你可以用Eclipse里的Debug模式。

㈢ 誰能幫我把這個java代碼分析一下我被繞暈了

//哈哈,感覺這道題真心好啊。不知道樓主是從哪裡看到的。
//首先這道題樓主要明白以下兩點:
//1:繼承時,子類會隱藏父類相同的方法,要調用父類方法就必須使用super關鍵字。
//2:向上轉型時,子類會丟失和父類不同的方法,可以使用父類的不同名的所有方法。
publicclassPolyDemo09{
publicstaticvoidmain(String[]args){
Aa1=newA();
Aa2=newB();//B類型向上轉型丟失與A類不同方法
Bb=newB();
Cc=newC();
Dd=newD();

System.out.println("⑴"+a1.show(b));//B類的父類是A,所以AandA
System.out.println("⑵"+a1.show(c));//C類父類的父類是A,D和他是同級。所以AandA
System.out.println("⑶"+a1.show(d));//D類方法有,所以不會向上轉型,所以AandD
System.out.println("⑷"+a2.show(b));/*注意這時候a2的兩個方法其實是
publicStringshow(Dobj){
return("AandD");
}
publicStringshow(Aobj){
return("BandA");
}B的父類是A,所以BandA
*/
/**/
System.out.println("⑸"+a2.show(c));//C的父類的父類是A,所以BandA;
System.out.println("⑹"+a2.show(d));//D有對應方法,所以AandD
System.out.println("⑺"+b.show(b));/*這個就是繼承了,繼承除了隱藏父類中和子類同名的方法外,在子類中可以直接使用父類的方法。所以BandB
所以就變成了
publicStringshow(Dobj){
return("AandD");
}
publicStringshow(Bobj){
return("BandB");
}
publicStringshow(Aobj){
return("BandA");
*/
System.out.println("⑻"+b.show(c));//C的父類是B,所以BandB
System.out.println("⑼"+b.show(d));//D有相應方法,所以AandD

}
}

classA{
publicStringshow(Dobj){
return("AandD");
}
publicStringshow(Aobj){
return("AandA");
}
}

classBextendsA{
publicStringshow(Bobj){
return("BandB");
}
publicStringshow(Aobj){
return("BandA");
}

}

classCextendsB{
}

classDextendsB{
}

㈣ java代碼解讀

第一個if是判斷searchkey是不是空的,如果不是空的,就追加到name欄位作為查詢條件,like模糊查詢
接著第二個if判斷如果status的值不為空,就追加到status作為條件
如果status為空,走else分支,從userContext中獲取到employee對象,接著判斷,如果它的角色不是manager的話
把這個對象的id拿出來,作為seller.Id的條件進行查詢

㈤ 我是java初學者,拿到一個做好的java項目代碼,我該如何分析這個代碼結構和採用了什麼java框架技術。

1、拿到代碼查看項目當中是否有readme這樣的文件,如果沒有查看是否有文檔之類的
2、代碼當中沒有文檔,那麼就想你的同事或者其他人要這個框架的介紹或者資料
3、先請教別人這個框架的大體思路
4、自己獨立去按照文檔或者其他人說的思路去看代碼
5、不懂的地方全部記錄下面,一次行去問,有的時候很多問題在你看到後面的東西的時候就自然明白了
6、看懂了代碼之後自己嘗試著寫一個,看自己的理解是否正確就這么多了。

㈥ java代碼怎麼分析返回的一個數據結構

首先是一個foreach列印字元串數組的所有元素
接下來是通過對比每個字元串的length 找到最短的字元串
最後就是以最短字元串length為外層循環條件
在每一個循環里都循環一遍字元串數組每個元素的前length個元素
通過對比找到這些字元串當中共有的字元
在循環的過程中將字元依次拼接為字元串
最後就是輸出該字元串了

㈦ Java代碼如何優化從哪些方面入手分析

1)盡量指定類、方法的final修飾符。帶有final修飾符的類是不可派生的,Java編譯器會尋找機會內聯所有的final方法,內聯對於提升Java運行效率作用重大,此舉能夠使性能平均提高50%。

2)盡量重用對象。由於Java虛擬機不僅要花時間生成對象,以後可能還需要花時間對這些對象進行垃圾回收和處理,因此生成過多的對象將會給程序的性能帶來很大的影響。

3)盡可能使用局部變數。調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧中速度較快,其他變數,如靜態變數、實例變數等,都在堆中創建速度較慢。

4)慎用異常。異常對性能不利,只要有異常被拋出,Java虛擬機就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。異常只能用於錯誤處理,不應該用來控製程序流程。

5)乘法和除法使用移位操作。用移位操作可以極大地提高性能,因為在計算機底層,對位的操作是最方便、最快的,但是移位操作雖然快,可能會使代碼不太好理解,因此最好加上相應的注釋。

6)盡量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用 Hashtable、Vector、StringBuffer,後三者由於使用同步機制而導致了性能開銷。

㈧ 求java大神,請分析以下代碼,寫出執行結果,並解釋每行結果輸出的原因。

第一行,定義了int類型一維數組a和二維數組b
a={10,20,30,40}
b={{1,2},{4,5,6,7}}

第二行,b[0] = a; --> b={{10,20,30,40},{4,5,6,7}
第三行,b[0][1](20) = b[1][3](7); --> b={{10,7,30,40},{4,5,6,7}}(這里是地址引用,b[0]是a,所以b[0]改了,a也被改了)

最後:b[0][3] = 40,a[1] = 7

㈨ java分析代碼執行過程,輸出結果

static 是靜態聲明,所以會先執行Employee.id的時候,會先執行static的腳本,就是id 的默認賦值和靜態塊的執行,即列印那個static_block
所以流程是。賦值id,列印static_block;那上面的代碼就是列印static_block 和Main:0

㈩ 如何分析經過混淆後的java代碼

混淆代碼 是為了防止class文件被反編譯用的 但是程序的功能還是正常的 和你正常運行一樣
如果連變數名都混淆了,就是說所有有具體意義的英文變數名都用a,b,c,x,y等等來表示,那這是不可能還原的,因為電腦也不可能知道你這個a實際上代表了你的年齡而那個c代表了你老婆的胸圍!
但如果只是個事混淆,那網上倒有不少工具可以格式化源代碼!自己搜一搜吧!推薦一款編輯器,IntelliJ,很不錯,值得一提的是,我用過的眾多編輯器中,這款編輯器的代碼格式化功能最強大!

閱讀全文

與java代碼分析相關的資料

熱點內容
網路檢測可以檢測到什麼 瀏覽:504
sip協議教程 瀏覽:832
編程哪裡可以接項目 瀏覽:119
孤島驚魂win10 瀏覽:246
網路HRV是什麼意思 瀏覽:918
word框中打勾 瀏覽:577
tcl筆試題java 瀏覽:467
win10怎麼登錄安全模式 瀏覽:679
除了archdaily還有什麼網站 瀏覽:567
數控下料圓形怎麼編程 瀏覽:785
安裝游戲在文件管理找不到怎麼辦 瀏覽:216
想買奢侈包包下載什麼app 瀏覽:1000
閃送員是哪裡的app 瀏覽:530
火車站進站閘機的數據哪裡可以查 瀏覽:503
cad備份文件清理軟體 瀏覽:822
夾具裝配圖cad文件百度網盤 瀏覽:567
如何將excel表格轉成文件包 瀏覽:1
網路配置文件應該怎麼設置 瀏覽:886
蘋果全能文件王下載位置 瀏覽:700
中國知網是哪些資料庫 瀏覽:280

友情鏈接