類的成員之二:方法
1.方法的聲明
-
方法聲明的位置
類中方法外
- 方法的聲明格式
[權限修飾符] [修飾符] 傳回值類型 方法名([形參清單]){
//方法體:實作功能的語句
}
2.方法參數的值傳遞機制
形參是一個方法(棧幀)中的局部變量表中的變量,方法在執行的時候,是通過這些局部變量來做運算的,是以值傳遞就是指 在調用方法的時候,将實際參數傳遞給局部變量;
(1)基本資料類型形參:實參給形參傳的是“資料值”,形參值的修改不會影響實參
(2)引用資料類型形參:實參給形參傳的是“位址值”,形參對象的屬性值修改會影響實參對象的屬性值。
public class TestPassValue{
public static void main(String[] args){
int a = 10;
System.out.println("修改之前a = " + a);//10
//a是實參
change(a);
System.out.println("修改之後a = " + a);//10
}
//方法的功能:修改一個變量的值,為它原來的兩倍
//修飾符:public static,和main在同一個類中,為了在main()中直接調用,這裡加上public static
//int num是形參
public static void change(int num){
System.out.println("修改之前num = " + num);//10
num *= 2;
System.out.println("修改之後num = " + num);//20
}
}
修改之前a = 10
修改之前num = 10
修改之後num = 20
修改之後a = 10
方法重載(Overload)
方法的重載:在同一個類中,出現的多個方法名稱相同,參數清單不同的情形稱為方法重載。
(1)在同一個類中多個方法
(2)方法名稱必須相同
(3)參數清單必須不同(參數的個數或資料類型不同)
注意:隻和方法名和參數清單有關,與其他的都無關
指令行參數
指令行參數:給main方法傳遞的參數
該方法接收一個String類型的數組參數,該數組中儲存執行java指令時傳遞給所運作的類的參數。
- main()為什麼是public static 的??
1.java虛拟機需要調用類的main()方法,是以該方法的通路權限必須是public
2.java虛拟機在執行main()方法時不必建立對象,是以該方法必須是static的
傳參格式:
java main方法所在類名 參數清單
java TestCommandParam chai lin yan
可變參數
1、如何聲明
資料類型… 可變參數名
要求:
(1)一個方法隻能有一個可變參數
(2)可變參數的位置一定是最後一個
2、如何使用它
(1)在聲明它的方法中,把它當做數組使用
(2)在調用含可變參數的方法
A:非可變參數的部分,實參的類型,個數,順序與形參仍然要一一對應
B:可變參數的部分,實參的類型要與形參一緻或相容,個數可以是0~n個
C:可變參數的部分,實參還可以是對應類型的數組
public class VarParams{
public static void main(String[] args){
System.out.println("3或5的最大值是:" + getMax(3,5));//實參是3和5, 3給了num, 5給了args
System.out.println("3,5,1,7,9的最大值是:" + getMax(3,5,1,7,9));//3,5,1,7,9是實參, 3給了num,5,1,7,9給了args
System.out.println("3的最大值是:" + getMax(3));//3是實參, 3給了num,args沒有對應的實參
//System.out.println("3的最大值是:" + getMax());//編譯不通過
int[] array = {4,5,6,7};
System.out.println("3和{4,5,6,7}的最大值是:" + getMax(3,array));//3給了num,array給了args
}
//方法的功能:可以求1~n個整數中的最大值
public static int getMax(int num, int... args){
//args是數組,等價于int[]
//先假設num最大,然後與args中的元素一一比較,如果有比它大的,就修改結果
int max = num;
for(int i=0; i<args.length; i++){
if(args[i] > max){
max = args[i];
}
}
return max;
}
}
3、陷阱:
(1) 這兩個方法不是重載方法,編譯器認為是同一個。因為在getSum方法中,它倆都是按照數組處理的。
public static int getSum(int[] array){
int sum=0;
for(int i=0;i<array.length;i++){
sum+=array[i];
}
return sum;
}
public static int getSum(int... nums){
int sum=0;
//編譯器把nums編譯成int[]
for(int i=0;i<nums.length;i++){
sum+=nums[i];
}
return sum;
}
但是它倆在方法調用時是不一樣的。上面的方法調用時,必須傳遞一個int[]的實參數組,而下面的方法,可以傳遞一個int[]的實參數組,也可以傳0~n個整數值。
(2)這兩個方法是重載,但是沒法用
public static void main(String[] args) {
System.out.println(getSum(1,2,3,6,7));
System.out.println(getSum(1,2,3));
}
public static int getSum(int... nums){
return 0;
}
public static int getSum(int a,int... nums){
return 0;
}