本章目錄
9.1 有參數有返回值的方法
定義方法的目的:
是爲了實現特定功能或進行某種運算,無論是實現功能,還是執行運算,都會產生一個結果,而這個結果需要反饋給調用方。
對於方法產生的結果則可通過返回值反饋給調用方。
存在返回值的方法一般有兩種形式:無參數有返回值的方法和有參數有返回值的方法。
9.1.1 有參數有返回值的方法的定義和調用
語法:有參數有返回值方法的定義
訪問修飾符 返回值類型 方法名(形式參數列表){
方法體;
return 表達式;
}
語法:有參數有返回值方法的調用:
數據類型 變量名 = 方法名(實際參數列表);
方法的返回值也稱爲方法值,通過被調方法中的return 語句實現。
return;或return 表達式;
return 語句是跳轉語句,其主要作用如下:
結束被調方法的執行,返回主調方法。
返回一個表達式的值,該值將作爲方法調用過程中方法的返回值。
示例:編寫程序,在控制檯輸入一個年份,判斷該年份是否爲閏年並輸出結果。要求定義方法實現閏年的判斷,並返回判斷結果。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(" 請輸入一個年份:");
int year = sc.nextInt();
// 調用方法,並接受返回值
LeapYearDemo lyd = new LeapYearDemo();
boolean result = lyd.isLeapYear(year);
if (result == true)
System.out.printf("%d 爲閏年 \n", year);
else
System.out.printf("%d 爲平年 \n", year);
}
9.1.2 返回值的傳遞過程
方法調用時返回值傳遞的過程
說明:
- 返回值傳遞的時機:在被調方法執行完畢返回主調方法時。
- 返回值傳遞的過程:接收返回值的變量 = return 語句之後的表達式的值。
- 返回值傳遞的意義:將數據從被調方法傳遞至主調方法的一種方式。
9.1.3 方法返回值的注意事項
(1)方法可以沒有返回值,也可以存在返回值,但最多隻能存在一個返回值。
(2)方法的返回值可以爲變量、常量以及表達式。
(3)在無返回值方法中,方法體內可以沒有return 語句,當被調方法執行完畢後,將自動返回至主調方法。也可以使用“return;”語句,結束被調方法的執行,返回主調方法。
(4)在有返回值方法中,方法體中必須包含“return 表達式;”語句。
(5)方法體中返回值的數據類型必須與方法中定義時指定的返回值類型相匹配。
(6)使用條件結構時,必須保證每一個分支都包含返回值。
9.1.4 實踐練習
9.2 參數的數據類型
Java 的數據類型分爲值類型和引用類型,這兩種類型在作爲參數使用時是有區別的。
9.2.1 值類型的參數
值類型的參數:
當方法的參數是值類型時,因爲值類型變量裏存放的即變量的值,形參和實參會完成變量值的拷貝。當方法內代碼完成形參值的改變時,實參不會同步改變
示例:修改示例,定義方法實現提薪功能,每位員工的工資漲幅均爲20%。
//定義方法實現員工的提薪功能
public void changeValue(int val) {
System.out.println("方法內改變前" + num);
val++;
System.out.println("方法內改變後" + num);
}
MethodParameterDemo mpd = new MethodParameterDemo();
nt num = 100;
System.out.println("調用方法前" + num);
mpd.changeValue(num);
System.out.println("調用方法後" + num);
分析:調用方法時,實參爲形參賦值,形參的值發生變化,而實參沒有被改變。
值類型的參數,形參改變不會影響實參。
如果開發中參數必須是值類型,但又想通過方法改變,該怎麼解決呢?
示例:
public int changeVal(int val) {
val++;
return val;
}
MethodParameterDemo mpd = new MethodParameterDemo();
int num = 100;
System.out.println(" 調用方法前 " + num);
num = mpd.changeVal(num);
System.out.println(" 調用方法後 " + num);
9.2.2 引用類型的參數
- Java中的引用類型變量裏存儲的是對象的內存地址,通過內存地址可以訪問到對象的屬性和方法。
- 當引用類型變量完成相互賦值時,即完成對象地址的拷貝,而非對象屬性的拷貝。
示例:
public class Person {
int id;
String name;
public Person() {
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
}
public static void main(String[] args) {
Person p1 = new Person(1, "zhangsan");
Person p2 = p1;
System.out.printf("改變前p1的名字是%s,p2的名字是%s\n", p1.name, p2.name);
p2.name = "lisi";
System.out.printf("改變後p1的名字是%s,p2的名字是%s\n", p1.name, p2.name);
}
Person類型爲引用類型。變量p1裏存放的是內存地址,賦值時兩個變量裏的地址相同,指向同一個對象。
當我們將引用類型作爲方法參數使用時,因爲參數的數據類型爲引用類型,變量裏存放的是對象的內存地址,所以形參和實參實際是同一個對象,改變實參的值,形參也會改變。
示例:
public void changeName(Person p){
if(p != null){
p.name = " 宮城詩 ";
}
}
Person p1 = new Person(1, " 程旭媛 ");
System.out.println(" 調用方法前 p1 的姓名爲 "+p1.name);
MethodParameterDemo2 mpd2 = new MethodParameterDemo2();
mpd2.changeName(p1);
System.out.println(" 調用方法後 p1 的姓名爲 "+p1.name);
分析:在執行方法時,實參爲形參賦值,因爲p1對象爲引用類型,所以賦值的是對象的內存地址,實參和形參指向的是同一個對象,因此同時改變。
有參方法的調用實際就是實參爲形參賦值的過程,形參和實參取值是否同步取決於參數的數據類型,當參數是值類型時,形參和實參的取值是不同步的,當參數是引用類型時,形參和實參的取值是同步的。
9.2.4 實踐練習
9.3 深入理解方法
9.3.1 質數的判斷
示例:在控制檯中輸出50~100之間的所有質數。質數是指只能被1和本身整除的數字。例如,7只能被1、7 整除,所以 7 爲質數。要求:判斷質數的方法實現。
分析:
定義方法isPrimeNumber(),用於實現指定數字是否爲質數的判斷。
方法簽名:public bool IsPrimeNumber(int num)
方法體:質數的判斷過程,可使用循環結構實現,從2開始直到num-1,逐一判斷是否存在能夠整除num的數字,若不存在,則當前數字爲質數,否則爲非質數。
// 參數 num:需要判斷的數字
// 返回值:是否爲質數,true:質數,false:非質數
public boolean isPrimeNumber(int num) {
// 聲明變量,判斷結果
boolean result = true;
// 使用循環,從 2 到 num-1 之間所有數字與 num 進行除法運算
// 若存在能夠整除 num 的數字,則 num 爲非質數
for (int i = 2; i < num; i++) {
if (num % i == 0) {// 存在整除 num 的數字,num 爲非質數,判斷結果爲 false
result = false;
break; // 跳出循環
}
}
// 返回判斷結果
return result;
}
public static void main(String[] args) {
PrimeNumDemo pnm = new PrimeNumDemo();
System.out.println("50 ~ 100 之間所有的質數:");
for (int i = 50; i <= 100; i++) {
// 調用方法,逐一判斷 50 ~ 100 之間所有的數字是否爲質數
if (pnm.isPrimeNumber(i))
System.out.println(i);
}
}
9.3.2 水仙花數的判斷
示例:用戶在控制檯輸入一個三位數字,判斷該數字是否爲水仙花數。
分析:
定義方法isNarcissus,用戶判斷參數數字是否爲水仙花數,如果是返回true否則返回false。
水仙花數是一個三位數字,三位數字的立方之和等於數字本身。
根據方法功能分析可知,方法isNarcissus需要設置int類型的參數num,表示需要判斷的數字,判斷後的結果,可通過返回值實現,因此方法isNarcissus的方法簽名如下:
public boolean isNarcissus (int num)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個三位數");
int num = sc.nextInt();
NarcissusDemo nd = new NarcissusDemo();
boolean result = nd.isNarcissus(num);
if(result){
System.out.println("您輸入的是一個水仙花數");
}
else{
System.out.println("您輸入的不是水仙花數");
}
}
9.3.3 實踐練習
9.4 方法的使用
9.4.1模擬程序菜單
示例:定義菜單類,在菜單中封裝登錄菜單與登錄後的主菜單。
分析:
定義類。
定義顯示登錄菜單和主菜單的方法。
public int loginMenu()
public int mainMenu()
編寫方法體。
import java.util.Scanner;
public class Menu {
//定義顯示登錄菜單的方法
public int loginMenu() {
Scanner input = new Scanner(System.in);
int choose = 0;
System.out.println("******************************");
System.out.println("\t1.系統登錄");
System.out.println("\t2.退出系統");
System.out.println("*******************************");
System.out.print("請輸入選項:");
return choose = input.nextInt();
}
//定義顯示主菜單的方法
public int mainMenu() {
Scanner input = new Scanner(System.in);
int choose = 0;
System.out.println("\t歡迎進入電子商務系統");
System.out.println("************************************");
System.out.println("\t1.查看商品");
System.out.println("\t2.我的購物車");
System.out.println("\t3.購物結算");
System.out.println("\t4.註銷");
System.out.println("************************************");
System.out.print("請輸入選項:");
return choose = input.nextInt();
}
public static void main(String[] args) {
Menu m = new Menu();
int choose = m.loginMenu();
switch (choose) {
case 1:
choose = m.mainMenu();
switch (choose) {
case 1:
System.out.println("開始查看商品");
break;
case 2:
System.out.println("瀏覽購物車");
break;
case 3:
System.out.println("開始購物結算");
break;
case 4:
System.out.println("註銷中……");
break;
}
break;
case 2:
System.out.println("系統退出,期待您的再次使用!");
break;
}
}
}
9.4.2 模擬銀行存取款
示例:模擬銀行賬戶存取款以及查看餘額功能。要求:將各種業務功能模塊分別定義方法實現。
分析:
定義方法queryBalance,用於實現查詢餘額功能。方法queryBalance的方法簽名如下:
public void queryBalance(int balance)
定義方法deposit,用於實現存款功能,方法Deposit的方法簽名如下:
public int deposit (int balance)
定義方法withdrawal,用於實現取款功能。方法Withdrawal的方法簽名如下:
public int withdrawal(int balance)
在main方法中實現程序的執行流程,並在對應操作中調用方法即可。
import java.util.Random;
import java.util.Scanner;
public class BankDemo {
//取款功能
public int withdrawal(int balance) {
Scanner sc = new Scanner(System.in);
System.out.println("---------取款---------");
System.out.println("請輸入取款金額:");
int money = sc.nextInt();
if (balance > money) {
balance -= money;
System.out.println("取款成功");
} else {
System.out.println("餘額不足,取款失敗");
}
return balance;
}
//存款功能
public int deposit(int balance) {
Scanner sc = new Scanner(System.in);
System.out.println("---------存款---------");
System.out.println("請輸入存款金額:");
int money = sc.nextInt();
balance += money;
System.out.println("存款成功");
return balance;
}
//查詢餘額功能
public void queryBalance(int balance) {
System.out.println("---------查詢---------");
System.out.println("您的餘額:" + balance);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BankDemo bd = new BankDemo();
int choose;
Random rdm = new Random();
int balance = rdm.nextInt(1000);// 餘額爲0~999之間的數字
System.out.println("服務種類:");
System.out.println("【1】查看餘額");
System.out.println("【2】取款");
System.out.println("【3】存款");
System.out.println("【0】退出");
//省略其他菜單
do {
System.out.println("請選擇:");
choose = sc.nextInt();
switch (choose) {
case 1:
bd.queryBalance(balance);
break;
case 2:
bd.withdrawal(balance);
break;
case 3:
bd.deposit(balance);
break;
case 0:
System.out.println("歡迎下次繼續使用!");
break;
default:
System.out.println("您輸入的有誤,請重新輸入");
}
} while (choose != 0);
}
}
9.4.3 實踐練習
總結:
- return 語句是Java語言中的跳轉語句,主要作用:結束被調方法的執行,返回主調方法;返回一個表達式的值;
- 返回值傳遞的過程其實就是一個賦值的過程,將return 語句之後的表達式的值賦值給主調方法中用於接收返回值的變量。
- 方法可以沒有返回值,也可以存在返回值,但最多隻能存在一個返回值。
- 值類型變量裏存放的時值本身,引用類型變量裏存放的時地址。
- 當參數是值類型時,形參和實參的取值是不同步的,當參數是引用類型時,形參和實參的取值是同步的。