Java語言知識點

1.數據類型

    整型:(Short)( 2 個字節 ) 、整數 (Int)( 4 個字節 ) 與長整數 (Long)( 8 個字節 )

   浮點數: 單精度浮點數 (Float)( 4 個字節 ) 與雙精度浮點數 (Double)( 8 個字節 , 帶小數點的數字默認是double型)

    字符: Java 的字符采用 Unicode 編碼, 每個字符數據類型佔 2 個字節,可存儲的字符範圍從 /u0000 /uFFFF 一箇中文字與一個英文字母在 Java 中同樣都是用一個字符來表示。

    布爾:佔內存 1 個字節,可存儲 True False 兩個數值

 

移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:
(1)<< : (left-shift), 最低位補0
(2)>> : (signed right-shift), 右移過程使用符號位擴展(sign extension),即如果符號爲爲1則高位補1, 是0則補0,也就是邏輯右移
(3)>>> : (unsigned right-shit),右移過程使用零擴展(zero extension),即最高位一律補0,也就是算術右移
(4) 移位操作的數據類型可以是byte, char, short, int, long型,但是對byte, char, short進行操作時會先把它們變成一個int型,最後得到一個int型的結果,對long型操作時得到一個long型結果,不可以對boolean型進 行操作。
(5)移位操作符可以和=合併起來,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示將a右移兩位後的值重新賦給a。

 

 

2. overload和override的區別
override(重寫)
   (1)、方法名、參數、返回值相同。    (2)、子類方法不能縮小父類方法的訪問權限。  (3)、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。
overload(重載)
   (1)、參數類型、個數、順序至少有一個不相同。 (2)、不能重載只有返回值不同的方法名。(3)、存在於父類和子類、同類中。

   * 設兩個父子類Parent  Child

 overload方法: fun(Parent p)    fun(Child c)

 在主程序中:

    a) Parent p=new Child();

         fun(p)  是調用fun(Parent p)方法

    b) Child p =new Child();

         fun(p)  是調用fun(Child c)方法. 如果無fun(Child c),則會調用fun(Parent p)方法

 

  * 再加兩個父子類Upper,Lower

    Upper upper=new Lower();

    Child p=new Child();

    則調用upper.fun(p)時,系統首先尋找順序爲:Lower類中的fun(Child c) --> Upper類中的fun(Child c) --> Lower類中的fun(Parent p) --> Upper類中的fun(Parent p)

 

    * 上例中如果第二句爲Parent p=new Child();則尋找的順序:Lower類中的fun(Parent p) --> Upper類中的fun(Parent p)

 

  *總結:子對象在override和overload中可以代替父對象。但override優先選擇new對象類型中的方法, overload優先選擇指針的定義的類型。

 

    屬性是不會override的。故Parent和Child都有public int i;時,當Parent p =new Child()時,p.i是指Parnet類中的i

    在方法中使用屬性是優先使用本實例中的屬性,如果沒有,則尋找父類中的屬性。

 

2. try catch後面接finally{},如果在try{ return },返回後仍然會執行finally{}語句。再接下來執行調用此函數的下一句。

 

 

 

3.異常
Throwable
  +-- Exception
  +     +-- RuntimeException  (如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理)
  +     +--checked exception( 除RE的異常)  如IOException、SQLException等以及用戶自定義的Exception異常,必須要處理
  +-- Error(可不處理,因爲這表示java運行環境中的內部錯誤或者硬件問題,比如,內存資源不足等)

 

 

4.hashcode()與equals()
java.lnag.Object中對hashCode的約定:
   1. 在一個應用程序執行期間,如果一個對象的equals方法做比較所用到的信息沒有被修改的話,則對該對象調用hashCode方法多次,它必須始終如一地返回同一個整數。
   2. 如果兩個對象根據equals(Object o)方法是相等的,則調用這兩個對象中任一對象的hashCode方法必須產生相同的整數結果。
   3. 如果兩個對象根據equals(Object o)方法是不相等的,則調用這兩個對象中任一個對象的hashCode方法,不要求產生不同的整數結果。但如果能不同,則可能提高散列表的性能。
不改寫hashCode導致使用hashMap不能出現預期結果.

 

4.子父類對象創建時代碼順序

  父對象: arrtibute=value;  (1)  分配內存

             {  }  (2)

             construction(){}  (3)

  子對象: attribute=value;   (4)

              {  }  (5)

             construction(){}  (6) 

 

5.性能(1>2)

   1.1 synchronized(this) {

                  for()  { ...  }

        }

   1.2  for(){

                  synchronized(this) { ... }

          }

   2.1  try{

             synchronized(this)  {  ... }

          }catch{  ...}

 

   2.2 synchronized(this){

             try{...} catch{...}

         }

 

 

