Java SE 學習---物件導向程式設計

afeiluo發表於2014-07-24
  • 編譯多個原始檔
我們習慣在每一個原始檔中放入一個類,例如將A類放入A.java中,ATest類放入ATest.java中。如果我們這樣組織類和原始檔,我麼有兩種編譯源程式的方法
  1. 使用萬用字元呼叫Java編譯器:javac A+.java 這樣與萬用字元匹配的原始檔都將被編譯成類檔案
  2. 如果ATest.java使用了A.java,可以使用如下命令 :Javac ATest.java
對於第二種方式Java編譯器發現看到ATest.java中使用了A類時,就會查詢名稱為A.class的檔案,如果沒有找到這個檔案就會自動的搜尋A.java,然後對他進行編譯,更重要的是:如果A.java版本較已有的A.class檔案版本新,Java編譯器會自動重新的編譯這個檔案。
  • 隱式引數和顯示引數
在Java中使用方法時一般會向方法傳遞兩類引數,隱式引數和顯示引數,例如有類 Employee如下:
public class Employee{
private double salary;
...
public void raiseSalary(double byPercent){
   double raise=salary*byPercent/100;
   salary+=raise;
  }

}

...
Employee employee=new Employee();
employee.raiseSalary(5);
...
在使用employee.raiseSalary(5)時,向raiseSalary方法傳遞了兩個引數第一個隱式引數出現在方法名謙的Employee物件,第二個引數為了方法名後面括號中的數值,這時顯示引數,在每一個方法中檔案自this表示隱式引數,例如,我們可以講raiseSalary方法改寫如下:
...
public void raiseSalary(double byPercent){
   double raise=this.salary*byPercent/100;
   this.salary+=raise;
}
...
通過這種方式能夠將例項域和區域性變數區分開來

  • 同一個類中方法的訪問許可權
我們都知道,類中的方法可以訪問該類中的所有私有資料,同時這個方法還可以訪問屬於這個類的所有物件的私有資料!!!!!!例如我們可以像如下定義Employee類的equals方法:
public class Employee{
private String name;
...
public boolean equals(Employee other){
      return name.equals(other.name);
  }
...
}
可以這樣來呼叫:
...
Employee A=new Employee("A");
Employee B=new Employee("B");
A.equals(B);
...
之所以可以這樣使用是因為 一個類的方法可以訪問該類的任何一個物件的私有域

  • final 和 static
        如果將類中的域定義為final,那麼構建這個類的物件時必須初始化這樣的域,即是:必須確保在這個類的構造器執行了之後,這個域的值被設定,且在後面的針對該物件的操作中不能對他進行修改。
       
       如果將類中的某一個域定義static ,那麼該類的所有的例項將共享這個域的資料,不會單獨開闢一塊空間來儲存這個域的資料。例如可以通過如下的方式來為Employee類設定其編號:
class Employee{
...
private int id;
private static int nextId=1;
...
public void setId(){
       id=nextId;
       nextId++;
  }

}
當一個應用中有多個Employee的例項的時候,需要為這些例項設定id時,只需呼叫其setId方法即可,這時因為netxId是一個靜態域,它是多個Emloyess物件所共享的,每setId一次後都會對nextId進行+1的操作,這樣每一個Employee物件都能獲得正確的編號。
  
        靜態方法時不能像物件實施操作的方法,即,這類方法時沒有隱式的引數的,因此靜態方法不能操作物件,不能再靜態方法中訪問例項域,但是可以訪問類中的靜態域。例如:
...
private static int nextId=1;
...

public static int getNextId(){
    return nextId;//靜態方法訪問類的靜態域
}
在以下兩種情況下使用靜態方法:
  1. 該方法不需要訪問物件狀態,該方法的所有引數都是通過顯示引數提供的(例如Math.pow).
  2. 該訪問只需要訪問類的靜態域。
  • 域的初始化以及建構函式
在一般的類的設計中域是在建構函式中進行初始化的,如果在構造器中沒有顯示的給域賦予初值,它就會被自動的賦值:數值為0,布林值為false,物件引用為null.區別於C++不能再申明域時顯示的指定域的值,Java卻可以這樣做,如果給域顯示的賦予了值,那麼當例項化物件時會在執行構造器之前執行賦值。當
類中沒有沒有自定義建構函式時,系統會提供一個預設的構造器。同樣一個類中也可以過載多個構造器,Java的函式簽名是通過函式的引數個數以及引數的型別來確定的,當類中自定義了建構函式時候就不能使用預設的無參構造器來例項化物件。除了在建構函式中初始化資料域和在域宣告時直接初始化之外還可以通過初始化塊來初始化域,例項化物件時,首先執行初始化塊,然後在執行構造器的主題部分。綜上所述當呼叫構造器例項化物件時的處理步驟為:
  1. 所有資料域被初始化為預設值(0,false,或null)。
  2. 按照在類宣告中剛出現的次序一次執行所有域初始化語句(域宣告時直接初始化)和初始化塊
  3. 如果構造器第一行呼叫了第二個構造器,則執行第二個構造器主體。
  4. 執行這個構造器的主體。
關於對於靜態域的初始化,如果沒有顯示的對靜態域進行初始化,那麼與例項域一樣,靜態域的預設初始值是0,false或null,也可以通過在宣告時直接提供初始化值或者是使用一個靜態的初始化塊來對靜態域進行初始化,例項化物件時所有的靜態初始化語句以及靜態初始化塊都將按照類定義中出現的順序執行。


相關文章