今天是第三天啦,哦,今天是3月30號,一個偉大的日子,本博主的生日!
今天主要簡單的了解一下Java中的方法!
在上一篇文章中已經提到了方法長啥樣,可能有些小伙伴會說,好像跟C語言裡的函數差不多嘛(PS:原諒我會不止一次的提到C語言,畢竟這是博主寫代碼的啟蒙語言!)。從長相上來看,確實差不多,但是地位上可差遠了,Java可不是顏控喲!Java之所以稱之為面向對象的語言,自然地位最高的就是類和對象,而C語言是結構化的語言,所以在C中函數才如此的重要!在Java中,方法的地位是永遠趕不上類和對象的,所以,方法是不能獨立存在,也不能獨立執行,必須屬於類或者對象。如果這個方法用了static修飾,那麼這個方法屬於類,也叫作靜態方法,通常使用類.方法名進行調用;如果沒有用static修飾,那麼使用對象.方法名進行調用,再說一遍,方法只能被類或者對象調用,永遠不能獨立執行!!!那有的小伙伴就要反駁我了,我試過,在同一個類中,可以在一個方法中直接調用另一個方法!這其實是這麼回事,在同一個類中一個方法調用另一個方法,java會自己給它加上調用者的,普通方法就用this關鍵字,靜態方法就用類名啦!
下面我們來了解一下java方法的參數傳遞!在Java中,方法參數的傳遞方法只有一種,是值傳遞!值傳遞的意思就是說,我有一個參數,如果你方法想要我的參數,那我是不會給你參數的,我把參數的值copy一份給你用,但是參數還在我手裡!官方一點的說法是,將實際參數值的副本傳入方法而方法本身不受影響!下面這段代碼就解釋了值傳遞!
import java.util.*;
//值傳遞演示代碼1
public class Main{
public static void changenum(int num1,int num2){
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println("在方法中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
public static void main(String[] args){
int num1 = 1;
int num2 = 2;
changenum(num1,num2);
System.out.println("在main中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
}
運行結果如圖:
這裡可以清晰的看到在方法中,傳入的副本被交換了,而在main中,原來的參數不受任何影響!
小伙伴們再來仔細的看這段代碼,changenum(int num1,int num2)方法用了static修飾,也就是說,把他設定為靜態方法,那麼如果我把這個static去掉會怎麼樣呢?<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
import java.util.*;
//值傳遞演示代碼2
//這段代碼中和代碼1的唯一區別是把 changenum(int num1,int num2)前的static去掉了
public class Main{
public void changenum(int num1,int num2){//前面沒有static了喲!
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println("在方法中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
public static void main(String[] args){
int num1 = 1;
int num2 = 2;
changenum(num1,num2);
System.out.println("在main中:");
System.out.println("num1 = "+num1+";num2 = "+num2);
}
}
那麼如果我們在命令行編譯一下會發生什麼呢?如下圖: 創建個對象就搞定啦! 先來看運行結果吧: 運行結果: }
哦哦,出錯了,這個錯誤很好地驗證了靜態成員(用static修飾)不能直接訪問非靜態成員(不用stati╧y"http://www.Bkjia.com/kf/yidong/wp/" target="_blank" class="keylink">WPQ3srOo6k8L3N0cm9uZz6ho9LyzqptYWlut723qNaux7C808HLc3RhdGljo6zL+dLUy/y+zbK7xNzWsb3Tt8POyrfHvrLMrLXEY2hhbmdlbnVtt723qKOh16LS4sCyo6zKx7K7xNzWsb3Tt8POyqOsz+vSqrfDzsqjrLu5yse/ydLU1/a1vbXEo6HU2m1haW63vbeo1tDV4tH50LS+zb/J0tTAsqOhPC9wPg0KPHByZSBjbGFzcz0="brush:java;">
Main test = new Main();
test.changenum(num1,num2);
你以為這就是值傳遞?太天真了,關於值傳遞,還有如下這樣的代碼:
import java.util.*;
//值傳遞演示代碼3
public class Main{
int num1;
int num2;
public static void changenum(Main test){
int temp = test.num1;
test.num1 = test.num2;
test.num2 = temp;
System.out.println("在方法中:");
System.out.println("num1 = "+test.num1+";num2 = "+test.num2);
}
public static void main(String[] args){
Main test = new Main();
test.num1 = 1;
test.num2 = 2;
changenum(test);
System.out.println("在main中:");
System.out.println("num1 = "+test.num1+";num2 = "+test.num2);
}
}
這下方法裡的main中的結果一樣了,是不是就不是值傳遞了呢?
當然還是值傳遞,這次我們傳的是個對象,是個引用變量,上一篇我們講過,引用變量裡面存的是個地址,那我現在把這個地址復制給另一個引用(方法中的),那麼兩個引用指向了同一個對象,都對同一個對象進行操作,所以無論是在方法中進行操作還是在main函數中進行操作都是一樣,因為他們都指向了同一個對象呀!
關於方法,還有幾個小玩意需要了解一下:
第一,方法的形參可以是不固定的!如果你不知道一個方法到底有幾個形參,那麼可以在最後一個形參類型後面加三個點(…)表示程序員已經瘋掉了無語了妥協了因為他不知道到底有幾個參數!就像這樣
import java.util.*;
//形參可變演示代碼
public class Main{
public static void meetingpeople(int num,String... name){
System.out.print(num);
for(String temp:name){
System.out.print(temp);
}
}
public static void main(String[] args){
meetingpeople(3,"小張","小李","小王");
}
}
第二,方法重載。方法重載就是說一個類中可以包含2個或者以上的同名方法,只要形參列表不一樣就可以了。那麼在實際調用的時候,根據方法名和形參表就可以判斷出來到底調用的是哪個方法。比如下面這個例子:
import java.util.*;
//方法重載演示代碼
public class Main{
public static void fangfa(){
System.out.println("我是方法1");
}
public static void fangfa(String say){
System.out.println(say);
}
public static void fangfa(int num){
System.out.println("我是方法"+num);
}
public static void main(String[] args){
Main test = new Main();
test.fangfa();
test.fangfa("我是方法2");
test.fangfa(3);
}
運行結果: