JavaSE基礎學習(七)——如何自定義方法
阿新 • • 發佈:2018-12-18
1. 方法
1.1 方法概述
經過前幾節的學習,相信大家都有了一定的編碼基礎,而且我們的執行程式碼都是寫在主方法 main 裡面的,接下來我們介紹一下自定義方法是如何實現的呢? 假設有一個遊戲程式,程式在執行過程中,要不斷地發射炮彈(植物大戰殭屍)。發射炮彈的動作需要編寫 100 行的程式碼,在每次實現發射炮彈的地方都需要重複地編寫這 100 行程式碼,這樣程式會變得很臃腫,可讀性也非常差。 為了解決程式碼重複編寫的問題,可以將發射炮彈的代 碼提取出來放在一個{}中,併為這段程式碼起個名字,這樣在每次發射炮彈的地方通過這個名字來呼叫發射炮彈的程式碼就可以了。上述過程中,所提取出來的程式碼可以被看作是程式中定義的一個方法,程式在需要發射炮彈時呼叫該方法即可。1.2 定義格式
- 簡單的說:方法就是完成特定功能的程式碼塊
- 在很多語言裡面都有函式的定義
- 函式在 Java 中被稱為方法
- 格式
- 修飾符 返回值型別 方法名(引數型別 引數名 1,引數型別 引數名 2…) { 方法體; return 返回值; }
- 格式解釋
- 修飾符 目前記住 public static
- 返回值型別 用於限定返回值的資料型別
- 方法名 一個名字,為了方便我們呼叫方法
- 引數型別 用於接收呼叫方法時傳入的資料的型別
- 引數名 用於接收呼叫方法時傳入的資料的變數
- 方法體 完成功能的程式碼
- return 結束方法,把返回值返回給呼叫者
- 寫一個方法首先有兩點需要明確
- 返回值型別 明確功能結果的資料型別
- 引數列表 明確有幾個引數,以及引數的型別
- 注意事項:方法定義完成之後,沒有呼叫沒有意義,不呼叫不執行。
例:求和
package com.study.demo.methoddemo; /** * @Auther: lds * @Date: 2018/10/29 10:13 * @Description: 求和 */ public class MethodDemo01 { /* * 寫一個方法,用於求和。 * 兩個明確: 返回值型別 int 引數列表 int a,int b */ public static int sum(int a, int b) { /*int c = a + b; return c;*/ return a + b; } }
- 求和方法的呼叫(有明確返回值)
- 使用格式:方法名(引數);
- 單獨呼叫 sum(10,20);
- 輸出呼叫 System.out.println(sum(10,20));
- 賦值呼叫,推薦方式 int s = sum(10, 20); // s+=100; System.out.println("s:"+s);
- 求和圖解
練習:獲取三個資料中的較大值
package com.study.demo.methoddemo;
import java.util.Scanner;
/**
* @Auther: lds
* @Date: 2018/10/29 10:17
* @Description:獲取三個資料中的較大值
*/
public class MethodDemo02 {
public static void main(String[] args) {
// 建立物件
Scanner sc = new Scanner(System.in);
// 接收資料
System.out.println("請輸入第一個資料:");
int a = sc.nextInt();
System.out.println("請輸入第二個資料:");
int b = sc.nextInt();
System.out.println("請輸入第三個資料:");
int c = sc.nextInt();
// 呼叫方法
int max = getMax(a, b, c);
System.out.println("max:" + max);
}
// 返回三個數中的最大值
public static int getMax(int a, int b, int c) {
if (a > b) {
if (a > c) {
return a;
} else {
return c;
}
} else {
if (b > c) {
return b;
} else {
return c;
}
}
}
}
1.3 Void 修飾的方法
-
格式 修飾符 void 方法名(引數型別 引數名 1,引數型別 引數名 2…) { 方法體; return 返回值; }
- 沒有明確返回值的函式呼叫:
- 其實就是 void 型別方法的呼叫
- 只能單獨呼叫
例:寫一個方法,在控制檯輸出 10 次 HelloWorld 案例。
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:20
* @Description:在控制檯輸出 10 次 HelloWorld
*/
public class MethodDemo03 {
public static void main(String[] args) {
// 單獨呼叫
printHelloWorld();
}
// 在控制檯輸出 10 次 HelloWorld
public static void printHelloWorld() {
for (int x = 1; x <= 10; x++) {
System.out.println("HelloWorld");
}
}
}
例:定義一個方法,傳遞一個整數(大於 1),在控制檯列印 1 到該資料的值。
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:24
* @Description:定義一個方法,傳遞一個整數(大於 1),在控制檯列印 1 到該資料的值。
*/
public class MethodDemo04 {
public static void main(String[] args) {
printNumber(10);
System.out.println("-------------------");
printNumber(100);
}
// 在控制檯列印 1 到該資料 n 的值
public static void printNumber(int n) {
for (int x = 1; x <= n; x++) {
System.out.println(x);
}
}
}
1.4 方法過載
- 方法過載概述
- 在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別 不同即可
- 方法過載特點
- 與返回值型別無關,只看方法名和引數列表
- 在呼叫時,虛擬機器通過引數列表的不同來區分同名方法
- 基本使用
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:31
* @Description:
*/
public class MethodDemo05 {
public static void main(String[] args) {
int a = 10;
int b = 20;
// 求和
int result = sum(a, b);
System.out.println("result:" + result);
int c = 30;
// 求和
result = sum(a, b, c);
System.out.println("result:" + result);
}
// 兩個 float 型別的資料求和
public static float sum(float a, float b) {
return a + b;
}
// 三個整數的求和
public static int sum(int a, int b, int c) {
return a + b + c;
}
// 兩個整數的求和
public static int sum(int a, int b) {
return a + b;
}
}
1.5 方法引數傳遞問題
- 引數傳遞概述 可以理解當我們要呼叫一個方法時,我們會把指定的數值,傳遞給方法中的引數,這樣方法中的引數就擁有了這個指定的值,可以使用該值,在方法中運算了。這種傳遞方式,我們稱為引數傳遞
- 在這裡,定義方法時,引數列表中的變數,我們稱為形式引數
- 呼叫方法時,傳入給方法的數值,我們稱為實際引數
- 引數是基本型別及圖解 形式引數的改變不影響實際引數。
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:41
* @Description:引數是基本型別
*/
public class ArgsDemo01 {
public static void main(String[] args) {
// 定義變數
int a = 10;
int b = 20;
System.out.println("a:" + a + ",b:" + b);// a:10,b:20
change(a, b);
System.out.println("a:" + a + ",b:" + b);// a:10,b:20
}
public static void change(int a, int b) { // a=10,b=20
System.out.println("a:" + a + ",b:" + b);// a:10,b:20
a = b; // a=20;
b = a + b;// b=40;
System.out.println("a:" + a + ",b:" + b);// a:20,b:40
}
}
- 引數是引用資料型別及圖解
package com.study.demo.methoddemo;
/**
* @Auther: lds
* @Date: 2018/10/29 10:41
* @Description:引數是引用型別
*/
public class ArgsDemo01 {
public static void main(String[] args) {
// 定義變數
int a = 10;
int b = 20;
System.out.println("a:" + a + ",b:" + b);// a:10,b:20
change(a, b);
System.out.println("a:" + a + ",b:" + b);// a:10,b:20
}
public static void change(int a, int b) { // a=10,b=20
System.out.println("a:" + a + ",b:" + b);// a:10,b:20
a = b; // a=20;
b = a + b;// b=40;
System.out.println("a:" + a + ",b:" + b);// a:20,b:40
}
}
練習:定義方法,實現陣列元素求和
package com.study.demo.methoddemo.args;
/**
* @Auther: lds
* @Date: 2018/10/29 10:49
* @Description:定義方法,實現陣列元素求和
*/
public class MethodDemo06 {
public static void main(String[] args) {
// 定義陣列
int[] arr = {1, 2, 3, 4, 5};
//呼叫陣列元素求和方法
int sum = sum(arr);
System.out.println("sum:" + sum);
}
/*
* 定義陣列元素求和方法
* 兩個明確:
* 返回值型別:int
* 引數列表:int[] arr
*/
public static int sum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}