java優(yōu)秀代碼賞析 java示例代碼

一段有意思的java代碼請(qǐng)大家解釋~

原理很簡(jiǎn)單,因?yàn)樵趈ava中,int是占4個(gè)字節(jié)大小,double占8個(gè)字節(jié)的大小,當(dāng)你把某變量乘以2的時(shí)候,在計(jì)算機(jī)里面的處理方式是左移一位。當(dāng)使用浮點(diǎn)數(shù)進(jìn)行乘法運(yùn)算時(shí),若結(jié)果很大,會(huì)以科學(xué)計(jì)數(shù)法表示。

為越秀等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及越秀網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、越秀網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

下面具體分析:

1、表達(dá)式0x7FFFFFFF == (int)(0x7FFFFFFF * 2.0)

0x7FFFFFFF 已經(jīng)占了4個(gè)字節(jié),也就是int型的最大范圍,以二進(jìn)制表示出來(lái)為01111111 11111111 11111111 11111111

0X7FFFFFFF*2.0 計(jì)算出來(lái)的結(jié)果為double型,那么結(jié)果將會(huì)以科學(xué)計(jì)數(shù)法來(lái)表示,也就是4.294967294E9, 以二進(jìn)制表示為0 11111111 11111111 11111111 11111110,以16進(jìn)制表示為0xFF FF FF FE,注意,這里的計(jì)算結(jié)果并沒(méi)有超出double的范圍8字節(jié)。

(int)(0x7FFFFFFF * 2.0) 在上面已經(jīng)看到0x7FFFFFFFF的二進(jìn)制表示為01111111 11111111 11111111 11111111乘以2就表示左移一位,結(jié)果為0 11111111 11111111 11111111 11111110 (注意,這個(gè)數(shù)并未超出8字節(jié)的范圍)然后再把結(jié)果強(qiáng)制轉(zhuǎn)換為int型,也就是從最高位開(kāi)始向下取4個(gè)字節(jié),因此最后一位的0被丟棄(取double的最大值,因此丟棄最低位),最后結(jié)果以二進(jìn)制表示為01111111 11111111 11111111 11111111,以16進(jìn)制表示為0x7F FF FF FF,可以看到與0x7FFFFFFFF的相同,因此第一個(gè)表達(dá)式0x7FFFFFFF == (int)(0x7FFFFFFF * 2.0)反回true。

2、表達(dá)式(int)(0x7FFFFFFF * 2.0) == (int)(0x7FFFFFFF * 2)

(int)(0x7FFFFFFF * 2.0)這部分的結(jié)果在上面介紹過(guò)了,這里就不用介紹了,結(jié)果還是為0x7F FF FF FF。

(int)(0x7FFFFFFF * 2) 其中0x7FFFFFFF*2表示把0x7FFFFFFF左移一位,其二進(jìn)制結(jié)果為0 11111111 11111111 11111111 11111110,因?yàn)樽詈鬄閕nt型,計(jì)算結(jié)果超出4個(gè)字節(jié),因此最高位的0被丟棄(int型的計(jì)算是拋棄最高位),結(jié)果為11111111 11111111 11111111 11111110,以16進(jìn)制表示為0xFF FF FF FE與0x7FFFFFFF不相同,因此結(jié)果為false。

要注意,在計(jì)算機(jī)中數(shù)值是以補(bǔ)碼的形式表示的(包括以上的計(jì)算結(jié)果全都是以補(bǔ)碼表示的),補(bǔ)碼知識(shí)不作介紹,這里只要知道,正數(shù)的被碼就為原來(lái)的正數(shù),而負(fù)數(shù)的補(bǔ)碼為符號(hào)位不變,其余各位按位取反再加1。因此0xFF FF FF FE除符號(hào)位不變(在java中int型最高位為符號(hào)位),其余各位取反再加1,結(jié)果為10000000 00000000 00000000 00000010最后結(jié)果為-2,以16進(jìn)制表示為0x80 00 00 02,因此使用print輸出該數(shù),則為-2,并不為0xFF FF FF FE的十進(jìn)制數(shù)值。

