考試/基本概念

Java認證之精闢總結

  1.switch裏面只能是short,int,char,byte的. 
  2.if (a="a") 編譯錯, if(a=false)編譯ok,原因是a=false的a代表了個boolean值
  3.這種寫法Outer.Inner i = new Outer().new Inner(); OK!
  4.文件裏, 8 默認是int, 8.0默認是double
  5.八進制是 0開頭,不是O(英文o)
  6.byte -128~127 ,-128是二進制的多少?
  7. -1>>32還是-1, -1>>>32爲什麼還是-1?
  8. char c='c'; String s ="s"; s+=c;結果是 sc!!!
  9. boolean b1=true; boolean b2=true; System.out.println(b1|b2); 結果是true.編譯沒錯!
  10.java的默認import包有哪些?

  
類和對象(Class and Object)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  0.最外層的類可以聲明成final: "$file a":< final class a{}> ok!,但是不能是private和static的.
  1.overload是同類裏同樣的方法名,override是父子的繼承
  2.override的返回結果必須一樣,否則編譯錯哦
The return type of an overriding method is identical to the return type of the method it overrides.
  2.1 override的modifier可以擴大,但是不能縮小.比如父類private void test(){} 子類:public void test(){} ,沒問題;如果反了,就死翹翹了!
  3.super.super(),靠,錯的,沒這麼寫的
  4.static和非static之間永遠無法override!
  5. 看程序
  public class A{
  void test1() throws BaseEx{hi();}
  void hi(){System.out.println("say hi,a");}
  }
  class AA extends A{
  void hi(){System.out.println("say hi,aa");}
  }
  class test{
  static void main(String b[]) throws Exception{
  A a = new AA();
  a.test1();
  }
  }
  結果是,"say hi,aa",這說明什麼?說明,方法永遠跟着類的原來面目走;而,變量恰恰相反!
  6.一個非抽象方法死活也別想override成一個抽象方法
  7.override的子類的方法拋出的的異常只能是父類方法拋出異常的子異常類,或者無!
  8.構造器不能是native,final,static,synchronized的,可以是public,private,什麼都沒有的,呵呵
  9.構造器函數裏還可以寫return呢,但後面什麼都不許有,甚至null(這不是廢話嗎,哈哈)
  10.構造器不能返回值.這大家都知道,但如果有個"構造器"反值了,別緊張,它就不是構造器嘍,只是個普通函數
  11.super();this();這兩個函數只能在構造函數裏調用.
  12,成員變量聲明時候賦值,比構造函數還早.int i=1; ealier than Test(){}
  13.方法的參數變量可以是final.
  14. hashCode返回一個int
  15. void wait() throws InterruptException wait扔InterruptException異常
  16. java.lang.Void 是void的包裝類
  17. Byte,Interger,Double...所有的跟數有關的包裝類都是繼承於Number

  接口Interface)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.接口的所有方法默認都是public,abstract和non-static的
  2.接口的所有變量默認都是public,static,final的.所以,接口的變量不能改值,在它的實現類裏.
  3.接口的實現類實現的方法必須和接口的方法拋出同樣的異常,不許是子類,這和override不一樣!同樣,如果接口方法沒有拋,實現方法也不能拋.
  4.實現類實現的方法必須顯式的聲明成public,什麼都不寫都不行,啊!!!
  5.接口不能聲明成final,要不它怎麼被實現呢(這好像又是廢話啊
  6.一個類實現兩個接口,如果兩個接口有相同的方法,實現類就實現這個方法,沒問題的.

內嵌類Inner Class)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.內嵌類可以訪問outer類的任何變量,包括私有的.
  2.靜態inner類,只能訪問outer類的任何static變量
  2.1內嵌類可以是final,abstract的
  3.**,方法內的內嵌類不能爲static: void test(){ static class A{}} XXXXX!!!!
  4.**,方法內的內嵌類也不能帶任何modifier,void test(){ public class A{}} XXXXX!!!!
  5.**,方法內的內嵌類只能訪問方法內的final變量,但是,可以訪問outer類的任何變量.
  6.匿名類不能有構造器,但聲明時候帶參數,相當於構造器的參數傳遞.
  class ABC{}
  class ABCD{private ABCD(int i){}}
  ABC test3(){return new ABC(){};}
  ABCD test4(){return new ABCD(3){};}
  interface iii{}
  iii test5(){return new iii(){};}
  //class BCD extends ABCD{} compile error,因爲,
  看上面就知道,new iii(){};實際上匿名類實現了iii接口;new ABC(){};實際上是匿名類繼承了ABC.
  8.???
  class A {private A(){System.out.println("a!");}}
  class B extends A{}
  **,沒錯!B實例的時候會主動調用父類A的構造,即使是private的,看來也沒問題!!!
  9.內部類可以有synchronized方法,那麼鎖是這個內部類,跟外部類沒一點關係,內外分別的,在鎖的問題上.
  10.外部類不能通過this被訪問,this這時候應該指的是內部類,享用外部類的成員就直接用,不用加任何限定詞
  11.如何用this呢?請看:
  class Outer{ int i;
  class Inner{
  class InnerInner{
  void Test(){
  Outer.this.i=1;
  }
  }
  }
  }
  看見了吧,類名.this.變量名,可以引用到i,第一次看到吧,嘿嘿,孤陋寡聞.
  12.注意這兩種寫法都可以
  Class Outer.Inner i = new Outer().new Inner();
  或者, Class o= new Outer(); Class Outer.Inner i=o.new Inner();

  線程Thread)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ?????去看Thread的API!!!!
  1.線程啓動必須通過start函數.
  2.run函數不許也只能是public的.
  3.線程有優先級從1到10,通過Thread.setPriority(int);來改變,不能超過10,否則會出現運行異常
  4.線程優先級默認是5,即NORM_PRIORITY.????????NORM_PRIORITY是Thread的靜態變量嗎?
  5.????Thread.yeild();是靜態方法,所以,使用格式是Thread.yield();她強迫當前的進程放棄CUP.
  6.sleep(1000),是說線程睡覺1秒,然後,進入Ready狀態,注意,不是運行狀態,它還要等OS來調度來獲得CUP.

  java.lang.*;
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.數組的科隆: int ia[][]={{1,2},null}; int ib[][]=(int[][])ia.clone();
  2.什麼是NaN?????然後看ceil(NaN),floor(NaN),...
  3.Math.floor(-1.1f);//-2.0
  Math.ceil(-1.1f);//-1.0
  Math.round(-1.6d)//-2
  4.0=  5.Math,Interger,Boolean...等類型包裝類都是final的,不可繼承
  6.int round(float); long round(double);唉,round永遠返回不了小數點
  7.static double ceil(double)
  8.static double floor(double)注意,ceil,floor的只有這個double版本,什麼都轉成double!
  9.static double sin(double 弧度); 還有cos,tan
  10. new String; ?可以是byte[];char[];String;StringBuffer
  11. String的一些函數: int length(); char charAt(int); String toUpperCase(); String toLowerCase();
  12. String("Abc").equals(String("abc"))不相等的,不然就不會有boolean equalsIgnoreCase(String)函數
  13."012345678"是一個串的順序號碼,indexOf('1'),indexOf("1")都返回1,subString(1,5)是2345,嘿嘿:是"[)"的感覺
  14, trim()連tab都退毛,"/t/n java ",trim()一下就只剩下"java"了
  15. 關於對象的科隆,去喳喳API??????????????????????
  16. "abcd".trim(),"abcd" + new String("ef")都是合理的寫法
  17. StringBuffer的3個構造器: ()初始化容量爲16,(int 初始化容量),(String),初始化容量爲串長加上16
  18. StringBuffer的一些函數: String toString(); append();reverse();insert();delete(int start,int end);deleteCharAt(int);setLength(int newLength);
  19. String s=""; StringBuffer sb=new StringBuffer(); if (s==sb){}編譯錯!因爲,s,sb類型不一樣,不能比較
  集合:
  1.各接口和類的關係,只有最後一個是類
  Collection:List:vector,ArrayList,LinkedList
  Map:SortedMap:TreeMap
  Collection:Set:SortedSet:TreeSet
  Map:HashTable
  Collection:Set:HashSet
  
  基礎Base)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.java application的main可以不是public的.但必須是static的
  2.一個文件只能有一個public類,而且還得跟文件名一樣,包括大小寫
  3.變量只能是字母,$,_開頭,接下來的第二個可以是,數字
  4.ch/u0061r='a'; char /u0063='b'; char c='/u0063';都是合法的
  5.1e-5d,合法.e-5d不合法,必須有前面的係數
  6.int[] i[]={null{1,2}}正確! int i[]={1,2,3,} 正確!","和沒有的效果一樣
  7.局部array,跟變量一樣,使用前要初始化
  8.main方法可以爲final
