隨筆-4  評(píng)論-4  文章-1  trackbacks-0

          1.關(guān)鍵字和保留字:
          abstract   boolean  break  byte  case  catch char  class  const  continue  default  do double   else extends  final   finally  float  for goto  if  implements  import  instanceof int  interface  long   native   new  package  private   protected public  return short static
          stricfp  super   switch synchronized  this throw enum throws transient  try void volatile  while assert
          其中很容易搞混或忽略的是:null、true、false、volatile、native、stricftp、assert、enum、synchronized 、transient、goto(保留字)、const(保留字)
          native:指出方法是與平臺(tái)相關(guān)的語(yǔ)言(如C)編寫的
          stricftp:用在方法或類的前面,指出在所有表達(dá)式中的浮點(diǎn)數(shù)將尊守嚴(yán)格的FP限制規(guī)定
          synchronized:指出方法只能同時(shí)被一個(gè)線程訪問(wèn)  
          transient:防止字段被永遠(yuǎn)串行化。當(dāng)串行化對(duì)象時(shí),總是跳過(guò)transient字段
          volatile:指出變量可能改變,失去同步,因?yàn)樗挥迷诙鄠€(gè)線程中。
          注意:
          (1)在java語(yǔ)言中,英文字母大小寫敏感。所以要注意所有的關(guān)鍵字與保留字都是小寫的,null是關(guān)鍵字,但NULL不是關(guān)鍵字;
          (2)注意true與false在java中也是關(guān)鍵字;
          (3)const:不要用于聲明常量,請(qǐng)使用public static finalgoto:在java語(yǔ)言中作為保留字,沒(méi)有使用,因?yàn)檫@個(gè)語(yǔ)句被認(rèn)為是有害的.
          (4)注意SIZEOF\Friend不是java中的關(guān)鍵字,不要跟C++搞混。

          2.變量命名規(guī)則:每個(gè)變量的第一個(gè)字符必須是字母、美元符號(hào)或下劃線;特殊符號(hào)只能用$,其它特殊字符中有特殊用途的不能出現(xiàn)在字母中,如:+,-,/,*,@,%,^,&,~,#等。以下是正確命名:Java, _java, $java, my_java,java2.以下是錯(cuò)誤命名:2java,@java,oh!,%java,java#,#java,^java, my-java,my=java等。

          3.整數(shù)類型:聯(lián)想8421碼就可以記住了。

          byte

          8-bit

                  -128    ~

          +127

          Byte

          short

          16-bit

                 -215      ~

          +215 – 1

          Short

          int

          32-bit

                 -231     ~

          +231 – 1

          Integer

          long

          64-bit

                 -263    ~

          +263 – 1

          Long

          值得注意的是八進(jìn)制中不可用8和9兩個(gè)數(shù)字,如果用了,編譯將出錯(cuò),如:018,程序在編譯時(shí)就會(huì)出現(xiàn)“interger number too large"。所以沒(méi)事就不要打葷,在整數(shù)前面亂加0。

          4.在表達(dá)式中放大類型轉(zhuǎn)換是屬于自動(dòng)類型轉(zhuǎn)換,而縮小類型轉(zhuǎn)換是強(qiáng)制類型轉(zhuǎn)換,但存在數(shù)據(jù)丟失的危險(xiǎn)。道理很簡(jiǎn)單,小水杯中的水倒進(jìn)大水杯中肯定沒(méi)有任何安全問(wèn)題,相反,大水杯的水倒進(jìn)小水杯存在裝不了所有的水的危險(xiǎn)。所以:byte->short->int->short->float->double 這樣的順序是屬于放大且自動(dòng)類型轉(zhuǎn)換,而反過(guò)來(lái)就是縮小且需要強(qiáng)制類型轉(zhuǎn)換。一般的數(shù)據(jù)類型轉(zhuǎn)換中要注意的:char也可以放大且自動(dòng)類型轉(zhuǎn)換成int;boolean數(shù)據(jù)類型無(wú)法轉(zhuǎn)換成其他幾各數(shù)據(jù)類型,而其他數(shù)據(jù)類型也無(wú)法轉(zhuǎn)換成boolean數(shù)據(jù)類型,切記!!
          注意:float f = 1.0; //報(bào)錯(cuò),1.0默認(rèn)是double,縮小類型需要強(qiáng)制轉(zhuǎn)換,可改成float f = (float)1.0或float f = 1.0f; float f = 12;//正確,放大類型,int自動(dòng)轉(zhuǎn)換為float.
          對(duì)于整數(shù)來(lái)講,通過(guò)算術(shù)表達(dá)式計(jì)算完的結(jié)果只會(huì)變成int類型!!Why ?因?yàn)榕逻\(yùn)算后的結(jié)果會(huì)超出原來(lái)數(shù)據(jù)類型的范圍??!
          經(jīng)典的面試題:
          short s1 = 1; s1 = s1 + 1;有什么錯(cuò)? short s1 = 1; s1 += 1;有什么錯(cuò)
          ?
          short s1 = 1; s1 = s1 + 1;
          s1+1 運(yùn)算結(jié)果是 int 型,需要強(qiáng)制轉(zhuǎn)換類型)

          short s1 = 1; s1 += 1;
          (可以正確編譯)

          5.位運(yùn)算符中:&,|,^,~,前三個(gè)可以兩邊都是數(shù)字或boolean,~不可為boolean,只能是數(shù)字: ~ aInt= -aInt - 1;int a 左移n位(放大)等價(jià)于a*2^n,右移n位(縮?。┑葍r(jià)于a/2^n.

          6.swtch-case  只能接收byte、short、int和char類型變量的判斷,注意不可使用long類型,網(wǎng)上很多人都把long類型算進(jìn)去,這是不對(duì)的,使用long類型編譯時(shí)會(huì)有報(bào)錯(cuò),至于為什么不可是long呢?(我現(xiàn)在也想不通,你有什么看法,請(qǐng)告知,謝謝!)除了這四個(gè)之外,其它的類型都不可用switch表達(dá)式中,簡(jiǎn)言之,只有能夠自動(dòng)轉(zhuǎn)換成int類型的數(shù)據(jù)類型才行。注意,單個(gè)case后面如果沒(méi)有break的話,程序會(huì)往下執(zhí)行一直遇到break跳出switch.

          7.聲明一個(gè)數(shù)組的正確形式:int i[][] ; int[][] i; int[] i[];聲明當(dāng)中不可確定具體的數(shù)組個(gè)數(shù)。如以下聲明是錯(cuò)誤的形式:int i[3][]; int[3] i;int i[3][3]

          8.定義一個(gè)數(shù)組后,數(shù)組會(huì)自動(dòng)初始化為相應(yīng)的類型初始值,int[] a = new int[5];
          a[3] = 0; char[] c = new char[5];c[3] = '\u0000'(終端輸出時(shí)是空白行)。類中方法級(jí)的變量必須先初始化。不然不可以使用,哪怕是Sytem.out.println(string)這樣的方法。但數(shù)組除外,在方法級(jí)中可以直接使用,因?yàn)镴VM會(huì)自動(dòng)先初始化數(shù)組,所以是安全的。說(shuō)到這,涉及到初始化的問(wèn)題:
          e.g.
          public class Test {
              String s2;
              static String s3;
              public Test() {
                  System.out.println(s2); //正確,類中屬性會(huì)自動(dòng)初始化為null
              }

              public static void main(String[] args) {
                  String s1;
                  System.out.println(s1); //編譯錯(cuò)誤,s1未初始化。

                  char[] c = new char[5];
                  System.out.println(c[3]);//正確,數(shù)組已先初始化

                  System.out.println(s3);//正確,靜態(tài)String類型初始化為null 
                  System.out.println(s2); //編譯錯(cuò)誤,靜態(tài)方法不可調(diào)用非靜態(tài)屬性
              }
          }

          9.調(diào)用equals()方法時(shí)要注意的地方:如果自定義類時(shí)沒(méi)有overide Object里面的方法equals()那么調(diào)用equal()時(shí)將默認(rèn)調(diào)用 Object里面的equals().同樣,這跟hasCode()和toString()方法也有類似的情況。
          e.g.
          (1)沒(méi)有改寫equals()方法時(shí):
          public class Test {
              int i;
              public static void main(String[] args) {
                  Test t1 = new Test();
                  Test t2 = new Test();
                  t1.i = t2.i= 100;
                  System.out.println(t1.equals(t2)); //輸出false
              }
          }
          (2)改寫equals()方法后:
          public class Test {
              int i;
              public boolean equals(Object obj) {
                  Test aInt = (Test)obj;
                  return this.i == aInt.i;
              }
              public static void main(String[] args) {
                  Test t1 = new Test();
                  Test t2 = new Test();
                  t1.i = t2.i= 100;
                  System.out.println(t1.equals(t2)); //輸出true
              }
          }
          這是為什么呢?難道Ojbect里面的方法equals()就沒(méi)有實(shí)現(xiàn)比較功能嗎?我們可以用JDK源代碼里看看Object里的equals()是怎樣寫的:   
          public boolean equals(Object obj) {
           return (this == obj); 
          }
          // 注意這里是比較是否同一個(gè)引用!上例中由于t1和t2不是同一個(gè)引用,所以就會(huì)返回false了。但如果不是自定義類,而是一個(gè)封裝類,比如Integer類里面是實(shí)現(xiàn)了equals()方法了的,那么如果對(duì)象中的值若相等的話,用equal()方法比較就會(huì)相等。
          e.g
          public class Test {
              public static void main(String[] args) {
                  Integer aInt = new Integer(100);
                  Integer bInt = new Integer(100);
                  System.out.println(aInt.equals(bInt)); //true
              }
          }
          why? 看看Interger類的源代碼就清楚了:
          public boolean equals(Object obj) {
                  if (obj instanceof Integer) {
                      return value == ((Integer)obj).intValue();
                  }
                  return false;
          }
          這個(gè)問(wèn)題對(duì)于初學(xué)者是最容易搞混的。建議看到類似的程序看看JDK的源代碼,我覺(jué)得,這時(shí)看源代碼反而比看幫助文檔來(lái)得更直接了當(dāng),也更容易明白個(gè)中源由。

          .......待續(xù)

          posted on 2007-03-24 15:50 心中海 閱讀(633) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 武定县| 景东| 潮州市| 介休市| 花莲市| 湟源县| 通许县| 德令哈市| 宜阳县| 康定县| 建昌县| 株洲县| 会宁县| 东宁县| 颍上县| 黄冈市| 什邡市| 会泽县| 信宜市| 高州市| 峡江县| 广宗县| 宕昌县| 册亨县| 民县| 塔河县| 土默特右旗| 海林市| 图木舒克市| 年辖:市辖区| 上思县| 阳城县| 岳池县| 孝义市| 鄂州市| 大名县| 武夷山市| 三台县| 商南县| 石河子市| 阿巴嘎旗|