對象與類
1. 實現封裝的關鍵在於絕對不能讓類中的方法直接地訪問其他類的實例域,程序僅通過對象的方法與對象數據進行交互。
2. 一個對象變量並沒有實際包含一個對象,而僅僅引用一個對象。在Java中,任何對象變量的值都是對存儲在另外一個地方的一個對象的引用。new操作符的返回值也是一個引用。
3. 有關日期的注意點
//Thu Sep 01 00:00:00 CST 2016
//2016
public static void dateTest() {
//已知年月日,創建相應的Date對象
GregorianCalendar gc = new GregorianCalendar(2016,8,1);//GregorianCalendar 月份爲0-11
Date date = gc.getTime();
System.out.println(date);
//有Date,希望獲得年月日
GregorianCalendar gc2 = new GregorianCalendar();
gc2.setTime(date);
int year = gc2.get(gc2.YEAR);
System.out.println(year);
}
4. 無特殊需求,儘可能不要編寫返回引用可變對象的訪問器方法,可以克隆後返回。
public static void employeeTest() {
Employee employee = new Employee("Hzf",2019,12,28);
System.out.println(employee.toString());
Date date = employee.getDate();
date.setMonth(2);
System.out.println(employee.toString());
}
/*
直接返回引用可變對象
Employee [name=Hzf, date=Sat Dec 28 00:00:00 CST 2019]
Employee [name=Hzf, date=Thu Mar 28 00:00:00 CST 2019]
訪問器克隆後返回或者(date)employee.getDate().clone();
Employee [name=Hzf, date=Sat Dec 28 00:00:00 CST 2019]
Employee [name=Hzf, date=Sat Dec 28 00:00:00 CST 2019]
*/
5. 實例域定義爲final,構建對象時必須初始化這樣的域。即必須確保在每一個構造器執行之後,這個域的值被設置,並且在後面的操作中,不能夠再對它進行修改。final修飾符大都應用於基本類型域或不可變類的域。
PS. 如果類中的每個方法都不會改變其對象,這種類就是不可變的類。
6. 靜態方法是一種不能向對象實施操作的方法,即靜態方法中沒有this參數,不能在靜態方法中訪問實例域,但可以訪問自身類中的靜態域。常常在以下兩種情況使用靜態方法:
- 一個方法不需要訪問對象狀態,其所需參數都是通過顯示參數提供。
- 一個方法只需訪問類的靜態域。
- 工廠模式中使用。
7. Java中方法參數的使用爲按值調用,當參數爲對象引用時,得到的是對象引用的拷貝,故可以改變對象參數的狀態,但無法使其引用一個新的對象。
- 一個方法不能修改基本數據類型的參數(即數值型和布爾型)。
- 一個方法可以改變一個對象參數的狀態。
- 一個方法不能讓對象參數引用一個新的對象。
8. 必須明確地初始化方法中的局部變量。但是,如果沒有初始化類中的域,將會被初始化爲默認值(0、false 或null)。
9. 當一個類的所有構造器都希望把相同的值賦予某個特定的實例域時,可以在類定義中,直接將一個值賦給這個特定的域。這個值不一定都是一樣的,可以是調用方法產生不同的值。
public class Employee {
private String name = "Nicholas";
...
}
//這個值不一定都是一樣的,可以是調用方法產生不同的值。
public class Employee {
private static int id_static;
private int id = getId();
private static int getId(){
int r = id_static;
id_static++;
return r;
}
...
}
10. 在一個構造器中調用另一個構造器
public class Employee {
public Employee() {
//該語句必須是構造器的第一條語句,它將在一個構造器中調用另一個構造器
//採用這個方式使用this關鍵字,對公共的構造器代碼僅需編寫一次
this("Nicholas",5);
}
public Employee(String name,int age) {
this.name = name ;
this.age = age;
}
...
}
11. 初始化塊。在一個類的聲明中,可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。
12. 調用了構造器,具體的處理步驟爲:
1)所有數據域被初始化爲默認值(0、false或null)。
2)按照在類聲明中出現的次序,依次執行所有域初始化語句和初始化塊。
3)如果構造器第一行調用了第二個構造器,則執行第二個構造器主體。
4)執行這個構造器的主體。
13. import 語句不僅可以導入類,還增加了導入靜態方法和靜態域的功能。
14. 類的設計技巧
- 保證數據私有
- 對數據初始化
- 不再類中使用過多基本類型(用其他類代替多個相關的基本類型的使用)
- 不是所有域都需要獨立的域訪問器和域修改器
- 分解職責過多的類
- 類名和方法名要見名知意
學習整理自《Java 核心技術 卷一 基礎知識》