方法的定義
方法是程式中最小的執行單元。
main() 方法也叫主方法。
方法必須先定義,然後才能呼叫。
方法的定義要寫在 main() 的外面,類的裡面。main() 也是方法,方法不能巢狀定義。
方法的編寫順序和執行順序無關,執行順序要根據呼叫順序來看。
方法名遵循駝峰法。
方法與方法之間是平級關係,不能巢狀定義。誰在前誰在後無所謂,但是為了程式的可讀性,一般都是將 main() 方法放在第一個,表示程式的主入口。
不帶返回值的方法,不要寫 return 語句,如果寫也行,但是隻能是單獨的一條 return 語句,後面不能跟別的內容,即 return;
。
方法的定義的格式:
public static 返回值型別 方法名(引數) {
方法體;
return 返回值;
}
最簡單的方法的定義和呼叫:
public class method1 {
public static void main(String[] args) {
greet();
}
public static void greet (){
System.out.println("Hello");
System.out.println("Good morning");
System.out.println("Good day");
}
}
執行結果:
Hello
Good morning
Good day
程式示例:
public class method1 {
public static void main(String[] args) {
System.out.println("m");
method1();
System.out.println("n");
method2();
System.out.println("k");
}
public static void method1() {
System.out.println("a");
System.out.println("b");
method2();
System.out.println("u");
}
public static void method2() {
System.out.println("d");
System.out.println("c");
}
}
執行結果:
m
a
b
d
c
u
n
d
c
k
程式示例:
public class method1 {
public static void main(String[] args) {
getSum();
}
public static void getSum() {
int a = 10;
int b = 20;
System.out.println(a + b);
}
}
執行結果:
30
帶引數的方法:
形參:形式引數,是方法定義中所用引數。
實參:實際引數,是方法呼叫中所用引數。
實參的個數必須和形參保持一致。
程式示例:
public class method1 {
public static void main(String[] args) {
getSum(10, 20);
}
public static void getSum(int a, int b) {
System.out.println(a + b);
}
}
執行結果:
30
傳遞引數允許自動型別轉換,例如下面的程式涉及將 float 轉換為 double 以及將 int 轉換為 double。
public class method1 {
public static void main(String[] args) {
System.out.println(getSum(10.0F, 20));
}
public static double getSum(double a, double b) {
return a + b;
}
}
執行結果:
30.0
程式示例:
// 計算長方形的面積
import java.util.Scanner;
public class method1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("輸入長方形的長:");
int length = sc.nextInt();
System.out.print("輸入長方形的寬:");
int weight = sc.nextInt();
System.out.println("長方形的面積為" + getArea(length, weight));
}
public static int getArea(int a, int b) {
return a * b;
}
}
執行結果:
輸入長方形的長:3
輸入長方形的寬:4
長方形的面積為12
帶返回值的方法:
直接呼叫,不對返回值做任何處理:
方法名(實參);
賦值呼叫:
資料型別 變數 = 方法名(實參);
輸出呼叫:
System.out.println(方法名(實參));
程式示例:
public class method1 {
public static void main(String[] args) {
System.out.println(getSum(10, 20));
}
public static int getSum(int a, int b) {
return a + b;
}
}
執行結果:
30
方法返回型別和實際 return 的計算結果的型別不同時,允許自動型別轉換,即 return 的結果自動型別轉換到方法定義中的指定型別,最終的返回值的型別以方法定義中指定的型別為準。
例如,下面的程式中,return 語句的結果為 int 型別,但是方法定義指定了返回型別為 double 型別,最終方法返回的型別為 double,因為將 int 自動轉換為 double 了。
// 計算長方形的面積
import java.util.Scanner;
public class method1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("輸入長方形的長:");
int length = sc.nextInt();
System.out.print("輸入長方形的寬:");
int weight = sc.nextInt();
System.out.println("長方形的面積為" + getArea(length, weight));
}
public static double getArea(int a, int b) {
return a * b;
}
}
執行結果:
輸入長方形的長:3
輸入長方形的寬:4
長方形的面積為12.0
方法的過載
方法的過載:在同一個類中,定義了多個同名的方法,功能都相同或類似,但是形參列表不同,可以是型別不同或者是個數不同或者順序不同,只要有一個不同就可以。
方法的過載與返回值無關。
構成過載的方法必須是同一個類中的,不同的類中的同名方法不構成過載。
不建議書寫僅有形參順序不同的過載函式。
程式示例:
// 需求:使用方法過載的思想,設計比較兩個整數是否相同的方法。
// 要求:相容全整數型別(byte,short,int,long)
public class method1 {
public static void main(String[] args) {
byte m1 = 1, n1 = 2;
System.out.println(compare(m1, n1));
short m2 = 1, n2 = 2;
System.out.println(compare(m2, n2));
int m3 = 1, n3 = 2;
System.out.println(compare(m3, n3));
long m4 = 1, n4 = 2;
System.out.println(compare(m4, n4));
}
public static boolean compare(byte a, byte b) {
System.out.println("呼叫byte型別方法");
return a == b;
}
public static boolean compare(short a, short b) {
System.out.println("呼叫short型別方法");
return a == b;
}
public static boolean compare(int a, int b) {
System.out.println("呼叫int型別方法");
return a == b;
}
public static boolean compare(long a, long b) {
System.out.println("呼叫long型別方法");
return a == b;
}
}
執行結果:
呼叫byte型別方法
false
呼叫short型別方法
false
呼叫int型別方法
false
呼叫long型別方法
false
程式示例:
// 需求:設計一個方法用於陣列遍歷,要求遍歷的結果是在一行上的。例如:[11, 22, 33, 44, 55]
public class Exercise1 {
public static void main(String[] args) {
int[] nums = {11, 22, 33, 44, 55};
traverse(nums);
}
public static void traverse(int[] strings) {
System.out.print("[");
for (int i = 0; i < strings.length; i++) {
if (i == strings.length - 1)
System.out.print(strings[i]);
else System.out.print(strings[i] + ", ");
}
System.out.println("]");
}
}
執行結果:
[11, 22, 33, 44, 55]
程式示例:
// 需求:設計一個方法求陣列的最大值,並將最大值返回
public class Exercise1 {
public static void main(String[] args) {
int[] nums = {11, 22, 33, 44, 55};
System.out.println("陣列最大值為 " + getMax(nums));
}
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
max = max > arr[i] ? max : arr[i];
}
return max;
}
}
執行結果:
陣列最大值為 55
程式示例:
// 定義一個方法判斷陣列中的某一個數是否存在,將結果返回
import java.util.Scanner;
public class Exercise1 {
public static void main(String[] args) {
int[] nums = {11, 22, 33, 44, 55};
Scanner sc = new Scanner(System.in);
System.out.print("輸入要尋找的數:");
int find = sc.nextInt();
System.out.println("要尋找的數的索引為:" + getIndex(nums, find));
}
public static int getIndex(int[] arr, int n) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == n)
return i;
}
return -1;
}
}
執行結果:
輸入要尋找的數:22
要尋找的數的索引為:1
程式示例:
// 需求:
// 功能:
// 定義一個方法 copyOfRange(int[] arr, int from, int to)
// 將陣列 arr 中從索引 from(包含 from)開始,
// 到索引 to 結束(不包含to)的元素複製到新陣列中,
// 將新陣列返回。
import java.util.Scanner;
public class Exercise1 {
public static void main(String[] args) {
int[] nums = {0, 11, 22, 33, 44, 55, 66, 77, 88, 99};
Scanner sc = new Scanner(System.in);
System.out.print("輸入要複製的起始索引:");
int start = sc.nextInt();
System.out.print("輸入要複製的終止索引:");
int end = sc.nextInt();
int[] newNums = copyOfRange(nums, start, end);
System.out.println("複製出來的陣列為:");
for (int i = 0; i < newNums.length; i++) {
System.out.print(newNums[i] + " ");
}
}
public static int[] copyOfRange(int[] arr, int from, int to) {
int[] newArr = new int[to - from + 1];
for (int i = 0, j = from; i < newArr.length; i++, j++) {
newArr[i] = arr[j];
}
return newArr;
}
}
執行結果:
輸入要複製的起始索引:1
輸入要複製的終止索引:6
複製出來的陣列為:
11 22 33 44 55 66