操作符和分配符(Operator and Assignment)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.System.out.printl(1+2+"3");//33 System.out.printl("1"+2+3);//123
  2.int i=0; i=i++;i=i++;i=i++; 結果,i=0!
  3.int i[]; index=0; i[index]=index=5; 結果是,i[0]=5;!!!
  4.byte b=10;可以,因爲,10可以被自動從int轉成byte
  5.接下來,byte b=b+10;不可以!!因爲,10+b後的int無法被自動從int轉成byte,問我,我也不知道爲什麼!靠!
  6.byte b1 = 4; byte b2 = 6; b1 = b1 + b2;錯!編譯錯!b1 + b2後,必須強制轉成byte,b1x1+b2);
  7.XOR 一樣的爲0,不一樣爲1 1,1=0;0,0=0;1,0/0,1=1
  8. x == Float.NaN編譯錯,應該是Float.IsNaN
  9. x == Double.POSITIVE_INFINITY編譯可以
  10.-1是1111.... 1111,<<永遠右補零,>>正補零,負補一,>>>恆補零
  10.1 -1>>多少位都是-1 ; 1<<31變成了最小負數,1000....0000
  11.最大正數是01111....1111
  12.最小負數是1000....0000(-2147483648)
  13. a instanceof b,b必須是類/接口,不能是實例
  
  --------補充------------------------------
  1. byte,short,char 都存在 var = -var;編譯錯誤,因爲,這時候的-var已經自動轉成個int類型了
  2. int/0會扔出ArithmeticException
  double,float/0得INF或者-INF
  0/0得NaN
  3. int a-b-c;是不符合命名規則的變量名????編譯會出錯.
  4. char a='/u0001';對! char b=/u0001;編譯錯!
  5. boolean b1,b2,b3,b4,b5;
  b1 = b2==b3;
  b1 = b2<=b3 && b4==b5;
  b1 = b2==b3==true
  都是對的!
  b1 = b2==b3==b4 XXXXXXX編譯錯!
  6. 1>>1 是0
  7. %= <<= =>> =>>>都是合法符號
  8. --1-10*4 這種寫法沒錯,就是 (--1)-10*4
  9. k=1;++k + k++ + +k ;結果是7,相當於 (++2)+(2++)+(+3)
  10.標號不能標示聲明.
  hi:
  if {
  break hi;
  //break hi1;不行,不能向後調轉
  }
  //hi1:不行,不能放在聲明前
  int i;
  hi1:
  i=1;
  11.public static void main(String s[]) throws Exception{}可以噢,main可以扔出異常
  12. hi:
  if(b==true){break hi;}
  break 標號,可以用在if裏面.別的任何都不行,包括break,continue 標號.
  13.int x = i*-j; **,沒問題的!!!編譯沒錯! int x = i*j++ + +i++; 這個也沒問題,

  變量修飾符(Modifier)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.最外面一層的類不能聲明成protect和pravite的
  2.同一個類的兩個實例之間可以訪問彼此的私有方法和私有變量,酷
  3.protect和無修飾符的具體區別???????關於外包可以訪問被子類訪問的是哪個?
  4.成員變量被修飾成final後,必須聲明時候就賦初值或者在構造器裏面賦初值,別指望她可以得到default值.
  5.抽象方法不能是static的!!!
  6.靜態方法將隨着類的變化而變化,看例子:
  class Parent{
  static void test(){System.out.println("hi,parent")};
  }
  class Child extends Parent{
  static void test(){System.out.println("hi,child")};
  }
  Parent p = new Child();
  p.test(); //打出來的是hi,parent!
  7.靜態方法可以通過類的實例調用.
  new Child().test(); 和 Child.test(); 都OK!
  8.transient只能用在類的成員變量上,不能用在方法裏.
  9.transient變量不能是final和static的
  10.native方法可以是private,abstractd的
