2012年1月11日

[Java]Java類別介紹與方法的開發使用_20111226

類別
修飾子 class className{
}
類別好比建立物件的藍圖,每次在建立物件時只要照著藍圖即可生產
一個類別可以建立多個物件
這就像是蓋房子的藍圖一樣,藍圖只需要一張,但可以建造好幾棟一模一樣的房子
※修飾子 在此僅有public final abstract



main方法
public static void main(String[] args) {
}

Java這麼多類別裡只要有這樣main方法,就是可執行的應用程式類別
JVM會從這個方法開始執行

public static void 這三個都是修飾子,修飾子沒有先後順序的問題
所以也可以寫成
public void static main(String[] xyz) {}
static public void main(String[] abc) {}

以下做一小段範例
由A做為程式進入點,執行A時會建立B物件
//A.java
public class A {
    public static void main(String[] xyz) {


        B x = new B();
        System.out.println(x.name);


    }
}


//B.java
public class B {
    public String name = 'Dodo';
}

C:\>javac A.java 
C:\>java A
Dodo
很有趣的,雖然我們只有執行類別A,但會出現A.class和B.class




之前我們說過成員變數與區域變數的差別
那麼猜猜下面這段範例是否可執行?
public class Demo {


  public int x;


  public static void main(String[] args) {
      System.out.println(x);
  }


}
x是成員變數,使用前不用先給值所以沒問題
但還記得成員變數是在「物件建立」時才產生的嗎!?
所以Demo必須先new起來後x才會被存放在HEAP Memory,因此這裡編譯時就失敗了!
再來一段範例猜猜是否可以執行?

public class Demo {


  public static void main(String[] args) {
      int j = 0;
      int i;
      if (j == 0) {
          i = 1;
      } else if (j != 0) {
          i = 2;
      }
      System.out.println(i);
  }


}

雖然此段看起來在使用i這區域變數時好似有給值,但Compiler沒有執行程式
它的作用是檢查程式是否有出錯
從電腦程式角度去看,if不一定會被執行,既然不一定執行那後面又一定要用到i變數
所以編譯依然失敗

方法
                                                            |-------------------簽名-----------------|
修飾子(modifier)  回傳型態(return_type)  方法名稱(methodName) (  [參數]  )  {             }
|--------------------------------------------- 宣告 ------------------------------------|                    |----本體----|
[參數]可省略
1. public void sayHello (){
        System.out.println("Hi~");
    }
2. public void sayHello(String name){
        System.out.println("Hi " + name);
    }
3. public String sayHello(String name){
        String hello = "Hi " + name;
        return hello;
    }
第一個最簡易的方法,呼叫時不需要帶任何值亦不會回傳值
第二個方法呼叫時需帶name的字串輸入,但不會有回傳值
第三個方法呼叫時需帶name的字串輸入,會有一個字串的回傳
※void本身就是一種資料型態,但它本身只存在宣告上,即表示沒有回傳的資料

重載方法Overloading Method
以上三個方法名字相同都叫sayHello,但可以放在同一個類別下!
辨識它的不同就是「簽名」必須不一樣
所以第二和第三兩個簽名方式為:sayHello(String name)
一模一樣,就不能放在同一個類別下!這種方法名稱一樣但簽名不同的方式就叫重載
public class Demo {


  public void sayHello (){
  }


  public void sayHello (String name, int idnumber){
  }


  public void sayHello (int idnumber, String name){
  }


}
以上三種方式的簽名(參數主要是以型態做分別)都不一樣,但是是可執行的
這種方式常用在例如轉型int(x),即x會變成int資料型態
但它原來是那一種型態?因此使用重載就不需要刻意知道它是由什麼型態轉來

沒有留言:

張貼留言