Java基礎|拆箱裝箱,反射竟然也暗藏玄機?

對象包裝器與自動裝箱

  1. 自動裝箱規範要求 boolean,byte,char<=127。
  2. 介於-128~127之間的short 和 int被包裝到固定對象中,可理解爲如同字符串的常量池一樣存儲,效率高,節省空間。拆箱和裝箱是編譯器認可而不是虛擬機認可。
  3. 示例:
/**
 * @author gao tianci
 * @version $Id: AutoBoxingTest.java, v 0.1 2017年6月4日 下午5:41:32 gao tianci Exp $
 */
public class AutoBoxingTest {
    public static void main(String[] args) {
        Integer integer1 = 127;
        Integer integer2 = 127;
        System.out.println(integer1 == integer2);//true

        Integer integer3 = 128;
        Integer integer4 = 128;
        System.out.println(integer3 == integer4);//false
    }
}

反射

能夠分析類能力的程序稱爲反射。

  1. Class
    運行時系統始終爲所有對象維護一個被稱爲運行時的類型標識。這個信息跟蹤着每個對象所屬的類,保存這些信息的類被稱爲Class.

  1. 獲取Class類型實例的三種方法
    (1)調用對象的getClass()方法獲取,因爲Object類中使用getClass()返回一個Class類型的實例。
    (2)使用Class的靜態方法forName(類名),獲得類名對應的Class對象。
    (3)第三種方法:Class cl = Double[].class。

(4)示例程序

/**
 * @author gao tianci
 * @version $Id: ClassTest.java, v 0.1 2017年6月4日 下午6:20:05 gao tianci Exp $
 */
public class ClassTest {
    public static void main(String[] args) {
        try {
            Person person = new Person();
            Class class1 = person.getClass();
            Class class2 = Class.forName("com.ly.tainci.exercise.Class.Person");
            Class class3 = Person.class;

            Person person1 = (Person) class1.newInstance();
            Person person2 = (Person) class2.newInstance();
            Person person3 = (Person) class3.newInstance();
            System.out.println(person1);
            System.out.println(person2);
            System.out.println(person3);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            System.out.println("獲取Class實例失敗!");
        }
    }
}

  1. 通過反射可以分析類的能力
    在java.lang.reflect包中有三個類Field,Method和Constructor分別描述類的域,方法和構造器。具體使用時在進行詳細的查閱。

繼承的設計技巧##

  1. 將公共操作和域放在超類。
  2. 不要使用受保護的域。
  3. 使用繼承實現“is-a”關係。
  4. 除非所有繼承的方法都有意義,否則不要使用繼承。
  5. 在覆蓋方法時,不要改變預期的行爲。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章