第5天 Java基礎語法
今日內容介紹 1、方法基礎知識 2、方法高階內容 3、方法案例 第1章 方法 1.1 方法概述 在我們的日常生活中,方法可以理解為要做某件事情,而採取的解決辦法。 如:小明同學在路邊準備坐車來學校學習。這就面臨著一件事情(坐車到學校這件事情)需要解決,解決辦法呢?可採用坐公交車或坐計程車的方式來學校,那麼,這種解決某件事情的辦法,我們就稱為方法。 在java中,方法就是用來完成解決某件事情或實現某個功能的辦法。 方法實現的過程中,會包含很多條語句用於完成某些有意義的功能——通常是處理文字,控制輸入或計算數值。 我們可以通過在程式程式碼中引用方法名稱和所需的引數,實現在該程式中執行(或稱呼叫)該方法。方法,一般都有一個返回值,用來作為事情的處理結果。 1.2 方法的語法格式 在Java中,宣告一個方法的具體語法格式如下:
修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2,......){
執行語句
………
return 返回值;
}
對於上面的語法格式中具體說明如下: 修飾符:方法的修飾符比較多,有對訪問許可權進行限定的,有靜態修飾符static,還有最終修飾符final等,這些修飾符在後面的學習過程中會逐步介紹 返回值型別:用於限定方法返回值的資料型別 引數型別:用於限定呼叫方法時傳入引數的資料型別 引數名:是一個變數,用於接收呼叫方法時傳入的資料 return關鍵字:用於結束方法以及返回方法指定型別的值 返回值:被return語句返回的值,該值會返回給呼叫者 需要特別注意的是,方法中的“引數型別 引數名1,引數型別 引數名2”被稱作引數列表,它用於描述方法在被呼叫時需要接收的引數,如果方法不需要接收任何引數,則引數列表為空,即() 內不寫任何內容。方法的返回值必須為方法宣告的返回值型別,如果方法中沒有返回值,返回值型別要宣告為void,此時,方法中return語句可以省略。 接下來通過一個案例來演示方法的定義與使用,如下圖所示。MethodDemo01.java
/* 方法的定義格式: 修飾符 返回值型別 方法的名字(引數列表...){ 方法的功能主體 迴圈,判斷,變數,比較,運算 return } 修飾符:固定寫法 public static 返回值型別:方法在運算後,結果的資料型別 方法名:自定義名字,滿足識別符號規範,方法名字首字母小寫,後面每個單詞首字母大寫 引數列表:方法的運算過程中,是否有未知的資料,如果有未知的資料,定義在引數列表上(定義變數) return:方法的返回,將計算的結果返回,結束方法 */ public class MethodDemo{ public static void main(String[] args){ //呼叫方法,方法執行起來 //在方法main中,呼叫方法getArea int a = 5; int b = 6; //呼叫者,呼叫方法的時候,是實際引數 實際變數 int area = getArea(a,b); System.out.println("面積是:" + area); } /* 要求:計算一個長方形的面積 定義方法解決這個要求 分析方法定義過程: 1.明確方法計算後的結果的資料型別int 定義格式對應的就是返回值型別 2.方法計算過程中,有沒有未知的資料,寬和長,未知資料的型別的資料型別int 未知數的變數,定義在方法的小括號內(作為引數列表) */ //方法定義位置,類中方法外 //被呼叫者,被呼叫的時候,是形式引數,實際變數 //方法定義是沒有順序,寫main方法程式的上面和下面都可以 public static int getArea(int width,int height){ //實現方法的功能主體 //int area = width * height; //return area; return width * height; } }
1.3 方法呼叫圖解 接下來通過一個圖例演示getArea()方法的整個呼叫過程,如下圖所示。
1.4 方法定義練習 分別定義如下方法: 定義無返回值無引數方法,如列印3行,每行3個號的矩形 定義有返回值無引數方法,如鍵盤錄入得到一個整數 定義無返回值有引數方法,如列印指定M行,每行N個號的矩形 定義有返回值有引數方法,如求三個數的平均值
/*
方法的定義練習
*/
//Scanner類使用步驟
//S1:導包
import java.util.Scanner;
public class MethodDemo_1{
//主方法放哪個位置都可以,但是為了閱讀方便,一般放在首位
public static void main(String[] args){
printRec();
System.out.println("====================================");
int number = getNumber();
System.out.println(number);
System.out.println("====================================");
printRec2(3,5);
System.out.println("====================================");
int avg = getAvg(5,6,7);
System.out.println("三個數平均數:" + avg);
}
/*
定義有返回值有引數方法,如求三個數的平均值
明確方法計算後的資料型別,返回值型別int
明確方法未知數,三個未知的整數
*/
public static int getAvg(int a,int b,int c){
return (a + b + c) / 3;
}
/*
定義無返回值有引數方法,如列印指定M行,每行N個*號的矩形
明確方法計算後結果,控制檯輸出圖形,沒有返回值
方法中有沒有未知數,圖形行數和列數,是未知的,資料型別整數int
*/
public static void printRec2(int row,int col){
for(int i = 0;i < row;i++){
for(int j = 0; j < col;j++){
System.out.print("* ");
}
System.out.println();
}
}
/*
定義有返回值無引數方法,如鍵盤錄入得到一個整數
明確方法計算後結果的資料型別 int
明確有沒有未知數,沒有
*/
public static int getNumber(){
//S2:建立物件例項:
Scanner sc = new Scanner(System.in);
//S3:呼叫方法
int number = sc.nextInt();//用來接受控制檯錄入的數字
return number;
}
/*
定義無返回值無引數的方法,如列印3行,每行3個*號的矩形
為什麼沒有返回值:
列印矩形,輸出效果,不需要將結果返回
明確未知數:不需要未知數
*/
public static void printRec(){
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
System.out.print("*");
}
System.out.println();
}
}
}
/*
方法定義和使用的注意事項:
1.方法不能定義在另一個方法的裡面
2.寫錯了方法名字
3.寫錯了引數列表
4.方法的返回值是void,方法中可以省略return不寫
return下面不能有程式碼,根本不會執行
5.方法返回值型別,和return後面資料型別必須匹配
6.方法重複定義問題
7.呼叫方法的時候,返回值的是void,不能寫在輸出語句中
*/
public class MethodDemo_2{
//主方法放哪個位置都可以,但是為了閱讀方便,一般放在首位
public static void main(String[] args){
System.out.print( print());
}
//public static void print(){
// return;//千萬不要加什麼
//int i = 0;//return下面不能有程式碼,根本不會執行
//}
public static int print(){
return 1;//千萬不要加什麼
//int i = 0;//return下面不能有程式碼,根本不會執行
}
//重複定義
//public static void print(){
// return;//千萬不要加什麼
//int i = 0;//return下面不能有程式碼,根本不會執行
//}
}
1.5 方法的過載 我們假設要在程式中實現一個對數字求和的方法,由於參與求和數字的個數和型別都不確定,因此要針對不同的情況去設計不同的方法。接下來通過一個案例來實現對兩個整數相加、對三個整數相加以及對兩個小數相加的功能,具體實現如下所示。
/*
方法的過載特性(Overload)
在同一個類中,允許出現同名的方法,只要方法的引數列表不同即可,這樣的方法就是過載
引數列表不同:引數的個數,資料型別,順序
*/
public class MethodOverloadDemo{
public static void main(String[] args){
//對於過載的呼叫,根據引數傳遞進行區分
//System.out.println();
//int sum = getSum(1,2,3);
//System.out.println(sum);
System.out.println(getSum(1.5,2.3));
}
/*
對引數求和,利用方法的過載特性
*/
public static int getSum(int a, int b){
System.out.println("int getSum(int a, int b)");
return a + b;
}
public static int getSum(int a,int b,int c){//引數個數不一樣
System.out.println("int getSum(int a,int b,int c)");
return a + b + c;
}
public static double getSum(double a,double b){//引數的資料型別不一樣
System.out.println("double getSum(double a,double b)");
return a + b;
}
/*
定義方法,對引數求和
引數,沒規定幾個,資料型別
public static int getSum(int a,int b){
return a + b;
}
public static double getSum02(double a,double b){
return a + b;
}
public static int getSum03(int a,int b,int c){
return a + b;
}*/
}
為了解決這個問題,Java允許在一個類中定義多個名稱相同的方法,但是引數的型別或個數必須不同,這就是方法的過載。 下面的三個方法互為過載關係 public static int add(int x,int y) {邏輯} //兩個整數加法 public static int add(int x,int y,int z) {邏輯} //三個整數加法 public static int add(double x,double y) {邏輯} //兩個小數加法 接下來通過方法過載的方式進行修改,
/*
方法的過載特性(Overload)
在同一個類中,允許出現同名的方法,只要方法的引數列表不同即可,這樣的方法就是過載
引數列表不同:引數的個數,資料型別,順序
*/
public class MethodOverloadDemo{
public static void main(String[] args){
//對於過載的呼叫,根據引數傳遞進行區分
//System.out.println();
//int sum = getSum(1,2,3);
//System.out.println(sum);
System.out.println(getSum(1.5,2.3));
}
/*
對引數求和,利用方法的過載特性
*/
public static int getSum(int a, int b){
System.out.println("int getSum(int a, int b)");
return a + b;
}
public static int getSum(int a,int b,int c){//引數個數不一樣
System.out.println("int getSum(int a,int b,int c)");
return a + b + c;
}
public static double getSum(double a,double b){//引數的資料型別不一樣
System.out.println("double getSum(double a,double b)");
return a + b;
}
/*
定義方法,對引數求和
引數,沒規定幾個,資料型別
public static int getSum(int a,int b){
return a + b;
}
public static double getSum02(double a,double b){
return a + b;
}
public static int getSum03(int a,int b,int c){
return a + b;
}*/
}
1.5.1 過載的注意事項 過載方法引數必須不同: 引數個數不同,如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)不同 過載只與方法名與引數型別相關與返回值無關 如void method(int x)與int method(int y)不是方法過載,不能同時存在 過載與具體的變數識別符號無關 如method(int x)與method(int y)不是方法過載,不能同時存在
/*
方法過載注意事項(Overload)
1.引數列表必須不同
2.過載和引數變數名無關
3.過載和返回值型別無關
4.過載和修飾符無關
技巧:過載看方法名和引數列表
*/
public class MethodOverloadDemo_2{
public static void main(String[] args){
}
public static void method(int a,int b){
}
//3 會報錯
//public static int method(int a,int b){
// return 1;
//}
//4.
void method(int a,int b){
}
//4 會報錯,重複定義
private static void method(int a,int b){
}
}
1.5.2 引數傳遞 引數傳遞,可以理解當我們要呼叫一個方法時,我們會把指定的數值,傳遞給方法中的引數,這樣方法中的引數就擁有了這個指定的值,可以使用該值,在方法中運算了。這種傳遞方式,我們稱為引數傳遞。 在這裡,定義方法時,引數列表中的變數,我們稱為形式引數 呼叫方法時,傳入給方法的數值,我們稱為實際引數 我們看下面的兩段程式碼,來明確下引數傳遞的過程:
/*
方法,呼叫中的引數傳遞問題
1.方法引數是基本資料型別
比喻是:我給你十塊錢,你怎麼花是你的事,跟我沒關係
2.方法引數是引用型別:
比喻是:我把家庭地址告訴你了,你知道俺家地址,到我家倒了一堆灰,那我回家家裡肯定是有一堆灰
傳遞的是地址
*/
public class MethodTransferDemo_1{
public static void main(String[] args){
int a = 1;
int b = 2;
change(a,b);
System.out.println(a);//1
System.out.println(b);//2
}
public static void change(int a,int b){
a = a + b;
b = b + a;
}
}
/*
方法,呼叫中的引數傳遞問題
1.方法引數是基本資料型別
比喻是:我給你十塊錢,你怎麼花是你的事,跟我沒關係
2.方法引數是引用型別:
比喻是:我把家庭地址告訴你了,你知道俺家地址,到我家倒了一堆灰,那我回家家裡肯定是有一堆灰
傳遞的是地址
*/
public class MethodTransferDemo{
public static void main(String[] args){
int[] arr = {1,2,3,4};
System.out.println(arr[2]);
change(arr);
System.out.println(arr[2]);
}
public static void change(int[] arr){
arr[2] = 100;
}
}
通過上面的兩段程式可以得出如下結論: 當呼叫方法時,如果傳入的數值為基本資料型別(包含String型別),形式引數的改變對實際引數不影響 當呼叫方法時,如果傳入的數值為引用資料型別(String型別除外),形式引數的改變對實際引數有影響
第2章 隨機點名器案例 2.1 案例介紹 隨機點名器,即在全班同學中隨機的打印出一名同學名字。 要做的隨機點名器,它具備以下3個內容: 儲存所有同學姓名 總覽全班同學姓名 隨機點名其中一人,列印到控制檯 2.2 案例需求分析 在全班同學中隨機的打印出一名同學名字。 我們對本案例進行分析,得出如下分析結果: 1.儲存全班同學名字 2.列印全班同學每一個人的名字 3.在班級總人數範圍內,隨機產生一個隨機數,查詢該隨機數所對應的同學名字 該案例須有以下3個內容: 儲存所有同學姓名 總覽全班同學姓名 隨機點名其中一人,列印到控`制臺 隨機點名器明確地分為了三個功能。如果將多個獨立功能的程式碼寫到一起,則程式碼相對冗長,我們可以針對不同的功能可以將其封裝到一個方法中,將完整獨立的功能分離出來。 而在儲存同學姓名時,如果對每一個同學都定義一個變數進行姓名儲存,則會出現過多孤立的變數,很難一次性將全部資料持有。此時,我們可以使用陣列解決多個數據的儲存問題。 2.3 實現程式碼步驟 編寫CallName.java檔案,完成程式的編寫。 main方法中呼叫三個獨立方法
/*
隨機點名器:
1.儲存所有學生姓名 新增功能
2.預覽所有學生姓名,遍歷陣列 瀏覽功能
3.隨機數作為索引,到陣列中找到元素 隨機點名功能
將功能獨立出來,作成方法,呼叫方法即可
定義三個功能,用到同一個姓名資料
姓名儲存到陣列中,三個方法,使用一個數組中的資料,方法傳遞引數
*/
//需要鍵盤輸入所有同學姓名
import java.util.Scanner;
import java.util.Random;
public class CallName{
public static void main(String[] args){
//定義陣列,儲存學生姓名
String[] names = new String[3];
System.out.println("============1.新增學生姓名==================");
//1.新增學生姓名
addStudent(names);
System.out.println("============2.遍歷學生姓名==================");
//2.遍歷學生姓名
printStudentName(names);
System.out.println("============3.隨機點名功能===================");
//3.隨機點名功能
String RandomName = randomStudentName(names);
System.out.println(RandomName);
}
/*
定義方法,隨機數,做索引,陣列中找到學生姓名
返回值? 學生姓名
引數? 陣列
*/
public static String randomStudentName(String[] names){
Random ran = new Random();
int index = ran.nextInt(names.length);
return names[index];
}
/*
定義方法,遍歷陣列
返回值?沒有
引數? 陣列
*/
public static void printStudentName(String[] names){
for(int i = 0;i < names.length;i++){
System.out.println(names[i]);
}
}
/*
定義方法,實現向陣列中新增學生姓名
返回值? 沒有
引數? 引數就是陣列
*/
public static void addStudent(String[] names){
//Scanner建立物件例項
Scanner sc = new Scanner(System.in);
//儲存所有同學姓名
//迴圈遍歷接受控制檯錄入的字串
for(int i = 0;i < names.length;i++){
System.out.println("接受第" + i + "同學姓名");
names[i] = sc.next();//接受錄入的字串
}
}
}
/*
實現商品的庫存管理:
功能:
1.展示使用者選擇功能的清單
2.根據選擇的功能編號,進行不同的操作
A.展示所有的庫存
B.修改庫存數量
分析:
1.展示使用者清單:
輸出語句,使用者輸入,選擇功能序號
2.根據選擇,呼叫不同的方法
switch語句
case 1 2 3
A 展示庫存
將儲存商品的陣列,遍歷
B 修改庫存
修改所有庫存數量
*/
import java.util.Scanner;
public class Shopp{
public static void main(String[] args){
//使用陣列,儲存商品的資訊
//品名,尺寸,價格,庫存數,定義五個陣列
String[] brand = {"MacBookAir","ThinkpadT450"};
double[] size = {13.3,15.6};
double[] price = {9998.97,6789.56};
int[] count = {0,0};
//功能選單選擇:
while(true){
//不斷獲取控制檯輸入的數字,使用指定的功能
int choose = chooseFunction();
switch(choose){
case 1:
//呼叫檢視庫存清單的方法
printStore(brand, size, price, count);
break;
case 2:
//呼叫修改庫存的方法
update(brand,count);
break;
case 3:
//結束程式
return;
default:
System.out.println("沒有這個功能,還在完善中...");
break;
}
}
}
/*
定義方法,修改所有商品的庫存
使用者輸入1個,修改1個
返回值,沒有這個功能
引數,庫存數的陣列
*/
public static void update(String[] brand,int[] count){
//遍歷陣列,遍歷到一個,修改一個
//接受鍵盤輸入
Scanner sc = new Scanner(System.in);
//遍歷陣列
for(int i = 0;i < brand.length;i++){
System.out.println("請輸入" + brand[i] + "的庫存數");
//鍵盤輸入,錄入庫存,儲存到庫存的陣列中
int newCount = sc.nextInt();
count[i] = newCount;
}
}
/*
定義方法,展示所有的庫存清單,遍歷
返回值,沒有
引數? 陣列
*/
public static void printStore(String[] brand,double[] size,double[] price,int[] count){
//1.實現表頭固定資料,列印輸出語句
System.out.println("--------------------商城庫存清單--------------------");
System.out.println("品牌型號 尺寸 價格 庫存數");
//3.表尾部,一部分固定資料,一部分需要科學計算
int totalCount = 0;
double totalPrice = 0;
//遍歷陣列,將陣列中所有商品資訊打印出來
for(int i = 0;i < brand.length;i++){
System.out.println(brand[i] + " " + size[i] + " " + price[i] + " " + count[i]);
totalCount += count[i];
totalPrice += count[i] * price[i];
}
System.out.println("總庫存數:" + totalCount + " 臺");
System.out.println("庫存商品總金額:" + totalPrice + " 元");
System.out.println("----------------------------------------------------");
}
/*
定義方法,實現使用者的選擇功能,功能選中的數字需要返回回來
返回值, int
引數?沒有
*/
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 chooseNumber = sc.nextInt();
return chooseNumber;
}
}
第3章 庫存管理案例 3.1 案例介紹 現在,我們將原有的庫存管理案例,進行業務邏輯的封裝。 將對下列功能進行方法封裝: 列印庫存清單功能 庫存商品數量修改功能 退出程式功能 3.2 案例需求分析 管理員能夠進行的操作有3項(檢視、修改、退出),我們可以採用(switch)選單的方式來完成。 -------------庫存管理------------ 1.檢視庫存清單 2.修改商品庫存數量 3.退出 請輸入要執行的操作序號: 每一項功能操作,我們採用方法進行封裝,這樣,可使程式的可讀性增強。 選擇“1.檢視庫存清單”功能,則控制檯列印庫存清單 選擇“2.修改商品庫存數量”功能,則對每種商品庫存數進行更新 選擇“3.退出”功能,則退出庫存管理,程式結束 第4章 總結 4.1 知識點總結 方法 格式: 修飾符 返回值型別 方法名(引數型別 引數名1, 引數型別 引數名2, …) { 方法體; return 返回值; } 方法使用的注意事項: 1,方法不呼叫,自己不執行 2,方法中不能定義方法, 但是,方法中可以呼叫方法 3, 方法定義的位置在類中,其他方法的外面 4, 如果方法沒有明確的返回值型別,使用’空’型別, void表示 5,void只能在方法返回值型別位置使用,不能作為 普通的資料型別使用 6, 如果方法返回值型別為void型別,可以省略 return ; 方法呼叫方式: 有明確返回值型別的方法呼叫方式: 1,單獨呼叫 2,輸出呼叫 3,賦值呼叫 沒有明確返回值型別的方法呼叫方式: 1, 單獨呼叫 方法過載: 方法過載,在同一個類中,出現了多個同名的方法,他們的引數列表不同 (引數列表的個數不同,引數列表的資料型別不同,引數列表的順序不同)。 方法過載特點: 與方法的返回值型別無關,與方法的引數名無關,只看方法名與引數列表; 方法過載,是通過JVM來完成同名方法的呼叫的,通過引數列表來決定呼叫的是哪一個方法。