3、表達(dá)式0x7FFFFF * 2.0== (int)(0x7FFFFF * 2)

因?yàn)閮蓚€(gè)數(shù)字計(jì)算的結(jié)果都沒(méi)有出現(xiàn)超出int型的4個(gè)字節(jié)的情況,因此計(jì)算結(jié)果相同,這個(gè)就不介紹了,相信你應(yīng)該明白了。

好了,現(xiàn)在相信你應(yīng)該明白了

java代碼解析

一樓的說(shuō)的夠全面了,不過(guò)稍有誤解.

再來(lái)表示抱歉,我對(duì)編程語(yǔ)言中的中文名詞非常不了解,所以如果以下的回復(fù)對(duì)你的閱讀或者理解造成困難,請(qǐng)見(jiàn)諒.

1.首先,要明白這個(gè)問(wèn)題的答案,需要了解call?(pass)?by?value?和?call?(pass)?by?reference?的區(qū)別.簡(jiǎn)單來(lái)說(shuō):

call?by?value通常是復(fù)制這個(gè)parameter的值去另外一塊內(nèi)存里,然后傳給function,?所以在method/function里邊對(duì)這個(gè)變量的所有變更,實(shí)際上都是對(duì)復(fù)制過(guò)來(lái)的鏡像進(jìn)行操作,不會(huì)對(duì)原本的variable有任何影響.

call?by?reference是將parameter的reference傳給function,簡(jiǎn)單點(diǎn)理解就是直接把variable傳給function.所以說(shuō)這個(gè)variable的值是可以被function改變的.這個(gè)用法在c/c++中非常常見(jiàn),用法是variable_name.

2.再來(lái),在Java里邊,你可以很簡(jiǎn)單的理解為:?Java中只有call?by?value,?也就是說(shuō),所以所有傳給function的parameter本身都不會(huì)被改變.?(這是最簡(jiǎn)單直白的理解,當(dāng)然也有另一種常從sun的人那邊聽(tīng)到的說(shuō)法:Java是call?by?value?+?call?by?reference?by?value)

3.那么現(xiàn)在的問(wèn)題就是為什么第二個(gè)結(jié)果是2了.?首先說(shuō)一下sun官方的解釋:?對(duì)于reference?type在作為parameter/argument的時(shí)候,也是call?by?value,?但是在你擁有足夠權(quán)限時(shí)(比方說(shuō)那個(gè)變量是public的,?不是final的等等各種符合的情況),可以修改這個(gè)object中fields的值(也就是屬于這個(gè)object(嚴(yán)謹(jǐn)點(diǎn)講是an?instance?of?the?object)?內(nèi)部的變量,?在你的例子中,?ko?里邊的?a?就是一個(gè)field,?所以u(píng)pdate(ko)會(huì)使ko.a變成2).

4.如果你是一個(gè)有過(guò)c/c++學(xué)習(xí)經(jīng)驗(yàn)的人或者你以上的解釋很難理解,以下這種說(shuō)法或許更適合你?(當(dāng)然了,這只是大多包括我在內(nèi)有c經(jīng)驗(yàn)的人的一種理解方式)

這里可以引入一個(gè)新的概念,pointer.?這是一種比較特殊的變量,它內(nèi)部所儲(chǔ)存的東西,其實(shí)只是另外一個(gè)變量的內(nèi)存地址.?如果對(duì)內(nèi)存沒(méi)有概念,你可以把它簡(jiǎn)單理解為是風(fēng)箏的線(xiàn)軸,雖然看它本身看不出什么端倪,但是順著摸過(guò)去總會(huì)找到風(fēng)箏,看到它是什么樣子.?以pointer方式理解Java的人,通常會(huì)說(shuō):?Type?variable?=?new?Type();?這個(gè)過(guò)程中,最后生成的這個(gè)variable其實(shí)就是一個(gè)pointer,而不是instance本身.

