1. 程式人生 > >java入門(3)--函數

java入門(3)--函數

自動 print 位數 而是 入門 參數傳遞 中修改 更多 由於

函數和方法

如果我們經常要進行一些相似的處理過程,就可以把這個處理過程封裝為函數

函數可以被多次重復調用,從而實現代碼重用和隔離的目的。

在面向對象的語言中,函數經常和對象綁定在一起,為區分起見,這時它被稱為方法

因為java是完全面向對象的,函數必須從屬於某個類。所以java中的函數都被稱為方法。

如果方法前以 static 修飾,則稱為靜態方法,可以粗略地認為,它與 c 語言的函數的概念大致相等了。

方法可以在其括號中列出調用它時需要準備的參數,叫形式參數

方法也可以有一個返回值(或沒有,此時寫void)。

下面,我們調用方法 f,求兩個整數的末位是否相同。

 1 public class
A0403 2 { 3 static boolean f(int a, int b){ 4 int a1 = a % 10; 5 int b1 = b % 10; 6 return a1==b1; 7 } 8 9 public static void main(String[] args){ 10 System.out.println(f(101,12)); 11 System.out.println(f(65432,12)); 12 } 13 }

這個方法接受兩個參數,都是整數,它進行一系列的處理後,返回一個布爾值。

return 語句結束 f 方法的執行,並返回一個指定的值。

在遇到 return 語句後,f 方法的其它代碼就不再執行,而是要返回調用它的那個方法中。當然,在此方法中,return 語句後恰好沒有更多的語句了。

如果一個方法定義了返回值,它在結束執行之前就一定會遇到 return 語句,否則會引發編譯錯誤。

形參獨立原理

如果在被調函數中改變了形參的值,會不會影響調用的一方呢? 不會!

我們看這個例子:

 1 public class A0404
 2 {
 3     static void f(int x){
 4         int sum = x % 10;
 5         x /= 10;
6 sum = sum * 10 + x % 10; 7 x /= 10; 8 sum = sum * 10 + x % 10; 9 System.out.println(sum); 10 System.out.println("x=" + x); 11 } 12 13 public static void main(String[] args){ 14 int a = 368; 15 f(a); 16 System.out.println("a=" + a); 17 } 18 }

這裏的函數f的功能是:把傳給它的3位數 x 的數位反轉並輸出。

為了觀察,我們額外輸出了 a 的值,以及 x 的值。

通過結果可以看到,雖然 x 的值在計算過程中發生了變化,但這並不會影響 a 的值。

實際上,在調用 f 之前,要為它準備需要的參數,這些參數必須新創建,所以才稱為形式參數。

也就是說,在沒有調用 f 函數的時候,這些形參變量是不存在的,在多次調用 f 的時候,這些形參就會被創建多次。

創建形參後,把實參的值(這裏就是 a 的值)拷貝給它,然後才開始 f 的執行。

當 f 執行結束後,形參變量會被自動釋放掉。

從更底層的機制看,這個形參的分配與釋放的過程是通過棧來完成的。

函數調用前,要把返回的位置,需要的參數等信息壓棧,在函數執行完畢後,自動彈棧,恢復執行前的樣子。

如果被調用的函數還會去調用其它函數,這個過程還會繼續上演。

這樣,棧可能就會越漲越高,但函數的執行總有結束的時候,那時棧就會落回來。

如果由於某種設計失誤,導致函數調用一直沒能正確返回,而是不斷地調用其它的函數,就會導致棧的溢出,這是很常見的程序錯誤。

從參數傳遞的原理上我們看到,實參與形參是各自獨立的變量,除了開始的時候,實參拷貝給形參外,它們再不會有任何聯系。這叫做

"形參獨立原理"。

這種設計為我們省去了許多麻煩,但有時我們可能會想讓被調方與主調方共享一個變量,而不是各自獨立,這怎麽辦呢?

答案是傳指針,在java中叫做:引用。

引用作為參數

引用的本質是持有另一個對象的地址。

如果對一個引用進行復制,只不過是兩個引用指向了同一個對象,並沒復制對象本身。

引用與面向對象的體系緊密聯系在一起,所以要等到學了初步的面向對象的知識後我們才能更好地理解它。

但這裏,我們可以先看看數組的行為,來窺其端倪。

數組就是一種對象類型,我們定義的數組變量,實際上是指向實際數組對象的指針,或說:引用。

 1 public class A0404
 2 {
 3     static void f(int[] x){
 4         for(int i=0; i<x.length; i++){
 5             if(x[i] < 0) x[i] = -x[i];
 6         }
 7     }
 8     
 9     public static void main(String[] args){
10         int[] a = {5, -3, 6, 10, 0, -15};
11         f(a);
12         System.out.println(java.util.Arrays.toString(a));
13     }
14 }

這裏的形參 x,實參 a 都不是數組本身,它們是指向數組的引用。

雖然 x 和 a 也是按照同樣的規則,不會相互影響,但由於它們指向了同一個對象,這就引起了復雜的現象。

從結果上,我們可以觀察到,在 f 方法中修改了數組對象的值,在主調方打印數組時也看到了這些變化。

其原理圖:

技術分享圖片

引用是一種在主調函數和被調函數間共享數據的常用手段

java入門(3)--函數