java_方法
方法
1.1方法概述
在我們的日常生活中,方法可以理解為要做某件事情,而採取的解決辦法。
如:小明同學在路邊準備坐車來學校學習。這就面臨著一件事情(坐車到學校這件事情)需要解決,解決辦法呢?可採用坐公交車或坐計程車的方式來學校,那麼,這種解決某件事情的辦法,我們就稱為方法。
在java中,方法就是用來完成解決某件事情或實現某個功能的辦法。
方法實現的過程中,會包含很多條語句用於完成某些有意義的功能——通常是處理文字,控制輸入或計算數值。
我們可以通過在程式程式碼中引用方法名稱和所需的引數,實現在該程式中執行(或稱呼叫)該方法。方法,一般都有一個返回值,用來作為事情的處理結果。
1.2方法的語法格式
在Java中,宣告一個方法的具體語法格式如下:
修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2,......){ 執行語句 ……… return 返回值; }
對於上面的語法格式中具體說明如下:
- 修飾符:方法的修飾符比較多,有對訪問許可權進行限定的,有靜態修飾符static,還有最終修飾符final等,這些修飾符在後面的學習過程中會逐步介紹
- 返回值型別:用於限定方法返回值的資料型別
- 引數型別:用於限定呼叫方法時傳入引數的資料型別
- 引數名:是一個變數,用於接收呼叫方法時傳入的資料
- return關鍵字:用於結束方法以及返回方法指定型別的值
- 返回值:被return語句返回的值,該值會返回給呼叫者
需要特別注意的是,方法中的“引數型別 引數名1,引數型別 引數名2”被稱作引數列表,它用於描述方法在被呼叫時需要接收的引數,如果方法不需要接收任何引數,則引數列表為空,即()內不寫任何內容。方法的返回值必須為方法宣告的返回值型別,如果方法中沒有返回值,返回值型別要宣告為void,此時,方法中return語句可以省略。
public class MethodDemo01 { public static void main(String[] args) { int area = getArea(3, 5); // 呼叫 getArea方法 System.out.println(" The area is " + area); } // 下面定義了一個求矩形面積的方法,接收兩個引數,其中x為高,y為寬 public static int getArea(int x, int y) { int temp = x * y; // 使用變數temp記住運算結果 return temp; // 將變數temp的值返回 } } View Code
在上述程式碼中,定義了一個getArea()方法用於求矩形的面積,引數x和y分別用於接收呼叫方法時傳入的高和寬,return語句用於返回計算所得的面積。在main()方法中通過呼叫getArea()方法,獲得矩形的面積,並將結果列印。
1.3方法呼叫圖解
接下來通過一個圖例演示getArea()方法的整個呼叫過程,如下圖所示。
從上圖中可以看出,在程式執行期間,引數x和y相當於在記憶體中定義的兩個變數。當呼叫getArea()方法時,傳入的引數3和5分別賦值給變數x和y,並將x*y的結果通過return語句返回,整個方法的呼叫過程結束,變數x和y被釋放。
練習:
分別定義如下方法:
定義無返回值無引數方法,如列印3行,每行3個*號的矩形
定義有返回值無引數方法,如鍵盤錄入得到一個整數
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 無返回值無引數方法,如列印3行,每行3個*號的矩形
public static void printRect(){ //列印3行星 for (int i=0; i<3; i++) { //System.out.println("***"); 相當於是列印3顆星,換行 //每行列印3顆星 for (int j=0; j<3; j++) { System.out.print("*");// *** } System.out.println(); } } View Code
- 有返回值無引數方法,如鍵盤錄入得到一個整數
public static int getNumber(){ Scanner sc = new Scanner(System.in); int number = sc.nextInt(); return number; } View Code
1.4方法的過載
我們假設要在程式中實現一個對數字求和的方法,由於參與求和數字的個數和型別都不確定,因此要針對不同的情況去設計不同的方法。接下來通過一個案例來實現對兩個整數相加、對三個整數相加以及對兩個小數相加的功能
public class MethodDemo02 { public static void main(String[] args) { // 下面是針對求和方法的呼叫 int sum1 = add01(1, 2); int sum2 = add02(1, 2, 3); double sum3 = add03(1.2, 2.3); // 下面的程式碼是列印求和的結果 System.out.println("sum1=" + sum1); System.out.println("sum2=" + sum2); System.out.println("sum3=" + sum3); } // 下面的方法實現了兩個整數相加 public static int add01(int x, int y) { return x + y; } // 下面的方法實現了三個整數相加 public static int add02(int x, int y, int z) { return x + y + z; } // 下面的方法實現了兩個小數相加 public static double add03(double x, double y) { return x + y; } } View Code
從上述程式碼不難看出,程式需要針對每一種求和的情況都定義一個方法,如果每個方法的名稱都不相同,在呼叫時就很難分清哪種情況該呼叫哪個方法。
為了解決這個問題,Java允許在一個類中定義多個名稱相同的方法,但是引數的型別或個數必須不同,這就是方法的過載。
下面的三個方法互為過載關係
- public static int add(int x,int y) {邏輯} //兩個整數加法
- public static int add(int x,int y,int z) {邏輯} //三個整數加法
- public static int add(double x,double y) {邏輯} //兩個小數加法
接下來通過方法過載的方式進行修改
public class MethodDemo03 { public static void main(String[] args) { // 下面是針對求和方法的呼叫 int sum1 = add(1, 2); int sum2 = add(1, 2, 3); double sum3 = add(1.2, 2.3); // 下面的程式碼是列印求和的結果 System.out.println("sum1=" + sum1); System.out.println("sum2=" + sum2); System.out.println("sum3=" + sum3); } // 下面的方法實現了兩個整數相加 public static int add(int x, int y) { return x + y; } // 下面的方法實現了三個整數相加 public static int add(int x, int y, int z) { return x + y + z; } // 下面的方法實現了兩個小數相加 public static double add(double x, double y) { return x + y; } } View Code
上述程式碼中定義了三個同名的add()方法,它們的引數個數或型別不同,從而形成了方法的過載。
在main()方法中呼叫add()方法時,通過傳入不同的引數便可以確定呼叫哪個過載的方法,如add(1,2)呼叫的是兩個整數求和的方法。值得注意的是,方法的過載與返回值型別無關,它只有兩個條件,一是方法名相同,二是引數個數或引數型別不相同。
過載注意:
- 過載方法引數必須不同:
引數個數不同,如method(int x)與method(int x,int y)不同
引數型別不同,如method(int x)與method(double x)不同g
引數順序不同,如method(int x,double y)與method(double x,int y)不同
- 過載只與方法名與引數型別相關與返回值無關
如void method(int x)與int method(int y)不是方法過載,不能同時存在
- 過載與具體的變數識別符號無關
如method(int x)與method(int y)不是方法過載,不能同時存在
1.5.1引數傳遞
引數傳遞,可以理解當我們要呼叫一個方法時,我們會把指定的數值,傳遞給方法中的引數,這樣方法中的引數就擁有了這個指定的值,可以使用該值,在方法中運算了。這種傳遞方式,我們稱為引數傳遞。
- 在這裡,定義方法時,引數列表中的變數,我們稱為形式引數
- 呼叫方法時,傳入給方法的數值,我們稱為實際引數
可以通過下面兩段程式碼,來認識引數傳遞過程:
public class ArgumentsDemo01 { public static void main(String[] args) { int a=5; int b=10; change(a, b);//呼叫方法時,傳入的數值稱為實際引數 System.out.println("a=" + a); System.out.println("b=" + b); } public static void change(int a, int b){//方法中指定的多個引數稱為形式引數 a=200; b=500; } } View Code
public class ArgumentsDemo02 { public static void main(String[] args) { int[] arr = { 1, 2, 3 }; change(arr);// 呼叫方法時,傳入的數值稱為實際引數 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void change(int[] arr) {// 方法中指定的多個引數稱為形式引數 for (int i = 0; i < arr.length; i++) { arr[i] *= 2; } } } View Code
1.5.2引數傳遞圖解與結論
通過上面的兩段程式可以得出如下結論:
- 當呼叫方法時,如果傳入的數值為基本資料型別(包含String型別),形式引數的改變對實際引數不影響
- 當呼叫方法時,如果傳入的數值為引用資料型別(String型別除外),形式引數的改變對實際引數有影響
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
小練習:
隨機點名器,即在全班同學中隨機的打印出一名同學名字。
要做的隨機點名器,它具備以下3個內容:
- 儲存所有同學姓名
- 總覽全班同學姓名
- 隨機點名其中一人,列印到控制檯
main方法中呼叫三個獨立方法
public static void main(String[] args) { System.out.println("--------隨機點名器--------"); // 建立一個儲存多個同學名字的容器(陣列) String[] students = new String[3]; /* * 1.儲存全班同學名字 */ addStudentName(students); /* * 2.列印全班同學每一個人的名字 */ printStudentName(students); /* * 3.獲取隨機點名到的學生姓名,並列印 */ String randomName = randomStudentName(students); System.out.println("被點到名的同學是 :" + randomName); } View Code
1.儲存所有同學姓名
/** * 1.儲存全班同學名字 *建立一個儲存多個同學名字的容器(陣列) *鍵盤輸入每個同學的名字,儲存到容器中(陣列) */ public static void addStudentName(String[] students) { //鍵盤輸入多個同學名字儲存到容器中 Scanner sc = new Scanner(System.in); for (int i = 0; i < students.length; i++) { System.out.println("儲存第"+i+"個名稱:"); students[i] = sc.next(); } } View Code
上述方法中,通過鍵盤錄入,完成為指定陣列元素賦值。方法定義時,將引數定義為字串陣列,用於接收存放的同學姓名。
2,列印全班同學每一個人的名字
/** * 2列印全班同學每一個人的名字 */ public static void printStudentName(String[] students) { //遍歷陣列,得到每個同學名字 for (int i = 0; i < students.length; i++) { String name = students[i]; //列印同學名字 System.out.println("第"+i+"個學生名稱:" + name); } } View Code
上述方法中,方法引數students陣列中儲存了所有學生的姓名。通過遍歷將陣列中的每一個元素訪問一遍,得到每一個同學名稱。
3.獲取隨機點到的學生姓名
/** * 3.在班級總人數範圍內,隨機產生一個隨機數,返回隨機數位置上的學生姓名 */ public static String randomStudentName(String[] students) { //根據陣列長度,獲取隨機索引 int index = new Random().nextInt(students.length); //通過隨機索引從陣列中獲取名稱 String name = students[index]; //返回隨機點到的名稱 return name; } View Code
上述方法中,通過隨機數類Random產生一個從0到陣列長度的隨機索引。使用該索引獲取students陣列中對應的值,便得到了全班同學的隨機姓名
參考:http://www.runoob.com/java/java-methods.html