## Java編程那些事兒54—方法調用
鄭州游戲學院 陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
**7.4 方法調用**
方法聲明是創建一個新的功能,聲明出來的方法在需要的時候可以通過調用執行該方法的功能,方法只有被調用才能被執行。
在Java程序中有一個基本的main方法,其方法聲明如下:
public static void main(String[] args)
該方法包含在開始的代碼框架中,這是一個特殊的方法。Java語法規定,J2SE的代碼都從該方法開始執行,如果一個代碼中沒有main方法,則該代碼不能被直接運行。所以main方法也稱作J2SE程序的入口方法,在運行程序時,自動調用對應代碼中的main方法開始程序的執行。
由于上面講述的原因,所以一個方法如果需要得到執行,則需要直接或間接在main方法中進行調用。
在調用方法時,程序的執行流程會進入方法的內部,當執行到方法內部的return語句或執行完方法內部的代碼以后,則返回到調用該方法的位置繼續向下執行。
方法調用的語法分為以下兩種:
1.?一個類內部的方法調用
指調用以及被調用的方法都在一個類的內部。
2.?不同類之間的方法調用
指調用以及被調用的方法位于不同的類內部。
由于類的概念現在還沒有涉及到,所以這里指講一個類內部的方法調用語法,關于不同類之間的方法調用則在后續的章節中進行介紹。
**7.4.1 一個類內部方法調用語法**
在前面的代碼框架中,以下代碼就是聲明類的結構:
public class 文件名{
在該聲明后續大括號內部的代碼,稱作一個類的內部。
在進行方法調用時,調用的語法格式和static修飾符有關,所以按照一個方法在聲明時是否有static修飾分為兩類:
1.?有static修飾的稱作靜態方法
2.?沒有static修飾的稱作非靜態方法
這樣一個類內部的方法調用就存在四種情況:
1.?在非靜態方法內部調用非靜態方法
2.?在非靜態方法內部調用靜態方法
3.?在靜態方法內部調用靜態方法
4.?在靜態方法內部調用非靜態方法
其中前三種情況的調用都是直接調用,直接調用的語法格式為:
方法名(參數1值,……);
這里方法名為被調用的方法名稱,后續緊跟一對小括號,括號內部依次書寫調用該方法時傳入參數的值,語法上要求傳入參數的個數、每個參數的類型都必須和方法聲明時保持一致。而這里調用的表達式就代表方法的返回值,可以根據需要使用返回值進行賦值。
示例代碼如下:
~~~
???????? public class CallMethod{
???????? ???????? public static void main(String[] args){
?????????????????? ???????? int a = 10;
?????????????????? ???????? int b = 2;
?????????????????? ???????? int c = 3;
?????????????????? ???????? int d = 32;
??????????????????????????? max(a,b);?//只比較,比較以后返回值丟失
??????????????????????????? int n = max(5,a);?//比較,并把返回值賦值給變量n
??????????????????????????? int m = max(c,d);?//比較,并把返回值賦值給變量m
??????????????????????????? //比較a、b、c、d四個數字的最大值
??????????????????????????? int maxNumber = max(max(a,b),max(c,d));?
???????? ???????? }
?
???????? ???????? public static int max(int a,int b){
?????????????????? ???????? if(a > b){
??????????????????????????? ???????? return a;
?????????????????? ???????? }else{
??????????????????????????? ???????? return b;
?????????????????? ???????? }
???????? ???????? }
}
~~~
該示例在靜態的main方法內部調用靜態的max方法,因為max方法在聲明時參數列表為2個int的參數,則調用的時候必須傳入2個int值,可以是int的變量也可以是int數值。則調用的基本格式為:
max(參數值1,參數值2)
調用的表達式可以在代碼中單獨成行,當方法的返回值類型不是void時,可以接收方法的返回值,也可以不接收。方法的返回值是一個確定類型的值,所以在以上比較時,方法調用之間可以進行嵌套。
int maxNumber = max(max(a,b),max(c,d));
其中max(a,b)是獲得a和b的最大值,max(c,d)是獲得c和d的最大值,然后比較兩個獲得的最大值,該代碼的功能和以下代碼的功能相同:
int maxNumber = max(a,max(b,max(c,d)));
總得來說,前三種情況的調用都是使用該種格式。
對于最后一種情況,也就是在靜態方法內部調用非靜態的結構在語法上則比較復雜,以下是一個簡單的示例:
~~~
???????? ???????? public class CallMethod2{
???????? ?????????????????? public static void main(String[] args){
?????????????????? ?????????????????? CallMethod2 cm = new CallMethod2();
?????????????????? ?????????????????? int n = cm.max(1,2);
???????? ?????????????????? }
?
???????? ?????????????????? public int max(int a,int b){
?????????????????? ?????????????????? if(a > b){
??????????????????????????? ?????????????????? return a;
?????????????????? ?????????????????? }else{
??????????????????????????? ?????????????????? return b;
?????????????????? ?????????????????? }
???????? ?????????????????? }
}
~~~
在該代碼涉及的語法格式在后續的代碼中將進行講解,這里只做簡單的說明。其中:
CallMethod2 cm = new CallMethod2();
該行代碼聲明并創建了一個CallMethod2類型的對象cm。接著的代碼:
int n = cm.max(1,2);
在調用max方法時,則使用對象名.方法名調用對應的方法,這里參數的規則和上面介紹的相同。
**7.4.2 方法調用后的執行流程**
在方法調用時,程序的執行流程和以前的結構就有所區別。簡單說,就是當遇到方法調用時,程序的執行流程將跳轉到被調用的方法內部,直到被調用的方法返回時,才從調用的位置繼續向下執行。
以下是一個演示調用過程的示例代碼:
~~~
???????? public class CallMethod3{
???????? ???????? public static void main(String[] args){
?????????????????? ???????? System.out.println(1);
?????????????????? ???????? printTest();
?????????????????? ???????? System.out.println(2);
?????????????????? ???????? max(10,20);
?????????????????? ???????? System.out.println(3);
???????? ???????? }
?
???????? ???????? public static int max(int a,int b){
??????????????????????????? System.out.println("進入max方法內部!");
?????????????????? ???????? if(a > b){
??????????????????????????? ???????? return a;
?????????????????? ???????? }else{
??????????????????????????? ???????? return b;
?????????????????? ???????? }
???????? ???????? }
?
???????? ???????? public static void printTest(){
??????????????????????????? System.out.println("進入printTest方法內部!");
?????????????????? ???????? int a = 10;
??????????????????????????? System.out.println("printTest方法執行完畢!");
???????? ???????? }
}
~~~
則該代碼執行時的輸出如下:
1
進入printTest方法內部!
printTest方法執行完畢!
2
進入max方法內部!
3
從程序執行的輸出就可以清晰的看出方法調用時代碼的執行順序。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結