Java基礎[4]對象與類

封裝

  1. 封裝就是將數據和行爲組合在一起,構建一個類即封裝體現。

對象3個特性

  1. 對象行爲:可對對象施加那些方法操作。
  2. 對象狀態:對對象施加那些方法時,對象如何響應(如訂單對象“已付款”,“未付款”狀態)。
  3. 對象標識:辨別具有相同行爲與狀態的不同對象。

類之間的3種關係

  1. 依賴(use-a):如一個類的方法操作另一個類的對象。
  2. 聚合(has-a):如一個訂單Order對象包含多個Item對象。
  3. 繼承(is-a):這個好理解。

Java值引用

  1. Java中,任何對象變量的值都是對存儲在另外一個地方的一個對象的引用。
  2. new操作符返回的值也是一個引用。
  3. 一個對象變量並沒有包含一個對象,而是僅僅引用一個對象。
  4. 所有的Java對象都存儲在堆中,當一個對象包含另一個對象的變量時,這個變量包含着指向另一個堆對象的指針。
  5. java中方法的參數都是按值調用,即方法得到的是所有參數值的一個拷貝,方法不能修改傳遞給它的任何參數變量的內容。
  6. 方法參數有兩種類型:基本數據類型(數字,布爾值);對象引用。
    一個方法不能修改一個基本數據類型的參數;
    但可以改變一個對象參數的狀態;
    一個方法不能讓對象參數引用一個新的對象。

LocalDate

  1. Date類用來表示時間點,LocalDate類用來表示日曆表示法。
  2. 構造LocalDate對象使用LocalDate.now().
  3. 構造指定日期對象使用LocalDatel.of(1999,12,11).
  4. 推薦使用LocalDate類,有很多好用的方法(Java8新特性)。

構造器

  1. 構造器與類同名
  2. 每個類可以有一個以上的構造器
  3. 構造器可以有一個至多個參數
  4. 構造器沒有返回值
  5. 構造器總是伴隨着new操作一起調用
  6. 繼承中,當基類中沒有無參數的構造器時(換句話說,基類中只提供了有參數的構造器),那麼子類也要提供對應的含參數構造器,否則編譯出錯。在子類 的構造器中我們使用super關鍵字,實現對基類的構造器的調用。

隱式參數和顯式參數

  1. 顯式參數:明顯地列在方法聲明中的參數。
  2. 隱式參數:沒有出現在方法聲明中的參數。
    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;
    }
    /*初始化順序:
     * 靜態代碼塊
     * 非靜態代碼塊
     * 構造器
    */
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章