1. 程式人生 > >第5天 Java基礎語法

第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來完成同名方法的呼叫的,通過引數列表來決定呼叫的是哪一個方法。