對象包裝器與自動裝箱
- 自動裝箱規範要求 boolean,byte,char<=127。
- 介於-128~127之間的short 和 int被包裝到固定對象中,可理解爲如同字符串的常量池一樣存儲,效率高,節省空間。拆箱和裝箱是編譯器認可而不是虛擬機認可。
- 示例:
/**
* @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
}
}
反射
能夠分析類能力的程序稱爲反射。
- Class
運行時系統始終爲所有對象維護一個被稱爲運行時的類型標識。這個信息跟蹤着每個對象所屬的類,保存這些信息的類被稱爲Class.
- 獲取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實例失敗!");
}
}
}
- 通過反射可以分析類的能力
在java.lang.reflect包中有三個類Field,Method和Constructor分別描述類的域,方法和構造器。具體使用時在進行詳細的查閱。
繼承的設計技巧##
- 將公共操作和域放在超類。
- 不要使用受保護的域。
- 使用繼承實現“is-a”關係。
- 除非所有繼承的方法都有意義,否則不要使用繼承。
- 在覆蓋方法時,不要改變預期的行爲。