封裝
- 封裝就是將數據和行爲組合在一起,構建一個類即封裝體現。
對象3個特性
- 對象行爲:可對對象施加那些方法操作。
- 對象狀態:對對象施加那些方法時,對象如何響應(如訂單對象“已付款”,“未付款”狀態)。
- 對象標識:辨別具有相同行爲與狀態的不同對象。
類之間的3種關係
- 依賴(use-a):如一個類的方法操作另一個類的對象。
- 聚合(has-a):如一個訂單Order對象包含多個Item對象。
- 繼承(is-a):這個好理解。
Java值引用
- Java中,任何對象變量的值都是對存儲在另外一個地方的一個對象的引用。
- new操作符返回的值也是一個引用。
- 一個對象變量並沒有包含一個對象,而是僅僅引用一個對象。
- 所有的Java對象都存儲在堆中,當一個對象包含另一個對象的變量時,這個變量包含着指向另一個堆對象的指針。
- java中方法的參數都是按值調用,即方法得到的是所有參數值的一個拷貝,方法不能修改傳遞給它的任何參數變量的內容。
- 方法參數有兩種類型:基本數據類型(數字,布爾值);對象引用。
一個方法不能修改一個基本數據類型的參數;
但可以改變一個對象參數的狀態;
一個方法不能讓對象參數引用一個新的對象。
LocalDate
- Date類用來表示時間點,LocalDate類用來表示日曆表示法。
- 構造LocalDate對象使用LocalDate.now().
- 構造指定日期對象使用LocalDatel.of(1999,12,11).
- 推薦使用LocalDate類,有很多好用的方法(Java8新特性)。
構造器
- 構造器與類同名
- 每個類可以有一個以上的構造器
- 構造器可以有一個至多個參數
- 構造器沒有返回值
- 構造器總是伴隨着new操作一起調用
- 繼承中,當基類中沒有無參數的構造器時(換句話說,基類中只提供了有參數的構造器),那麼子類也要提供對應的含參數構造器,否則編譯出錯。在子類 的構造器中我們使用super關鍵字,實現對基類的構造器的調用。
隱式參數和顯式參數
- 顯式參數:明顯地列在方法聲明中的參數。
- 隱式參數:沒有出現在方法聲明中的參數。
3.public void setName(String name)
{
this.name = name;
}
其中String name,即是顯式參數;關鍵字this表示隱式參數。
私有方法
1. 什麼時候使用私有方法?
- 將一個計算代碼劃分成若干個獨立的輔助方法,它們往往與當前的實現機制聯繫緊密,或者需要一個特別協議以及一個特別的調用次序。考慮把這樣的方法設計成private。
- 方法是私有的,類的設計者可以確信,私有方法不會被外部類操作調用,外部代碼不會依賴它,如果需要將其刪除的時候,對外部代碼並沒有什麼影響。
對象構造
1. 重載
- 多個方法有相同的名字,不同參數,便產生重載。如重載多個構造器。
2. 默認域初始化
- 如果構造器中沒有顯式地給域賦予初值,那麼就會自動地賦予默認值:數值爲0;布爾值爲false;對象引用爲null。
- 方法中的局部變量(即方法中的參數),在使用前必須明確地進行初始化。
3. 無參數構造器
- 編寫一個類時,沒有編寫構造器,系統會提供一個無參數的構造器。這個構造器將所有的實例域設置爲默認值。即數值爲0;布爾值爲false;對象引用爲null。
- 如果類中提供了至少一個構造器,但沒有提供無參數構造器,則在構造對象時,沒有提供參數,就會被視爲不合法。
4. 初始化數據域的3種方法
- 在構造器中設置值
- 在聲明中賦值
- 使用初始化代碼塊賦值
- 示例:
/**
* @author gao tianci
* @version $Id: Employee.java, v 0.1 2017年5月17日 上午10:43:09 gao tianci Exp $
*/
public class Employee implements Serializable {
private static final long serialVersionUID = -8553420538412369570L;
private static int nextId;//被靜態代碼塊初始化
private int id;//被代碼塊初始化
private String name = ""; //聲明中賦值
private double salary;/**實例域的屬性值被初始化爲對應類型的默認值,double是基本數據類型,被初始化爲0*/
//靜態代碼塊
static {
Random generator = new Random();
nextId = generator.nextInt(10000);
System.out.println("static initialization block");
}
//非靜態代碼塊
{
id = nextId;
nextId++;
System.out.println("object initialization block");
}
//構造器
public Employee(String n, double s) {
name = n;
salary = s;
System.out.println("the first overload constructors.");
}
//構造器
public Employee(double s) {
this("Employee #" + nextId, s);//this,調用這個類的對應的另一個構造器
System.out.println("the second overload constructors.");
}
//默認的構造器
public Employee() {
System.out.println("the default constructor.");
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
/*初始化順序:
* 靜態代碼塊
* 非靜態代碼塊
* 構造器
*/
}