方法屬於誰 方法要麼屬於類,要麼屬於對象 static修飾的方法屬於類 沒有static修飾的方法屬於對象 方法只能定義在類裡面,不能獨立定義 不能獨立的執行方法,要麼通過類調用,要麼通過方法調用 一個類里,一個方法調用另一個方法,看似沒有調用者,實際上對於非static方法使用this調用,sta ...
方法屬於誰
- 方法要麼屬於類,要麼屬於對象
- static修飾的方法屬於類
- 沒有static修飾的方法屬於對象
- 方法只能定義在類裡面,不能獨立定義
- 不能獨立的執行方法,要麼通過類調用,要麼通過方法調用
- 一個類里,一個方法調用另一個方法,看似沒有調用者,實際上對於非static方法使用this調用,static方法使用類名調用
- 註意:static方法也可以通過對象調用,這符合語法,但不推薦
方法的參數傳遞
- Java里,參數的傳遞方式只有一種:值傳遞,就是將實際參數的副本傳給方法,而參數本身不受影響
- 示例:對於基本類型的參數
public class SwapTest {
public static void main(String[] args) {
int a=3;
int b=7;
System.out.println("主方法裡面,用swap(a,b)交換前:a="+a+" b="+b);
swap(a,b);
System.out.println("主方法裡面,用swap(a,b)交換後:a="+a+" b="+b);
}
public static void swap(int a,int b){
System.out.println("swap(a,b)方法內部,交換前:a="+a+" b="+b);
int temp;
temp=a;
a=b;
b=temp;
System.out.println("swap(a,b)方法內部,交換後:a="+a+" b="+b);
}
}
- 上面代碼中,用swap()方法並沒能對main方法的a和b實現交換,因為在調用swap方法時,棧記憶體中又開了個swap棧區,裡面有兩個變數a和b,這個ab跟main方法的ab毫無關係,接下來傳遞參數的值,也就是將main的3傳給swap的a變數,將7傳給b變數,然後swap方法內部將二者進行了交換,但這絲毫不影響main方法里的ab。這裡的swap就像人睡覺一樣,你在夢裡中了500萬,但這絲毫改變不了你的現實。
- 再看下麵的代碼,引用類型的參數:
public class T1 {
public static void main(String[] args) {
DataWrap dw=new DataWrap();
dw.a=3;
dw.b=7;
System.out.println("main方法里,交換前,dw.a="+dw.a+" dw.b="+dw.b);
swap(dw);
System.out.println("main方法里,交換後,dw.a="+dw.a+" dw.b="+dw.b);
}
public static void swap(DataWrap dw){
System.out.println("swap方法里,交換前,dw.a="+dw.a+" dw.b="+dw.b);
int temp;
temp=dw.a;
dw.a=dw.b;
dw.b=temp;
System.out.println("swap方法里,交換後,dw.a="+dw.a+" dw.b="+dw.b);
}
}
class DataWrap{
int a;
int b;
}
- 對於引用類型的參數而言,依然是採用的值傳遞方式。但這裡容易存在一個假象:調用swap()方法時,傳進去的是dw這個對象本身,並沒有複製一個dw。實際上傳進去的是dw這個對象的引用的複製,而不是複製了一個dw對象,也就是說調用swap()方法後,記憶體中有兩個引用指向dw對象,一個main方法的dw變數,另一個是swap方法的dw變數。
形參個數可變的方法
- 如果要傳入某類型的參數個數不能確定,那可以用下麵這種方式
methodName(int a,float b,String...strings); - 規則:
- 個數可變的形參只能放在參數列表的最後
- 一個方法只能有一個個數可變的形參
- 調用這種方法時,可以傳入一個對應類型的數組
- 參數數組
- 個數可變的形參實際上就是個數組,下麵的定義與上面的相同
methodName(int a,float b,String[] strings);
- 個數可變的形參實際上就是個數組,下麵的定義與上面的相同
方法的重載
- 方法名+形參列表構成了方法簽名
- Java里,即使方法名相同,只要形參列表不想同,就是不同的方法
- 同一個類中,方法名相同,形參列表不同,這就叫做方法的重載,overload
- 在調用方法的時候,JVM會根據方法名和傳入的參數的類型自動匹配對應的方法
- 重載方法中包含個數可變的形參,看示例代碼:
public class Test {
public static void main(String[] args) {
test("A"); //輸出:有一個String參數
test("B","C"); //輸出:有兩個String參數
test("D","E","F"); //輸出:有三個String參數
test("G","H","I","J","K"); //輸出:有很多個String參數
String[] str={"A"};
test(str); //輸出:有很多個String參數
}
public static void test(String str){
System.out.println("有一個String參數");
}
public static void test(String str1,String str2){
System.out.println("有兩個String參數");
}
public static void test(String str1,String str2,String str3){
System.out.println("有三個String參數");
}
public static void test(String...strs){
System.out.println("有很多個String參數");
}
}
- 從上面的代碼可以看出,總是先匹配精確的個數,匹配不到再匹配個數可變的;
- 如果傳入的是數組,直接匹配個數可變的
- 一般不推薦用個數可變的形參,意義不大,可讀性差
遞歸方法
- 簡單的說,遞歸方法就是在方法裡面調用自身,然後可能產生迴圈調用,最後在某種條件下退出
- 使用原則:
- 向已知的方向遞歸
- 要設置某種條件能讓遞歸調用退出來,
- 看下麵的示例代碼
public class T1 {
public static void main(String[] args) {
System.out.println("0~-50的和= "+sum(-50));
}
public static int sum(int num){
if (num==0){
return 0;
}else if(num>0){
return num+sum(num-1);
}else{
return num+sum(num+1);
}
}
}