2015年7月5日 星期日

12 方法(1)

12   方法(1)
方法(Method)
在類別裡除了「欄位(變數)」宣告之外,就是「方法」了,方法可分為主方法和一般方法。
主方法為程式執行起點,每一個被執行的程式檔必須包含一個且僅有一個主方法。主方法的名稱固定為main。含主分法之類別稱為主類別,主類別可不經建立物件直接執行。

格式:
public static void main (String[] args){
   欄位宣告
   運算及操作
}
[說明]
底線部分格式須為固定。
static:主方法一律宣告為靜態方法
void:無回傳值
main:主方法名稱
String[]:宣告命令列輸入參數為字串型別陣列
args:陣列名稱
*欄位(資料、變數)可宣告於方法之內、外,其區別另闢專章討論。

[方法宣告範例:主方法]
class Score1 {
  public static void main(String[ ] args) {
    int chChi = 75 ;  //欄位宣告
    int chEng = 63 ;  //欄位宣告
    int chPro = 50 ;  //欄位宣告
    int totScore ;    //欄位宣告
    totScore = chChi + chEng + chPro ;  //運算
    System.out.println ("張曉的總分數=" + totScore ) ;  //操作
  }
}
執行結果:C:\js>java Score1
張曉的總分數=188



相對於主方法,一般方法名稱可自訂。包含一般方法的類別稱為一般類別,一般類別不可單獨執行,必須以主類別的主方法建立物件後,才可進行操作。

格式:
[存取修飾詞] [static] [資料型別 | void] 方法名稱 ([資料型別 變數名稱 , ...]){
   欄位宣告
   運算及操作
}
[說明]
存取修飾詞:存取權限宣告,後續章節說明
static:宣告為靜態方法,後續章節說明
資料型別/void:回傳值之資料型別(return回傳)/無回傳值(可省略return)
方法名稱:一般方法名稱
資料型別/變數名稱:帶入方法之參數的資料型別/名稱

[方法宣告範例:一般方法]
class ABC {
  int number=5;
  char capit='a';
  void addSelf(int i){
    number=number+i;
    System.out.println(capit+"="+number);
  }
}




[一般方法執行範例]
class MainClass1{
  public static void main(String[ ] args) {
ABC abc = new ABC( ); //建立物件欄位佔有記憶體
    abc.number = 67;      //指定物件欄位的值
    abc.addSelf(10);       //執行物件方法
    System.out.println ("number=" +abc.number ) ;
    System.out.println ("capit=" +abc.capit ) ;
  }
}
執行結果:C:\js>java MainClass1
a=77
number=77
capit=a

變數內容之遷移:
變數名稱
abc.number
abc.capit
變數內容遷移
5->67->77
a




主類別內須且僅能含一個主方法,一 般方法數不限。一般類別內之一般方法數不拘(0~n)

[主類別方法的構成]

[只包含主方法]

[Clmd1.java]
class Clmd1{
  public static void main(String[] args){
    int i = 11, j = 22 ;
    System.out.println("主類別主方法1" + "i + j = " + (i+j));
  }
}

[包含主方法及一般方法(可有多個)]
一般方法可為前置static的靜態方法,或無前置static的物件方法。
[靜態方法-Clmd2.java]
class Clmd2{
  static void md1(){
    int i = 12, j = 23 ;
    System.out.println("主類別一般靜態方法1" + "i + j = " + (i+j));
  }

  static void md2(){
    int s = 21, t = 32 ;
    System.out.println("主類別一般靜態方法2" + "s + t = " + (s+t));
  }

  public static void main(String[] args){
    md1() ;
    md2() ;
  }
}




[物件方法-Clmd3.java]

class Clmd3{
  void md3(){
    int i = 12, j = 23 ;
    System.out.println("主類別一般物件方法3" + "i + j = " + (i+j));
  }

  void md4(){
    int s = 21, t = 32 ;
    System.out.println("主類別一般物件方法4" + "s + t = " + (s+t));
  }