在Java中,?有c/c++經(jīng)驗(yàn)的人通常認(rèn)為Java是call?by?value.同時(shí),當(dāng)一個(gè)變量用在儲(chǔ)存reference?type的時(shí)候,實(shí)際上儲(chǔ)存的是它的pointer,這也一樣可以解釋為什么ko.a會(huì)有2這個(gè)結(jié)果,因?yàn)殡m然pointer被傳到function里邊時(shí),本身是call?by?value,無(wú)法被改變.但這并不影響function本身對(duì)這個(gè)pointer指向的object的內(nèi)容做任何改變.?當(dāng)然,再次聲明,這只是一種幫助有c/c++經(jīng)驗(yàn)的人理解的方法.?Sun本身嚴(yán)正聲明Java里邊沒(méi)有pointer這個(gè)東西的存在.

5.?再來(lái)解釋一下為什么說(shuō)樓上所說(shuō)的(或者說(shuō)樓上引用的)理解略有偏差.

引用"我們上面剛學(xué)習(xí)了JAVA的數(shù)據(jù)類(lèi)型,則有:值類(lèi)型就是按值傳遞的,而引用類(lèi)型是按引用傳遞的"?這句話(huà)很明顯的有兩點(diǎn)錯(cuò)誤.?第一點(diǎn),如果我上面所說(shuō)的,Java是沒(méi)有call?by?reference的.

第二點(diǎn),暫且假設(shè)Java里邊是有call?by?reference的,?這句話(huà)依然不成立.

Java中的變量有兩種類(lèi)型:?primitive?types?和?reference?type.

primitive?type包括byte,?short,?int,?long,?char,?boolean,?float和double.

而這8種之外的所有的,都是reference?type.

下面是一段對(duì)你的貼上來(lái)的code的一點(diǎn)延伸,希望可以幫助你更好的理解Java中的argument?/?parameter到底是如何運(yùn)作的.

public?class?Test?{

public?static?void?main(String[]?args)?{

int?a?=?1;

Koo?koo?=?new?Koo();

Object?o?=?new?Integer(1);

Koo?newKoo?=?new?Koo();

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);

}

static?void?update(int?a)?{

a++;

}

static?void?update(Koo?koo)?{

koo.a++;

}

static?void?update(Object?o)?{

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

}

static?void?newUpdate(Koo?koo)?{

koo?=?new?Koo();

}

}

class?Koo?{

int?a?=?1;

}

/*

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

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

或者干脆

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

*/

以上這些code運(yùn)行之后會(huì)得到1?2?1?2的結(jié)果.?后面兩個(gè)結(jié)果可以很好的說(shuō)明,?即使對(duì)objects?(reference?type?variables)?來(lái)看,?Java所應(yīng)用的也并不是call?by?reference.?否則的話(huà),以上code運(yùn)行結(jié)果應(yīng)該是1?2?2?1

希望你可以真正理解這個(gè)新的例子中,產(chǎn)生1212這個(gè)結(jié)果的原因,從而對(duì)Java中的arguments有一個(gè)系統(tǒng)全面的認(rèn)識(shí).

圖片是相關(guān)資料的鏈接,知道里貌似不能加網(wǎng)址

java代碼分析

求采納

//一個(gè)隨機(jī)數(shù)生成工具

Random?rand?=?new?Random();

//?rand.nextInt()?用工具生成一個(gè)隨機(jī)的整數(shù)

//rand.nextInt()?%?a.length?對(duì)上邊數(shù)組長(zhǎng)度取余?應(yīng)該是對(duì)?52?取余

//任何整數(shù)對(duì)52取余結(jié)果只能是?-51?~?51?之間的一個(gè)整數(shù)

int?index?=?rand.nextInt()?%?a.length;?

//如果得到的這個(gè)整數(shù)小于0?

if(index??0){?

//用0?減去這個(gè)數(shù)即變成其相反數(shù)

index?=??0?-?index;

}

//從數(shù)組a中取對(duì)應(yīng)位置的字符,比如index=2????a[index]?就是?c

return?a[index];

分享題目:java優(yōu)秀代碼賞析 java示例代碼
本文來(lái)源:http://www.muchs.cn/article0/doejcoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)面包屑導(dǎo)航、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、標(biāo)簽優(yōu)化、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)