Java方法
何為方法
System.out.println(),那么它是什么呢?
? System是一個類,out是一個物件,println()是一個方法
Java方法是陳述句的集合,它們在一起執行的一個功能,
- 方法是解決一類問題的步驟和有序組合
- 方法包含于類或物件中
- 方法在程式中被創建,在其他地方被參考
設計方法的原則:方法的本意是功能塊,就是實作某個功能的陳述句塊的合集,我們設計方法的時候,最好保持方法的原子性,就是一個方法只能完成一個功能,這樣利于我們后期的擴展
回顧:方法的命名規則? 小寫字母開頭及駝峰原理
例子:寫一個運算加法的方法
package com.xiaodi.operator.method;
public class Demo01 {
//main方法
public static void main(String[] args) {
//呼叫add方法,傳參;這個方法如果沒有加static是不能這樣呼叫的
int sum = add(9,7);
System.out.println(sum);
}
//加法
//在沒學習物件之前先使用static,便于呼叫
//回傳值型別int,如果是void就代表不回傳東西
//方法的引數,不寫死,等一下可以自由傳,不過型別要一樣
public static int add(int a,int b) {
//return 回傳
return a+b;
}
}
執行結果:16
一些分析我寫在注釋里面了,可以自己用Debug除錯一下,看一下16怎么來的
方法的定義及呼叫
方法的定義
Java的方法類似于其他語言的函式,是一段用來完成特定功能的代碼片段,一般情況下,定義一個方法包含一下語法:
方法包含一個方法頭和一個方法體,下面是一個方法的所有部分:
- 修飾符:修飾符,這是可選的,告訴編譯器如何呼叫該方法,定義了該方法的訪問型別,
- 回傳值型別:方法可能會回傳值,returnValueType是方法回傳值的資料型別,有些方法執行所需的操作,但沒有回傳值,這種情況下,returnValue Type 是關鍵字void,
- 方法名:是方法的實際名稱,方法名和引數表共同構成方法簽名,
- 引數型別:引數像是一個占位符,當方法被呼叫時,傳遞值給引數,這個值被稱為實參或變數,引數串列是指方法的引數型別,順序和引數的個數,引數是可選的,方法可以不包含任何引數,
- 形式引數:在方法被呼叫時用于接收外界輸入的資料,
- 實參:呼叫方法時 實際傳給方法的資料,
- 方法體:方法體包含具體的陳述句,定義該方法的功能,
修飾符 回傳值型別 方法名(引數型別 引數名) {
...
方法體
...
return 回傳值;
}
方法存在回傳值的情況下,一定要把回傳值通過return這個關鍵字回傳出去,如果是void就不用return了,
演示(案例比大小):
package com.xiaodi.operator.method;
public class Demo02 {
public static void main(String[] args) {
//呼叫max方法,傳入引數進行比較
int max = max(2,9);
System.out.println(max);
}
//比大小
public static int max(int a,int b) {
int result = 0;
if (a > b) {
result = a;
}else if (a < b) {
result = b;
}else {
System.out.println(a+"=="+b);
return 0; //return除了回傳結果的意思,還有一個意思叫終止方法
}
return result;
}
}
return除了回傳結果的意思,還有一個意思叫終止方法:意思就是方法執行的程序中遇到return的話那么方法將終止執行
max方法中,建議把二者相等這個判斷單獨拿出來做判斷寫在最前面,這樣如果相等了直接就碰到return了終止方法,減少資源
方法的呼叫
呼叫方法:物件名.方法名(實參串列);
? 這個我們還沒學到物件可能大家還不太了解,記不記得我們之前說加static這個修飾符就不用這么麻煩,我們現在還沒學習物件,就先使用static
Java支持兩種呼叫方法的方式,根據方法是否回傳值來選擇,
- 當方法回傳一個值的時候,方法呼叫通常被當作一個值,例如:
int larger = max(30, 40);
- 如果方法沒有回傳值,也就是回傳值是void,方法呼叫一定是一條陳述句,例如:
//println是一個方法
System.out.println("Hello,XiaoDi!");
課后拓展 了解:值傳遞 和 參考傳遞 (Java是值傳遞)
方法的好處會隨著我們學習的深入,逐漸顯現出來!
方法多載
多載就是在一個類中,有相同的函式名稱,但形參不同的函式,
方法多載的規則:
- 方法名稱必須相同,
- 引數串列必須不同(個數不同、或型別不同、引數排序不同)
- 方法的回傳型別也可以相同也可以不相同
- 僅僅回傳型別不同不足以成為方法的多載
實作理論:
- 方法名稱相同時,編譯器會根據呼叫方法的引數個數、引數型別等去逐個匹配,以選擇對應的方法,如果匹配失敗,則編譯器會報錯,
命令列傳參(理解一下概念就好)
有時候你希望運行一個程式的時候再傳遞給它訊息,這要靠傳遞命令列引數給main()函式實作,
args.length:表示這個陣列的長度
package com.xiaodi.operator.method;
public class Demo03 {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]:" + args[i]);
}
}
}
我們去編譯它:
? 到對應檔案的目錄下(D:\代碼\JavaSE\基礎語法\src\com\xiaodi\operator\method>javac Demo03.java)
運行:
? 因為有package com.xiaodi.operator.method;的緣故所以我們要退到com的上一級目錄(src)才能運行否則會報錯,
? D:\代碼\JavaSE\基礎語法\src>java com.xiaodi.operator.method.Demo03 this is xiaodi
回傳:
? args[0]:this
? args[1]:is
? args[2]:xiaodi
可變引數
JDK1.5開始,java支持傳遞同型別的可變引數給一個方法,
在方法宣告中,在指定引數型別后加一個省略號(...),
一個方法中只能指定一個可變引數,它必須是方法的最后一個引數,任何普通引數必須在它之前宣告,傳遞的引數必須是一個型別的
它的本質就是我們下一章要講的陣列
理解一下 下面的代碼:
package com.xiaodi.operator.method;
public class Demo04 {
public static void main(String[] args) {
text(7, 8, 1, 9, 75);
}
public static void text(int... i) {
System.out.println(i[0]);
System.out.println(i[1]);
System.out.println(i[2]);
System.out.println(i[3]);
System.out.println(i[4]);
}
}
i[0]就是陣列的第0個值,也就是第1個,java是從0開始計算的,
示例(輸出最大的引數):
package com.xiaodi.operator.method;
public class Demo05 {
public static void main(String[] args) {
//呼叫可變引數的方法
printMax(23, 47, 12, 82, 45, 2);
//傳遞一組陣列
printMax(new double[]{1, 2, 3});
}
public static void printMax(double... numbers) {
if (numbers.length == 0) {
System.out.println("沒有輸入引數!");
return;
}
double result = numbers[0];
//排序
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("Max value:" + result);
}
}
輸出:
Max value:82.0
Max value:3.0
遞回(經常出現在面試的筆試里)
-
A方法呼叫B方法,我們很容易理解!
-
遞回就是:A方法呼叫A方法,就是自己呼叫自己
-
利用遞回可以用簡單的程式來解決一些復雜的問題,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞回策略只需少量的程式就可以描述出解題程序所需要的多次重復計算,大大地減少了程式的代碼量,遞回的能力在于用有限的陳述句來定義物件的無限集合,
遞回結構包含兩個部分:
- 遞回頭:什么時候不呼叫自身的方法,如果沒有頭,將陷入死回圈,
- 遞回體:什么時候需要呼叫自身的方法,
有上過大學的肯定知道階乘這個東西
階乘就是:
? 2! 2x1
? 3! 3x2x1
? 5! 5x4x3x2x1
我們使用代碼遞回的方法實作一下:
package com.xiaodi.operator.method;
public class Demo06 {
public static void main(String[] args) {
System.out.println(f(2));
}
public static int f(int n) {
if (n==1) {
return 1;
}else {
return n*f(n-1);
}
}
}
如上代碼:
- 呼叫f方法求2的階乘,2不等于1所以走else這條分支,回傳 n乘于呼叫自己本身方法減去當前求的階乘減去1
- 現在已知的是n乘為2乘;f(n-1)為f(2-1)為f(1)
- f(1)走if這條分支,回傳 1
- 所以因為f(n-1)為1
- 所以2的階乘為 2*1為1
能不用遞回,就不用遞回;因為如果遇到基數比較大的時候,非常耗費資源
本章作業:寫一個計算器,要求實作加減乘除功能,并且能夠回圈接收新的資料,通過用戶互動實作,
思路推薦:
- 寫4個方法:加減乘除
- 利用回圈+switch進行用戶互動
- 傳遞需要操作的兩個數
- 輸出結果
我相信只要用心去寫大家都能寫出來的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440482.html
標籤:Java
上一篇:同步鎖筆記