  public static void main(String[] args){
    Clmd3 a = new Clmd3() ;
    a.md3() ;
    a.md4() ;
  }
}




[主類別方法的運用]
靜態方法在主方法內可直接使用,物件方法必須建立物件後方可使用。
[只包含主方法]
如前例:[Clmd1.java]
執行結果:c:\js1>java Clmd1
主類別主方法1i + j = 33

[包含主方法及一般方法(可有多個)]

[包含主方法和一般靜態方法]
如前例:[Clmd2.java]
執行結果:c:\js1>java Clmd2
主類別一般靜態方法1i + j = 35
主類別一般靜態方法2s + t = 53

[包含主方法和一般物件方法]
如前例:[Clmd3.java]
執行結果:c:\js1>java Clmd3
主類別一般物件方法3i + j = 35
主類別一般物件方法4s + t = 53






方法(一般方法)分類:以有無回傳值及參數來分類
[無回傳值及參數(void( ))]
class Score2 {
  void totalScore( ) {  //回傳資料型別為void,方法參數為null ( )
    int chi = 90 ;
    int eng = 80 ;
    int pro = 70 ;
    int totSco = 0 ;
    totSco = chi + eng + pro ;
    System.out.println("總分=" + totSco) ;
    return ;  //無回傳值時,return可省略,或return之後不接變數
  }
}

class MainClass2{
  public static void main(String[ ] args) {
    Score2 so = new Score2( ) ;  //建立物件
    so.totalScore( ) ;  //呼叫方法
  }
}
執行結果:C:\js>java MainClass2
總分=240




*return可置於方法內任何位置,表示離開方法,並不再執行其後之程式碼。



[有回傳值沒有參數(回傳值資料型別及( ))]
class Score3 {
  int totalScore( ) {  //回傳值資料型別定為int,方法參數為null ( )
    int chi = 90 ;
    int eng = 80 ;
    int pro = 70 ;
    int totSco = 0 ;
    totSco = chi + eng + pro ;
    return totSco ;   //有回傳值時,須有return敘述
  }
}

class MainClass3{
  public static void main(String[ ] args) {
    int totScoR ;   //宣告接收回傳值的變數
    Score3 so = new Score3( ) ;
    totScoR = so.totalScore( ) ;  //接收回傳值
    System.out.println("總分=" + totScoR) ;
    //2行可合併System.out.println("總分=" + so.totalScore( )) ;     
  }                                      
}
執行結果:C:\js>java MainClass3
總分=240




[無回傳值有參數(void(int a, int b, int c))]
class Score4 {
  void totalScore(int a, int b, int c)
    int chi = a ;
    int eng = b ;
    int pro = c ;
    int totSco = 0 ;
    totSco = chi + eng + pro ;
    System.out.println("總分="+ totSco) ;
                    //本例省略return
  }
}

class MainClass4a{
  public static void main(String[ ] args) {
    Score4 so = new Score4( ) ;
    so.totalScore(75,65,55) ;  //呼叫方法並給予方法參數
    so.totalScore(90,75,60) ;
  }
}
執行結果:C:\js>java MainClass4a
總分=195
總分=225




[有回傳值有參數(回傳值資料型別及(int a, int b, int c))]
class Score5 {
  int totalScore(int a, int b, int c) {  //回傳值資料型別定為int
    int chi = a ;
    int eng = b ;
    int pro = c ;
    int totSco = 0 ;
    totSco = chi + eng + pro ;
    return totSco ;
  }
}

class MainClass5{
  public static void main(String[ ] args) {
    int totScoR ;   //宣告接收回傳值的變數
    Score5 so = new Score5( ) ;
    totScoR = so.totalScore(88,77,66 ) ;//呼叫方法並給予方法參數,及接收回傳值
    System.out.println("總分=" + totScoR) ;     
  }                                      
}
執行結果:C:\js>java MainClass5
總分=231




沒有留言:

張貼留言