1. 程式人生 > >java基礎拾漏補缺

java基礎拾漏補缺

一、類之間的三種關係:

1. 依賴關係(use-a)

2. 繼承關係(is-a)

3. 聚合關係 (has-a)

二、Java中的方法,得到的總是引數的值拷貝。

1. 對於原始型別來說,引數是最簡單的值拷貝,因而,在方法中對引數的修改無法對傳參的值產生影響。

2. 對於引用型別來說,引數是對引用的一次拷貝。劃重點:值拷貝。

三、Java中的轉型問題。

 

1. 基本型別的轉型(無資料丟失)。

    a. byte -> short -> int -> long

    b. byte -> short -> int -> double

    c. char -> int -> long

    d. char -> int -> double

2. 基本型別的轉換(有資料丟失)

    a. long -> float

    b. int -> float

    c. long -> double

轉換規則: double > float > long > int 。

3. 基本型別的強制轉換。(type) value。一般有資料丟失情況存在。

4. 引用型別的轉換。向上,向下是相對於被操作的引用變數的型別而言的。轉換前是父類型別,轉換後是子類型別,則成為向下轉型,否則成為向上轉型。向上轉型是一個自動的過程。

    a. 向下轉型。將父類型別的引用強制轉換並賦值給子類型別的引用,稱為向下轉型。向下轉型可以獲得子類的方法列表。限制,被向下轉型的子類,必須是目標子類的例項,否則會報錯。

    b. 向上轉型。子類型別的物件被賦值給父類型別的引用變數,稱為向上轉型。向上轉型存在方法的丟失現象。方法列表中只存在父類的方法列表。

    c. 繼承鏈中物件方法的呼叫的優先順序:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)

四、重寫。

     a. 重寫是子類對父類中允許訪問的方法的實現過程進行重寫,其方法名,形參不能改變,返參型別和父類相同或者是父類的返參型別的子類,子類方法的訪問許可權不能小於父類方法的訪問許可權。

五、過載

     a. 過載是在同一個類中,多個方法的方法名相同而引數不同的一種規則。

六、多型和動態繫結。

     a. 多型。

         在java中,一個父類型別的變數,既可以引用一個父類型別的物件,也可以引用一個子類型別的物件,稱之為多型,物件引用變數是多型的。

      b. 動態繫結。

         1.如果被呼叫的方法是private、static或者final方法,則在編譯期間,編譯器就可以準確的直到呼叫了哪個方法,那麼這種方法繫結稱之為靜態繫結。與之相對的是,有些方法的呼叫需要根據其執行時的實際物件來確定,這種繫結稱之為動態繫結。

         2.方法的動態繫結,依照如下規則:

           this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

         3.由於方法動態繫結的原因,每次方法執行時都需要大量的搜尋,因而虛擬機器為每個類都預先生成了一個方法表,以提高效能。

七、自動裝箱和拆箱

        1. 自動裝箱。編譯器自動地將原始型別的值轉換為對應包裝器的物件型別。byte、short、char、int、long、float、double、boolean對應的包裝器類為Byte、Short、Character、Integer、Long、Float、Double和Boolean。

         2. 自動拆箱。編譯器自動的將包裝器的物件型別轉換為原始型別的值。

         3. 注意事項:

                    a. 儘量避免大量的自動裝箱和自動拆箱的情況出現,例如在迴圈中的自動裝箱和自動拆箱,需要生成大量的無用的包裝型別物件。

                    b. 自動裝箱、自動拆箱遇到過載時,首先會試圖呼叫無需自動裝箱拆箱的方法,然後才是需要自動裝箱的方法。

                    c.Integer的快取。對於-128到127之間的數字,Integer對其進行了快取,在自動裝箱的ValueOf方法呼叫的時候,會將快取的Integer物件直接返回給程式,因而,對於-128到127的數字,同時發生了自動裝箱時候,得到的是同一個物件。但是,對於Integer建構函式構造的物件來說,永遠都是不相等的。

                    d. 混亂的使用原始型別和包裝型別,可能造成空指標異常。對於static Integer count;其預設初始換值是null。而static int count的預設初始化值則是0。

                    f. 含有算術運算的過程,會發生自動拆箱操作。

八、可變引數方法

        public void method(String... args)

九、== 和 equals()  方法

 

      1. ==

          1. 比較基本型別的值。

          2. 比較物件在記憶體中的地址是否相同。

       2. equals方法

          1. 一般來說,首先比較兩個物件的記憶體地址是否相同,相同直接返回true。

          2. 對物件的真實值進行比較,如果真實值相同,那麼就返回true,否則返回false。

十、 內部類。

       1.內部類分類。

           a.成員內部類。

           b.靜態內部類。

           c.區域性內部類。

           d.匿名內部類。

        2.成員內部類。

           a.成員內部類可以直接訪問外部的私有方法和屬性。

           b.當成員內部類的屬性和方法與外部類的屬性和方法名字相同時,可以通過Outer.this.name來訪問外部類的屬性或者方法。

           c.成員內部類不能有static的方法和屬性。

           d. 必須先建立外部類,才可以建立內部類。

           c. 外部類可以通過內部類的物件來訪問內部類的私有變數和方法。

      3.區域性內部類。區域性內部類是定義在方法中的內部類。

           a.區域性內部類不能有public或者private等訪問修飾符。

           b.區域性內部類可以訪問final修飾的區域性變數。

      4. 匿名內部類。匿名內部類是直接生成了物件的無名類。

      5. 靜態內部類。

 

a、建立靜態內部類方式:Outer.Inner inner = new Outer.Inner();靜態內部類不依賴於外部類。

b、外部類可通過內部類的物件呼叫內部類的私有成員變數或方法。

c、靜態內部類訪問外部類的靜態成員變數或方法必須是靜態的。

d、靜態內部類中可定義靜態的成員變數和方法。

e、外部類可以建立靜態內部類的例項,即使是私有的;並可通過內部類的例項訪問內部類的成員變數和方法,即使是私有的。

f、單利模式中的靜態內部類模式。

十一、反射。

反射是在執行時訪問類的構造方法,屬性,靜態變數,方法等的能力。在執行時對類的屬性等進行訪問和修改的能力。

1.獲取陣列的型別。obj.getClass().getComponentType()。

2.動態生成陣列。Array.newInstance(Class<?>,length),返參為一個數組例項物件。

3.反射中的一些常用類Array、Field、Method、Constructor、Modifier等。

4.java建立物件的幾種方法:

        a.new關鍵字。

        b.newInstance()方法。

        c.clone()方法。

        d.反序列化。

十二、動態代理。

        1.靜態代理的問題。有多少個需要代理的類,就需要有多少個靜態代理類,這會造成類爆炸。

        2.jdk動態代理。jdk動態代理與java.lang.reflect包內的三個類有關:

              a.InvocationHandler類。

              b.Method類。

              c.Proxy類。

         3.建立一個動態代理的一般步驟:

             a.建立一個InvocationHandle實現類,並實現其invoke方法。

             b.建立被代理的類的物件例項。

             c.通過Proxy類的newProxyInstance()方法例項化一個代理物件。傳參分別為被代理的ClassLoader和Interfaces以及a中handle實現類的例項。

             d.通過Proxy類的例項呼叫被代理類例項的方法,即可實現對被代理類方法的代理。