java puzzler_Java Puzzler学习笔记
原文發(fā)表于網(wǎng)易博客 2008-08-22 21:09:22
1.toString()
一個char型的非空的數(shù)組array和字符串b被用連接符"+"連接起來時,形成的新字符串實際上是array.toString()+b. 一個非空的char型數(shù)組是從Object那里集成的toString方法,返回一個字符串,它包含該對象所屬類的名字,'@'符號,以及表示對象散列碼的一個無符號十六進制整數(shù).而Class.getName的規(guī)范描述到:char[]類型的類對象調(diào)用該方法返回的結(jié)果字符串是"[c".
2. ==
在Java語言中,"=="用來判斷兩個對象引用是否相同,即這兩個對象引用是否正好引用到同一個對象上.
字符連接符號"+"的優(yōu)先級比等號"=="要高.
3.位移與數(shù)值類型
在java中,一個int型的值左移32位結(jié)果并不是0,而是它本身.long型的也一樣.
在移位過程中,java總會保證左移不會被執(zhí)行成右移,或者右移執(zhí)行成左移.例如對以一個int型的數(shù)i,對i執(zhí)行左移n(n也是int類型)位操作時,只使用到n轉(zhuǎn)換成二進制數(shù)字的低5位,并且是當(dāng)作正數(shù)來使用.因此,如果要講i左移-1位,那么實際上是左移了31位.
用一個double或float數(shù)值來表示無窮大是可以的.對于float而言,加1不會產(chǎn)生任何效果的最小級數(shù)是2的25次方,即3355432;對于double而言,,最小級數(shù)是2的54次方,大約是1.8E16.
一般來說,一個基本類型變量i是等于它本身的,不過,有特殊情況存在,即i是一個NaN(Not a Number)時,i是不等于自身的.所以i-i==0產(chǎn)生的結(jié)果是false;
一旦一個計算產(chǎn)生了NaN,它就被損壞了,沒有任何更進一步的計算可以修復(fù)這樣的損壞.
要讓i!=i+0,除了i是NaN以外,還可以是String類型.
>>>=是無符號右移.對于short,byte,char類型的數(shù)據(jù)i來說,i>>=1操作會先將i提升位int類型.執(zhí)行的是有符號擴展.右移1位侯,如果原先是short i=-1;則提升侯的int類型值是0xffffffff,移位后變成0x7fffffff,最后這個值被存回了i,高16位被截去,就剩下oxffff,這樣,又回到了起點,i的值沒有發(fā)生任何變化.因此,我們得出的結(jié)論是:不要在short,byte,char類型的變量上使用符合賦值運算符.
在5.0版本前,Java的數(shù)字比較操作符(,>=)要求他們的兩個操作數(shù)都是原始數(shù)字類型(byte,char,short,int,long,float,double).在5.0版本中又做出了修改:每一個操作數(shù)的類型必須可以轉(zhuǎn)換成原始數(shù)字類型.這樣,被包裝了的數(shù)字類型(Byte,Character,Short,Integer,Long,Float,Double)都可以作為數(shù)字比較運算符的操作數(shù)了.因此要使(i<=j&&j<=i&&i!=j)這個式子的值位false,則可以這樣聲明i和j:Integer i= new Integer(0);Integer j=new Integer(0);注意,當(dāng)用"=="比較兩個非原始數(shù)據(jù)類型的變量時,實際上是看這兩個變量是否引用了相同的對象.
由于整數(shù)是以反碼的形式在內(nèi)存中存儲的,int占32個bit,共有2的32次方個int數(shù),是偶數(shù)個,但是+0和-0只有一種表示方法,因此正整數(shù)和負整數(shù)的個數(shù)是不相等的,負整數(shù)比正整數(shù)多了一個,即Integer.MIN_VALUE,即0x80000000.對這個值求反碼,結(jié)果是0x7fffffff,再加1,得到的還是它本身,因此,Integer.MIN_VALUE的反碼是它本身.所以如果int i=Integer.MAX_VALUE;則i=-i;成立.
4.變量聲明
Java語言規(guī)范不允許一個本地變量聲明語句作為一條語句在for,while或者dowhile循環(huán)中重復(fù)執(zhí)行.因此下面的語句:
for(int i=0;i<=100;i++)
SomeClass class=new SomeClass();
這樣的語句根本就不能編譯通過.一個本地變量聲明作為一條語句只能直接出現(xiàn)在一個語句塊中.(一個語句塊是由一對花括號以及包含這對花括號中的語句和聲明構(gòu)成的.)因此,要解決上面所產(chǎn)生的問題,可以把聲明放進語句塊中,如下:
for(int i=0;i<=100;i++){
SomeClass class=new SomeClass();
}
5.封裝類
String,BigInteger,BigDecimal,Integer,Long,Short,Byte,Character,Boolean,Float,Double這些包裝了的類的實例的值是不可改變的,盡管你可以讓這些實例重新指向另外的類對象.例如String型的s,再其調(diào)用了toUpperCase()方法之后,s的值依然不會發(fā)生改變.調(diào)用函數(shù)只會返回一個臨時的大寫化了的字符串.
6.equals
java語言規(guī)范約定,無論何時,只要你復(fù)寫了類的equals方法,你就必須同時復(fù)寫hashCode方法.hashCode約定要求相等的對象要具有相同的散列碼.從Object繼承而來的equals方法的原型為:public boolean equals(Object o),復(fù)寫equals方法時,一定要遵照Object中方法的原型.如何你自己定義的是public boolean equals(SomeClass class)之類的原型,這就屬于方法重載,而不是方法復(fù)寫.就不會達到想要的效果.再jdk5.0版本之后,可以再要復(fù)寫的方法聲明上添加@override 注釋,例如:@override public Boolean equals(Object o){...} 這樣寫了之后,如果你寫的這個函數(shù)不屬于重寫,編譯就不會通過.
7.數(shù)值不同的進制表示
以0開頭的整形字面常量將被解釋成為八進制數(shù)值.這個隱晦的結(jié)構(gòu)時從C語言遺留下來的.例如int i=012;實際上是把10賦值給了i.
8.日期
Date類將一月表示為0,而Calendar類延續(xù)了這個錯誤.因此,想將一個日歷類Calendar的對象cal設(shè)置為99年12月31日,如果寫成cal.set(1999,12,31),實際上它會產(chǎn)生一個IllegalArgumentException異常.但是不會報錯,而是自動將日期轉(zhuǎn)換為2000年1月31日.而Date的getDay方法返回的是一個表示星期幾的日期,而不是月份日期.相當(dāng)于Calendar的get(Calendar.DAY_OF_WEEK)方法.如果想得到月份日期,可以直接調(diào)用Canlendar的get(Calendar.DAY_OF_MONTH)方法.
9.數(shù)學(xué)函數(shù)
Math.abs(int i)一般都能返回正確的參數(shù)的絕對值,不過,有個以外,如果i的值為Integer.MIN_VALUE,那么這個函數(shù)將會返回它本身.
10.包的約束
一個包內(nèi)的私有方法不能被位于另外一個包中的某個方法直接復(fù)寫.
11.運算符
條件運算符(? : )在java5.0版本以前是非常受限制的,當(dāng)?shù)诙€和第三個操作數(shù)是引用類型時,條件運算符要求它們其中的一個必須是另一個的子類型.而到了5.0版本,條件運算符在第二個和第三個操作數(shù)是引用類型時總是合法的.
名字重用的術(shù)語表
1. 復(fù)寫(override) : 一個實例方法可以復(fù)寫在其超類中可訪問到的具有相同簽名的所有實例方法,從而使得動態(tài)分配成為了可能.VM將基于實例的運行期類型來選擇要調(diào)用的復(fù)寫方法.復(fù)寫是面向?qū)ο缶幊碳夹g(shù)的基礎(chǔ).
2. 隱藏(hide)???? : 一個域,靜態(tài)方法或成員類型可以分別隱藏(hide)在其超類中可以訪問到的具有相同名字(對方法而言就是相同的方法簽名)的所有域,靜態(tài)方法或成員類型.隱藏一個成員將阻止其被繼承.
3. 重載(overload) : 在一個類中重載(overload)一個方法,只要它們具有相同的名字和不同的簽名.
4. 遮蔽(shadow)?? : 一個變量,方法或類型可以分別遮蔽在一個閉合的文本范圍內(nèi)的具有相同名字的所有變量,方法或類型.對于變量來說,類型于全局變量和局部變量的問題.在函數(shù)中,局部變量會遮蔽全局變量.
5. 遮掩(obscure)? : 一個變量可以遮掩(obscure)具有相同名字的一個類型,只要它們都在同一個范圍內(nèi):如果這個名字被用于變量與類型都被許可的范圍,那么它將被引用到變量上.相似地,一個變量或者一個類可以遮掩一個包.遮掩是唯一一種兩個名字位于不同名字空間的名字重用形式,這些名字空間包括:變量,包,方法和類型.如果一個類型或者一個包被遮掩了,那么不能通過其簡單名引用到它,除非是語法只允許在其名字空間中出現(xiàn)一種名字.遵守命名規(guī)范就能極大地消除遮掩的可能性.
總結(jié)
以上是生活随笔為你收集整理的java puzzler_Java Puzzler学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎样开关语句随机数 不重复_怎样
- 下一篇: java if在内存中_全面理解Java