5.內部類

    1)成員內部類

public class OuterClass{                                              //外部類

     private class InnerClass{                                   //內部類

            //...

    }

}

  * 外部使用方法:

OuterClass outerClass=new OuterClass ();

InnerClass innerClass= outerClass .new InnerClass ();

  * 不能在成員類中定義static字段、方法和類(static final形式的常量定義除外)如果方法和變量要成爲靜態,內部類必須被聲明爲靜態。

   * 成員類內部獲得其所屬外部類實例呢:OuterClass.this

   * 成員類能訪問它的外部類實例的任意字段與方法。方便一個類對外提供一個公共接口的實現。

       以JDK Collection類庫爲例,每種Collection類必須提供一個與其對應的Iterator實現以便客戶端能以統一的方式遍歷任一 Collection實例。每種Collection類的Iterator實現就被定義爲該Collection類的成員類。例如JDK中 AbstractList類的代碼片斷:
public  abstract  class  AbstractList < E >  extends  AbstractCollection < E >  implements  List < E >  {
    
private  class  Itr  implements  Iterator < E >  {
         ………;
    }

     
public  Iterator < E >  iterator() {
        
return  new  Itr();
     }
}
    試想,如果沒有成員類機制,只有在AbastractList源碼之外定義一個實現Iterator的類Itr,該類有一個AbstractList實例 成員list,爲了Itr能獲取list的內部信息以便實現遍歷,AbstractList必然要向Itr開放額外的訪問接口。

 

  2)靜態內部類

 引用方法: OuterClass.InnerClass, 其它和外部類一樣。

B爲A的輔助類,且只爲A所用時,可將B定義爲A的靜態成員類。例如JDK中的LinkedList類就有Entry靜態成員類:

public  class  LinkedList < E >  extends  AbstractSequentialList < E >  
   …;
   
private  static  class  Entry < E >  {
    E element;
    Entry
< E >  next;
    Entry
< E >  previous;

    Entry(E element, Entry
< E >  next, Entry < E >  previous) {
        
this .element  =  element;
        
this .next  =  next;
        
this .previous  =  previous;
    }
    }
    …;
}

  

    3) 匿名內部類

        new ClassName(){
...//內部類體
};

    內部類體可override這個類的方法

 

   4)局部內部類

public class OuterClass {

public OutInterface doit(final String x) {                                     //doit()方法參數爲final類型

           class InnerClass implements OutInterface {              //在doit()方法中定義一個內部類

                    InnerClass(String s) {

                             s = x;

                             System.out.println(s);

                    }

           }

           return new InnerClass("doit");

}

}

 

 

 

 

6.reflection

    (1)      java xxx.class--->尋找JRE/bin/clinet目錄中jvm.dll--->啓動JVM

           BootstrapLoader (由C編寫,搜索sun.boot.class.path路徑下的class文件,默認爲JRE/classes)      

          ExtClassLoader 

          Extended Loader(,由java編寫,搜索java.ext.dirs中指定的類,默認是JRE/lib/ext/classes目錄下的class文件 或 lib/ext目錄下的jar文件)

          AppClassLoader

         System Loader(, java.class.path中指定的位置的類,也就是classpath所指定的路徑

 

   每個類加載器會先將加載類的任務交給其parent,如果parent找不到,再由自己找。

     bootstrapLoader<----getParent()----ExtClassLoader<------getParent()--------AppClassLoader <-----getClassLoader()-----SomeClass<------getClass()-------Someclass實例

 

  (2)生成實例

     1)Class c=Class.forName("包名.類名"); /相當於Class.forName("包名.類名",true, loader); 執行static初始化代碼

     2) Class c=Class.forName("包名.類名",false, loader); //jdk1.4前未執行static初始化代碼,不過靜態變量還是初始化

     3) ClassLoader loader=main.class.getClassLoader(); //如果是實例,可用this.getClass().getClassLoader(), 還可用Thread.currentThread().getClass().getClassLoader();
         Class c=loader.loadClass("包名.類名");

    * 然後爲c.newInstance();生成實例

 

    (3)

    自定義ClassLoader類裝載,鼓勵用 ClassLoader 的子類重寫 findClass(String) ,而不是重載Class loadClass(string)方法。重載Class findClass(String name)

       byte[] bytes = 從name類名中取得字節流;
       Class theClass = defineClass(name, bytes, 0, bytes.length);

   (4) 方法

    

 

 

7性能
    1) java的一些類中,比如是集合類,會默認分配其空間大小,如果編程時能預知其大小,可在創建其對象時指定創建時分配的大小。

    2) StringBuilder

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