流程控制
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.不可到達的語句聲明爲錯:while(false){} ;for(;false{};if(false){}都無法編譯
  2.for(第一部分;的第一部分可以用來聲明或者賦值,但不能兩者都
  3.byte b; switch { case 200: // 200 not in range of byte,因爲200超過b的範圍,將編譯錯誤
  4.帶標籤的continue回達到標籤的位置,從新進入緊接在標籤後面的循環
  5.帶標籤的break會中斷當前循環,並轉移到標籤標示的的循環的末尾

  轉型和上溯(Converting and Casting)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Binary operators convert the smaller(less precise) operand to the type of the larger(more precise) operand.
  All operators will convert things smaller than ints to ints or larger. This includes char 's!
  1.byte,char,short默認轉成int
  2.byte->short->int->long->float->double
char^
  這是默認可以轉型的方向,反了必須要顯式cast! 特別注意:long->float是默認的,別看long64,float32,
還有就是看得出來,char和 byte,short之間無法互相默認轉換
  3.float f=1/3; OK!float f=1.0/3.0;編譯出錯,因爲1.0/3.0結果是double的,噢噢~,錯嘍!!
  4.int i=1; byte b=i;錯!需要顯式cast.
  final i=1; byte b=i;就ok! 我也不知道爲什麼,final就可以.而且,據我實驗只有int和byte的關係這樣,其他不行.
  5.int i[]; Object[] obj=i;錯! Object obj=i;對! 數組只能轉成Object,而不能是Object[]
  6.int i[]; Object[] obj;i=(int[])obj; 對! 對象可以通過顯式來轉成一個數組.

  I/O
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1.File類的一些重要方法:isFile();isDirectory();String[] list();exists();getAbsolutePath();getParent();
  2.通過delete();mkdir();rename(File newname);可以操縱文件,但是卻改變不了文件的內容
  2.1 File類無法改變當前目錄,除非重新創建一個File對象.
  3.InputStreamReader(InputStream in,String encodingName);
  OutputStreamReader(OutputStream in,String encodingName);
  Encoding: 8859_1是Latin-1,包含ASCII
  4.關閉close一個流,就自動調用了flush.
  5.System.in,System.out,System.err,由JVM自動創建
  6.RandomAccessFile(File file,String mode);mode有,r,rw

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章