Java基礎語法(方法)
Java基礎語法
今日內容介紹
u 方法
第1章 方法
1.1 方法概述
在我們的日常生活中,方法可以理解為要做某件事情,而采取的解決辦法。
如:小明同學在路邊準備坐車來學校學習。這就面臨著一件事情(坐車到學校這件事情)需要解決,解決辦法呢?可采用坐公交車或坐出租車的方式來學校,那麽,這種解決某件事情的辦法,我們就稱為方法。
在java中,方法就是用來完成解決某件事情或實現某個功能的辦法。
方法實現的過程中,會包含很多條語句用於完成某些有意義的功能——通常是處理文本,控制輸入或計算數值。
我們可以通過在程序代碼中引用方法名稱和所需的參數,實現在該程序中執行(或稱調用)該方法。方法,一般都有一個返回值,用來作為事情的處理結果。
1.2 方法的語法格式
在Java中,聲明一個方法的具體語法格式如下:
修飾符 返回值類型 方法名(參數類型 參數名1,參數類型 參數名2,......){
執行語句
………
return 返回值;
}
對於上面的語法格式中具體說明如下:
l 修飾符:方法的修飾符比較多,有對訪問權限進行限定的,有靜態修飾符static,還有最終修飾符final等,這些修飾符在後面的學習過程中會逐步介紹
l 返回值類型:用於限定方法返回值的數據類型
l 參數類型:用於限定調用方法時傳入參數的數據類型
l 參數名:是一個變量,用於接收調用方法時傳入的數據
l return關鍵字:用於結束方法以及返回方法指定類型的值
l 返回值:被return語句返回的值,該值會返回給調用者
需要特別註意的是,方法中的“參數類型 參數名1,參數類型 參數名2”被稱作參數列表,它用於描述方法在被調用時需要接收的參數,如果方法不需要接收任何參數,則參數列表為空,即()內不寫任何內容。方法的返回值必須為方法聲明的返回值類型,如果方法中沒有返回值,返回值類型要聲明為void,此時,方法中return語句可以省略。
接下來通過一個案例來演示方法的定義與使用,如下圖所示。MethodDemo01.java
public class MethodDemo01 {
public static void main(String[] args) {
int area = getArea(3, 5); // 調用 getArea方法
System.out.println(" The area is " + area);
}
// 下面定義了一個求矩形面積的方法,接收兩個參數,其中x為高,y為寬
public static int getArea(int x, int y) {
int temp = x * y; // 使用變量temp記住運算結果
return temp; // 將變量temp的值返回
}
}
運行結果如下圖所示。
圖1-1 運行結果
在上述代碼中,定義了一個getArea()方法用於求矩形的面積,參數x和y分別用於接收調用方法時傳入的高和寬,return語句用於返回計算所得的面積。在main()方法中通過調用getArea()方法,獲得矩形的面積,並將結果打印。
1.3 方法調用圖解
接下來通過一個圖例演示getArea()方法的整個調用過程,如下圖所示。
圖1-2 getArea()方法的調用過程
從上圖中可以看出,在程序運行期間,參數x和y相當於在內存中定義的兩個變量。當調用getArea()方法時,傳入的參數3和5分別賦值給變量x和y,並將x*y的結果通過return語句返回,整個方法的調用過程結束,變量x和y被釋放。
1.4 方法定義練習
分別定義如下方法:
定義無返回值無參數方法,如打印3行,每行3個*號的矩形
定義有返回值無參數方法,如鍵盤錄入得到一個整數
定義無返回值有參數方法,如打印指定M行,每行N個*號的矩形
定義有返回值有參數方法,如求三個數的平均值
l 無返回值無參數方法,如打印3行,每行3個*號的矩形
public static void printRect(){
//打印3行星
for (int i=0; i<3; i++) {
//System.out.println("***"); 相當於是打印3顆星,換行
//每行打印3顆星
for (int j=0; j<3; j++) {
System.out.print("*"); // ***
}
System.out.println();
}
}
l 有返回值無參數方法,如鍵盤錄入得到一個整數
public static int getNumber(){
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
return number;
}
l 無返回值有參數方法,如打印指定M行,每行N個*號的矩形
public static void printRect2(int m, int n){
//打印M行星
for (int i=0; i<m; i++) {
//每行中打印N顆星
for (int j=0; j<n; j++) {
System.out.print("*");
}
System.out.println();
}
}
l 有返回值有參數方法,如求三個數的平均值
public static double getAvg(double a, double b, double c) {
double result = (a+b+c)/3;
return result;
}
1.5 方法的重載
我們假設要在程序中實現一個對數字求和的方法,由於參與求和數字的個數和類型都不確定,因此要針對不同的情況去設計不同的方法。接下來通過一個案例來實現對兩個整數相加、對三個整數相加以及對兩個小數相加的功能,具體實現如下所示。MethodDemo02.java
public class MethodDemo02 {
public static void main(String[] args) {
// 下面是針對求和方法的調用
int sum1 = add01(1, 2);
int sum2 = add02(1, 2, 3);
double sum3 = add03(1.2, 2.3);
// 下面的代碼是打印求和的結果
System.out.println("sum1=" + sum1);
System.out.println("sum2=" + sum2);
System.out.println("sum3=" + sum3);
}
// 下面的方法實現了兩個整數相加
public static int add01(int x, int y) {
return x + y;
}
// 下面的方法實現了三個整數相加
public static int add02(int x, int y, int z) {
return x + y + z;
}
// 下面的方法實現了兩個小數相加
public static double add03(double x, double y) {
return x + y;
}
}
運行結果如下圖所示。
圖1-3 運行結果
從上述代碼不難看出,程序需要針對每一種求和的情況都定義一個方法,如果每個方法的名稱都不相同,在調用時就很難分清哪種情況該調用哪個方法。
為了解決這個問題,Java允許在一個類中定義多個名稱相同的方法,但是參數的類型或個數必須不同,這就是方法的重載。
下面的三個方法互為重載關系
l public static int add(int x,int y) {邏輯} //兩個整數加法
l public static int add(int x,int y,int z) {邏輯} //三個整數加法
l public static int add(double x,double y) {邏輯} //兩個小數加法
接下來通過方法重載的方式進行修改,如下所示。MethodDemo03.java
public class MethodDemo03 {
public static void main(String[] args) {
// 下面是針對求和方法的調用
int sum1 = add(1, 2);
int sum2 = add(1, 2, 3);
double sum3 = add(1.2, 2.3);
// 下面的代碼是打印求和的結果
System.out.println("sum1=" + sum1);
System.out.println("sum2=" + sum2);
System.out.println("sum3=" + sum3);
}
// 下面的方法實現了兩個整數相加
public static int add(int x, int y) {
return x + y;
}
// 下面的方法實現了三個整數相加
public static int add(int x, int y, int z) {
return x + y + z;
}
// 下面的方法實現了兩個小數相加
public static double add(double x, double y) {
return x + y;
}
}
MethodDemo02.java的運行結果和MethodDemo03.java一樣,如下圖所示。
圖1-4 運行結果
上述代碼中定義了三個同名的add()方法,它們的參數個數或類型不同,從而形成了方法的重載。
在main()方法中調用add()方法時,通過傳入不同的參數便可以確定調用哪個重載的方法,如add(1,2)調用的是兩個整數求和的方法。值得註意的是,方法的重載與返回值類型無關,它只有兩個條件,一是方法名相同,二是參數個數或參數類型不相同。
1.5.1 重載的註意事項
l 重載方法參數必須不同:
參數個數不同,如method(int x)與method(int x,int y)不同
參數類型不同,如method(int x)與method(double x)不同g
參數順序不同,如method(int x,double y)與method(double x,int y)不同
l 重載只與方法名與參數類型相關與返回值無關
如void method(int x)與int method(int y)不是方法重載,不能同時存在
l 重載與具體的變量標識符無關
如method(int x)與method(int y)不是方法重載,不能同時存在
1.5.2 參數傳遞
參數傳遞,可以理解當我們要調用一個方法時,我們會把指定的數值,傳遞給方法中的參數,這樣方法中的參數就擁有了這個指定的值,可以使用該值,在方法中運算了。這種傳遞方式,我們稱為參數傳遞。
l 在這裏,定義方法時,參數列表中的變量,我們稱為形式參數
l 調用方法時,傳入給方法的數值,我們稱為實際參數
我們看下面的兩段代碼,來明確下參數傳遞的過程:
public class ArgumentsDemo01 {
public static void main(String[] args) {
int a=5;
int b=10;
change(a, b);//調用方法時,傳入的數值稱為實際參數
System.out.println("a=" + a);
System.out.println("b=" + b);
}
public static void change(int a, int b){//方法中指定的多個參數稱為形式參數
a=200;
b=500;
}
}
程序的運行結果如下:
再看另一段代碼
public class ArgumentsDemo02 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
change(arr);// 調用方法時,傳入的數值稱為實際參數
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void change(int[] arr) {// 方法中指定的多個參數稱為形式參數
for (int i = 0; i < arr.length; i++) {
arr[i] *= 2;
}
}
}
程序的運行結果如下:
1.5.3 參數傳遞圖解與結論
通過上面的兩段程序可以得出如下結論:
l 當調用方法時,如果傳入的數值為基本數據類型(包含String類型),形式參數的改變對實際參數不影響
l 當調用方法時,如果傳入的數值為引用數據類型(String類型除外),形式參數的改變對實際參數有影響
第2章 隨機點名器案例
2.1 案例介紹
隨機點名器,即在全班同學中隨機的打印出一名同學名字。
要做的隨機點名器,它具備以下3個內容:
l 存儲所有同學姓名
l 總覽全班同學姓名
l 隨機點名其中一人,打印到控制臺
2.2 案例需求分析
在全班同學中隨機的打印出一名同學名字。
我們對本案例進行分析,得出如下分析結果:
1.存儲全班同學名字
2.打印全班同學每一個人的名字
3.在班級總人數範圍內,隨機產生一個隨機數,查找該隨機數所對應的同學名字
該案例須有以下3個內容:
l 存儲所有同學姓名
l 總覽全班同學姓名
l 隨機點名其中一人,打印到控`制臺
隨機點名器明確地分為了三個功能。如果將多個獨立功能的代碼寫到一起,則代碼相對冗長,我們可以針對不同的功能可以將其封裝到一個方法中,將完整獨立的功能分離出來。
而在存儲同學姓名時,如果對每一個同學都定義一個變量進行姓名存儲,則會出現過多孤立的變量,很難一次性將全部數據持有。此時,我們可以使用數組解決多個數據的存儲問題。
2.3 實現代碼步驟
編寫CallName.java文件,完成程序的編寫。
l main方法中調用三個獨立方法
public static void main(String[] args) {
System.out.println("--------隨機點名器--------");
// 創建一個存儲多個同學名字的容器(數組)
String[] students = new String[3];
/*
* 1.存儲全班同學名字
*/
addStudentName(students);
/*
* 2.打印全班同學每一個人的名字
*/
printStudentName(students);
/*
* 3.獲取隨機點名到的學生姓名,並打印
*/
String randomName = randomStudentName(students);
System.out.println("被點到名的同學是 :" + randomName);
}
l 1.存儲所有同學姓名
/**
* 1.存儲全班同學名字
* 創建一個存儲多個同學名字的容器(數組)
* 鍵盤輸入每個同學的名字,存儲到容器中(數組)
*/
public static void addStudentName(String[] students) {
//鍵盤輸入多個同學名字存儲到容器中
Scanner sc = new Scanner(System.in);
for (int i = 0; i < students.length; i++) {
System.out.println("存儲第"+i+"個名稱:");
students[i] = sc.next();
}
}
上述方法中,通過鍵盤錄入,完成為指定數組元素賦值。方法定義時,將參數定義為字符串數組,用於接收存放的同學姓名。
l 打印全班同學每一個人的名字
/**
* 2打印全班同學每一個人的名字
*/
public static void printStudentName(String[] students) {
//遍歷數組,得到每個同學名字
for (int i = 0; i < students.length; i++) {
String name = students[i];
//打印同學名字
System.out.println("第"+i+"個學生名稱:" + name);
}
}
上述方法中,方法參數students數組中存儲了所有學生的姓名。通過遍歷將數組中的每一個元素訪問一遍,得到每一個同學名稱。
l 3.獲取隨機點到的學生姓名
/**
* 3.在班級總人數範圍內,隨機產生一個隨機數,返回隨機數位置上的學生姓名
*/
public static String randomStudentName(String[] students) {
//根據數組長度,獲取隨機索引
int index = new Random().nextInt(students.length);
//通過隨機索引從數組中獲取名稱
String name = students[index];
//返回隨機點到的名稱
return name;
}
上述方法中,通過隨機數類Random產生一個從0到數組長度的隨機索引。使用該索引獲取students數組中對應的值,便得到了全班同學的隨機姓名。
第3章 庫存管理案例
3.1 案例介紹
現在,我們將原有的庫存管理案例,進行業務邏輯的封裝。
將對下列功能進行方法封裝:
l 打印庫存清單功能
l 庫存商品數量修改功能
l 退出程序功能
3.2 案例需求分析
管理員能夠進行的操作有3項(查看、修改、退出),我們可以采用(switch)菜單的方式來完成。
-------------庫存管理------------
1.查看庫存清單
2.修改商品庫存數量
3.退出
請輸入要執行的操作序號:
每一項功能操作,我們采用方法進行封裝,這樣,可使程序的可讀性增強。
選擇“1.查看庫存清單”功能,則控制臺打印庫存清單
選擇“2.修改商品庫存數量”功能,則對每種商品庫存數進行更新
選擇“3.退出”功能,則退出庫存管理,程序結束
3.3 實現代碼步驟
編寫代碼Demo庫存管理.java,完成如下功能:
l 功能菜單
/**
* 庫存管理功能菜單
* @return 管理員鍵盤輸入的功能操作序號
*/
public static int chooseFunction() {
System.out.println("-------------庫存管理------------");
System.out.println("1.查看庫存清單");
System.out.println("2.修改商品庫存數量");
System.out.println("3.退出");
System.out.println("請輸入要執行的操作序號:");
//接收鍵盤輸入的功能選項序號
Scanner sc = new Scanner(System.in);
int choose = sc.nextInt();
return choose;
}
上述方法用來完成庫存管理功能菜單的顯示、接收管理員選擇的功能操作序號。這是完成了案例的第一步。接下來完成“查看、修改、退出”這三項功能。
l 編寫main主方法,調用庫存管理功能菜單方法,與“查看、修改、退出”這三個方法。
public static void main(String[] args) {
//記錄庫存商品信息
//品牌型號
String[] brands = new String[]{"MacBookAir", "ThinkpadT450"};
//尺寸大小
double[] sizes = new double[]{13.3, 14.0};
//價格
double[] prices = new double[]{6988.88, 5999.99};
//庫存個數
int[] counts = new int[]{0, 0};
//通過while循環模擬管理員進行功能重復選擇操作
while (true) {
//打印功能菜單操作,接收鍵盤輸入的功能選項序號
int choose = chooseFunction();
//執行序號對應的功能
switch (choose) {
case 1://查看庫存清單
printStore(brands, sizes, prices, counts);
break;
case 2://修改商品庫存數量
update(brands, counts);
break;
case 3://退出
exit();
return;
default:
System.out.println("----------------------------------");
System.out.println("功能選擇有誤,請輸入正確的功能序號!");
break;
}
}
}
在主方法中,創建了5個數組,分別用來存儲商品的品牌型號、尺寸大小、價格、配置、庫存個數,通過接收到的功能選項序號,進行switch語句判斷後,調用對應的功能方法。
l 查看庫存清單功能
/**
* 查看庫存清單
* @param brands 商品品牌型號
* @param sizes 商品尺寸大小
* @param prices 商品價格
* @param counts 商品庫存個數
*/
public static void printStore(String[] brands, double[] sizes, double[] prices, int[] counts) {
//統計總庫存個數、統計庫存總金額
int totalCount = 0;
double totalMoney = 0.0;
for (int i = 0; i < brands.length; i++) {
totalCount += counts[i];
totalMoney += counts[i] * prices[i];
}
//列表頂部
System.out.println("---------------------------查看庫存清單--------------------------");
System.out.println("品牌型號 尺寸 價格 庫存數");
//列表中部
for (int i = 0; i < brands.length; i++) {
System.out.println(brands[i]+" "+sizes[i]+" "+prices[i]+" "++counts[i]);
}
//列表底部
System.out.println("-------------------------------------------------------------");
System.out.println("總庫存數:"+totalCount);
System.out.println("庫存商品總金額:"+totalMoney);
}
上述方法用來完成打印庫存清單功能,5個方法參數用來打印的庫存商品相關信息
l 修改商品庫存數量功能
/**
* 修改商品庫存數量
* @param brands 商品品牌型號
* @param counts 商品庫存個數
*/
public static void update(String[] brands, int[] counts){
System.out.println("------------修改商品庫存數量-----------");
for (int i = 0; i < brands.length; i++) {
System.out.println("請輸入"+ brands[i] +"商品庫存數");
counts[i] = new Scanner(System.in).nextInt();
}
}
上述方法用來完成修改商品庫存數量功能,2個方法參數用來指定所要修改的商品與庫存數
l 退出功能
/**
* 退出
*/
public static void exit(){
System.out.println("----------------退出---------------");
System.out.println("您已退出系統");
}
上述方法用來完成退出程序的功能
第4章 總結
4.1 知識點總結
l 方法
l 格式:
修飾符 返回值類型 方法名(參數類型 參數名1, 參數類型 參數名2, ...) {
方法體;
return 返回值;
}
l 方法使用的註意事項:
1,方法不調用,自己不執行
2,方法中不能定義方法, 但是,方法中可以調用方法
3, 方法定義的位置在類中,其他方法的外面
4, 如果方法沒有明確的返回值類型,使用‘空‘類型, void表示
5,void只能在方法返回值類型位置使用,不能作為 普通的數據類型使用
6, 如果方法返回值類型為void類型,可以省略 return ;
l 方法調用方式:
有明確返回值類型的方法調用方式:
1,單獨調用
2,輸出調用
3,賦值調用
沒有明確返回值類型的方法調用方式:
1, 單獨調用
l 方法重載:
方法重載,在同一個類中,出現了多個同名的方法,他們的參數列表不同 (參數列表的個數不同,參數列表的數據類型不同,參數列表的順序不同)。
方法重載特點:
與方法的返回值類型無關,與方法的參數名無關,只看方法名與參數列表;
方法重載,是通過JVM來完成同名方法的調用的,通過參數列表來決定調用的是哪一個方法。
Java基礎語法(方法)