1.1 方法的概念
方法(method)是將具有獨立功能的代碼塊組織成為一個整體,使其具有特殊功能的代碼集
-
注意:
-
方法必須先創建才可以使用,該過程成為方法定義
-
方法創建后並不是直接可以運行的,需要手動使用后,才執行,該過程成為方法調用
-
2. 方法的定義和調用
2.1 無參數方法定義和調用
-
定義格式:
public static void 方法名 ( ) {
// 方法體;
} -
范例:
public static void method ( ) {
// 方法體;
} -
調用格式:
方法名();
-
范例:
method();
-
注意:
方法必須先定義,后調用,否則程序將報錯
2.2 方法的調用過程
-
總結:每個方法在被調用執行的時候,都會進入棧內存,並且擁有自己獨立的內存空間,方法內部代碼調用完畢之后,會從棧內存中彈棧消失。
2.3 方法練習-奇偶數判斷
-
需求:判斷一個數是奇數還是偶數
-
代碼:
public class Demo1Method {
/*
帶參數方法的定義格式:
public static void 方法名 ( 參數 ) { … … }
public static void 方法名 ( 數據類型 變量名 ) { … … }
帶參數方法的調用格式:
方法名 ( 參數 ) ;
方法名 ( 變量名/常量值 ) ;
tips: 參數可以是一個, 也可以是多個.
需求: 判斷一個數是奇數還是偶數
*/
public static void main(String[] args) {
isEvenNumber(10);
}
public static void isEvenNumber(int num){
if(num % 2 == 0){
System.out.println("偶數");
}else{
System.out.println("奇數");
}
}
}
3. 帶參數方法的定義和調用
3.1 帶參數方法定義和調用
-
定義格式:
參數:由數據類型和變量名組成 - 數據類型 變量名
參數范例:int a
public static void 方法名 (參數1) {
方法體;
}
public static void 方法名 (參數1, 參數2, 參數3...) {
方法體;
} -
范例:
public static void isEvenNumber(int number){
...
}
public static void getMax(int num1, int num2){
...
}-
注意:
方法定義時,參數中的數據類型與變量名都不能缺少,缺少任意一個程序將報錯
方法定義時,多個參數之間使用逗號( ,)分隔
-
-
調用格式:
方法名(參數);
方法名(參數1,參數2); -
范例:
isEvenNumber(10);
getMax(10,20);-
方法調用時,參數的數量與類型必須與方法定義中的設置相匹配,否則程序將報錯
-
3.2 形參和實參
-
形參:方法定義中的參數
等同於變量定義格式,例如:int number
-
實參:方法調用中的參數
等同於使用變量或常量,例如: 10 number
3.3 帶參數方法的練習-打印n-m之間所有的奇數
-
需求:設計一個方法(print) 用於打印 n 到 m 之間所有的奇數
-
思路:
1:定義方法,名稱為print 2:為方法添加兩個int類型的形參,准備接受調用者傳遞過來的實參 3:方法中設計for循環,循環從n開始,到m結束 4:循環中加入if判斷,是奇數,則打印 5:main方法中調用print方法,傳入兩個實際參數
-
代碼:
package com.itheima.method2;
public class Demo2Method {
public static void main(String[] args) {
// 5:main方法中調用print方法,傳入兩個實際參數
print(20,10);
}
//1:定義方法,名稱為print
// 2:為方法添加兩個int類型的形參,准備接受調用者傳遞過來的實參
public static void print(int n, int m){
System.out.println(n + "到" + m + "之間的奇數為:");
// 3:方法中設計for循環,循環從n開始,到m結束
for(int i = 20; i <= 10; i++){
// 4:循環中加入if判斷,是奇數,則打印
if(i % 2 == 1){
System.out.println(i);
}
}
}
}
4. 帶返回值方法的定義和調用
4.1 帶返回值方法定義和調用(掌握)
-
定義格式
public static 數據類型 方法名 ( 參數 ) {
return 數據 ;
} -
范例
public static boolean isEvenNumber( int number ) {
return true ;
}
public static int getMax( int a, int b ) {
return 100 ;
}-
注意:
-
方法定義時return后面的返回值與方法定義上的數據類型要匹配,否則程序將報錯
-
-
-
調用格式
方法名 ( 參數 ) ;
數據類型 變量名 = 方法名 ( 參數 ) ; -
范例
isEvenNumber ( 5 ) ;
boolean flag = isEvenNumber ( 5 );-
注意:
-
方法的返回值通常會使用變量接收,否則該返回值將無意義
-
-
4.2 帶返回值方法的練習-求兩個數的最大值(應用)
-
需求:設計一個方法可以獲取兩個數的較大值,數據來自於參數
-
思路:
-
定義一個方法,聲明兩個形參接收計算的數值,求出結果並返回
-
使用 if 語句 得出 a 和 b 之間的最大值,根據情況return具體結果
-
在main()方法中調用定義好的方法並使用 【 變量保存 】
-
-
代碼:
/*
需求:設計一個方法可以獲取兩個數的較大值,數據來自於參數
1. 定義一個方法,聲明兩個形參接收計算的數值,求出結果並返回
2. 使用 if 語句 得出 a 和 b 之間的最大值,根據情況return具體結果
3. 在main()方法中調用定義好的方法並使用 【 變量保存 】
*/
public static void main(String[] args) {
// 3. 在main()方法中調用定義好的方法並使用 【 變量保存 】
System.out.println(getMax(10,20)); // 輸出調用
int result = getMax(10,20);
System.out.println(result);
for(int i = 1; i <= result; i++){
System.out.println("HelloWorld");
}
}
// 方法可以獲取兩個數的較大值
public static int getMax(int a, int b){
if(a > b){
return a;
}else{
return b;
}
}
}
5. 方法的注意事項
5.1 方法的通用格式(掌握)
-
格式:
public static 返回值類型 方法名(參數) { 方法體; return 數據 ; }
-
解釋:
-
public static 修飾符,目前先記住這個格式
返回值類型 方法操作完畢之后返回的數據的數據類型
如果方法操作完畢,沒有數據返回,這里寫void,而且方法體中一般不寫return
方法名 調用方法時候使用的標識
參數 由數據類型和變量名組成,多個參數之間用逗號隔開
方法體 完成功能的代碼塊
return 如果方法操作完畢,有數據返回,用於把數據返回給調用者
-
-
定義方法時,要做到兩個明確
-
明確返回值類型:主要是明確方法操作完畢之后是否有數據返回,如果沒有,寫void;如果有,寫對應的數據類型
-
明確參數:主要是明確參數的類型和數量
-
-
調用方法時的注意:
-
void類型的方法,直接調用即可
-
非void類型的方法,推薦用變量接收調用
-
5.2 方法的注意事項
-
方法不能嵌套定義
-
示例代碼:
public class MethodDemo { public static void main(String[] args) { } public static void methodOne() { public static void methodTwo() { // 這里會引發編譯錯誤!!! } } }
-
-
void表示無返回值,可以省略return,也可以單獨的書寫return,后面不加數據
-
示例代碼:
public class MethodDemo { public static void main(String[] args) { } public static void methodTwo() { //return 100; 編譯錯誤,因為沒有具體返回值類型 return; //System.out.println(100); return語句后面不能跟數據或代碼 } }
-
6. 方法重載
6.1 方法重載
-
方法重載概念
方法重載指同一個類中定義的多個方法之間的關系,滿足下列條件的多個方法相互構成重載
-
多個方法在同一個類中
-
多個方法具有相同的方法名
-
多個方法的參數不相同,類型不同或者數量不同
-
-
注意:
-
重載僅對應方法的定義,與方法的調用無關,調用方式參照標准格式
-
重載僅針對同一個類中方法的名稱與參數進行識別,與返回值無關,換句話說不能通過返回值來判定兩個方法是否相互構成重載
-
-
正確范例:
public class MethodDemo { public static void fn(int a) { //方法體 } public static int fn(double a) { //方法體 } } public class MethodDemo { public static float fn(int a) { //方法體 } public static int fn(int a , int b) { //方法體 } }
-
錯誤范例:
public class MethodDemo { public static void fn(int a) { //方法體 } public static int fn(int a) { /*錯誤原因:重載與返回值無關*/ //方法體 } } public class MethodDemo01 { public static void fn(int a) { //方法體 } } public class MethodDemo02 { public static int fn(double a) { /*錯誤原因:這是兩個類的兩個fn方法*/ //方法體 } }
6.2 方法重載練習
-
需求:使用方法重載的思想,設計比較兩個整數是否相同的方法,兼容全整數類型(byte,short,int,long)
-
思路:
①定義比較兩個數字的是否相同的方法compare()方法,參數選擇兩個int型參數
②定義對應的重載方法,變更對應的參數類型,參數變更為兩個long型參數
③定義所有的重載方法,兩個byte類型與兩個short類型參數
④完成方法的調用,測試運行結果
-
代碼:
public class MethodTest { public static void main(String[] args) { //調用方法 System.out.println(compare(10, 20)); System.out.println(compare((byte) 10, (byte) 20)); System.out.println(compare((short) 10, (short) 20)); System.out.println(compare(10L, 20L)); } //int public static boolean compare(int a, int b) { System.out.println("int"); return a == b; } //byte public static boolean compare(byte a, byte b) { System.out.println("byte"); return a == b; } //short public static boolean compare(short a, short b) { System.out.println("short"); return a == b; } //long public static boolean compare(long a, long b) { System.out.println("long"); return a == b; } }
7. 方法的參數傳遞
7.1 方法參數傳遞基本類型(理解)
-
測試代碼:
package com.itheima.param; public class Test1 { /* 方法參數傳遞為基本數據類型 : 傳入方法中的, 是具體的數值. */ public static void main(String[] args) { int number = 100; System.out.println("調用change方法前:" + number); change(number); System.out.println("調用change方法后:" + number); } public static void change(int number) { number = 200; } }
-
結論:
-
基本數據類型的參數,形式參數的改變,不影響實際參數
-
-
結論依據:
-
每個方法在棧內存中,都會有獨立的棧空間,方法運行結束后就會彈棧消失
-
7.2 方法參數傳遞引用類型
-
測試代碼:
package com.itheima.param; public class Test2 { /* 方法參數傳遞為引用數據類型 : 傳入方法中的, 是內存地址. */ public static void main(String[] args) { int[] arr = {10, 20, 30}; System.out.println("調用change方法前:" + arr[1]); change(arr); System.out.println("調用change方法后:" + arr[1]); } public static void change(int[] arr) { arr[1] = 200; } }
-
結論:
-
對於引用類型的參數,形式參數的改變,影響實際參數的值
-
-
結論依據:
-
引用數據類型的傳參,傳入的是地址值,內存中會造成兩個引用指向同一個內存的效果,所以即使方法彈棧,堆內存中的數據也已經是改變后的結果
-
7.3 數組遍歷
-
需求:設計一個方法用於數組遍歷,要求遍歷的結果是在一行上的。例如:[11, 22, 33, 44, 55]
-
思路:
-
因為要求結果在一行上輸出,所以這里需要在學習一個新的輸出語句System.out.print(“內容”);
System.out.println(“內容”); 輸出內容並換行
System.out.print(“內容”); 輸出內容不換行
System.out.println(); 起到換行的作用
-
定義一個數組,用靜態初始化完成數組元素初始化
-
定義一個方法,用數組遍歷通用格式對數組進行遍歷
-
用新的輸出語句修改遍歷操作
-
調用遍歷方法
-
-
代碼:
package com.itheima.test;
public class Test1 {
/*
需求:設計一個方法用於數組遍歷,要求遍歷的結果是在一行上的。例如:[11, 22, 33, 44, 55]
思路:
1.定義一個數組,用靜態初始化完成數組元素初始化
2.定義一個方法,對數組進行遍歷
3.遍歷打印的時候,數據不換行
4.調用遍歷方法
*/
public static void main(String[] args) {
// 1.定義一個數組,用靜態初始化完成數組元素初始化
int[] arr = {11, 22, 33, 44, 55};
// 4.調用遍歷方法
printArray(arr);
System.out.println("另外一段代碼邏輯 ");
}
/*
2.定義一個方法,對數組進行遍歷
1, 參數 int[] arr
2, 返回值類型 void
*/
public static void printArray(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length -1){
// 如果滿足條件, 說明是最后一個元素, 最后一個元素, 特殊處理
System.out.println(arr[i] + "]");
}else{
// 3.遍歷打印的時候,數據不換行
System.out.print(arr[i] + ", ");
}
}
}
}
7.4 數組最大值
-
需求:設計一個方法用於獲取數組中元素的最大值
-
思路:
-
-
②定義一個方法,用來獲取數組中的最大值,最值的認知和講解我們在數組中已經講解過了
-
③調用獲取最大值方法,用變量接收返回結果
-
④把結果輸出在控制台
-
-
代碼:
package com.itheima.test;
public class Test2 {
/*
需求:設計一個方法用於獲取數組中元素的最大值
思路:
1.定義一個數組,用靜態初始化完成數組元素初始化
2.定義一個方法,用來獲取數組中的最大值
3.調用獲取最大值方法,用變量接收返回結果
4.把結果輸出在控制台
*/
public static void main(String[] args) {
// 1.定義一個數組,用靜態初始化完成數組元素初始化
int[] arr = {11, 55, 22, 44, 33};
// 3.調用獲取最大值方法,用變量接收返回結果
int max = getMax(arr);
// 4.把結果輸出在控制台
System.out.println(max);
}
/*
2.定義一個方法,用來獲取數組中的最大值
1, 參數 int[] arr
2, 返回值類型 int
*/
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(max < arr[i]){
max = arr[i];
}
}
return max;
}
}
7.5 方法同時獲取數組最大值和最小值
-
需求:設計一個方法,該方法能夠同時獲取數組的最大值,和最小值
-
注意: return語句, 只能帶回一個結果.
-
代碼:
public class Test3 {
/*
需求:設計一個方法,該方法能夠同時獲取數組的最大值,和最小值
注意: return語句, 只能帶回一個結果.
*/
public static void main(String[] args) {
int[] arr = {11,55,33,22,44};
int[] maxAndMin = getMaxAndMin(arr);
System.out.println(maxAndMin[0]);
System.out.println(maxAndMin[1]);
}
public static int[] getMaxAndMin(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(max < arr[i]){
max = arr[i];
}
}
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if(min > arr[i]){
min = arr[i];
}
}
int[] maxAndMin = {min, max};
return maxAndMin;
}
}
day05課后作業題
代碼題
1. 訓練案例1
1.1. 訓練描述
設計一個方法,用於比較兩個數組{10,20,30,11}和{10,20,30,13}是否相同。在main方法中調用該方法測試功能
數組內容相同,指的是元素個數相同,元素值相同,並且元素順序相同,條件缺一不可。
1.2. 操作步驟描述
-
定義兩個數組
-
創建方法,比較兩個數組是否相同,
-
main方法中調用創建的方法
-
根據返回值打印不同的內容
package com.heima.meiri.day5;
public class mrb1Yuan {
public static void main(String[] args) {
int[]arr1={99,88,77,66};
int[]arr2={99,88,77,6};
boolean c=duibi(arr1,arr2);
if (c==true){
System.out.println("相同");
}else {
System.out.println("不同");
}
}
public static boolean duibi(int[]a,int[]b){
for (int i = 0; i < a.length; i++) {
if (a.length!=b.length){
return false;
}
if (a[i]!=b[i]){
return false;
}
}return true;
}
}
運行效果
2. 訓練案例2
2.1. 訓練描述
創建長度為5的數組,鍵盤錄入數組數據,創建一個方法,讓數組最大元素與數組最小元素交換,最后返回整理好的數組。
輸入格式
請錄入數組第1個元素
10
請錄入數組第2個元素
20
請錄入數組第3個元素
43
請錄入數組第4個元素
3
請錄入數組第5個元素
18
輸出格式
您輸入的數組為:
10 20 43 3 18
改變后的數組為:
10 20 3 43 18
2.2. 操作步驟描述
-
創建長度為5的數組
-
使用循環進行5此鍵盤錄入,錄入數組的元素
-
使用循環,輸出原數組元素
-
調用方法,完成數組最大元素和最小元素交換
-
輸出改變后的數組元素
package com.heima.meiri.day5;
import java.util.Scanner;
public class mrb2 {
public static void main(String[] args) {
/* 創建長度為5的數組,鍵盤錄入數組數據
,創建一個方法,讓數組最大元素與數組最小元素交換
,最后返回整理好的數組。
*/
int[] arr = new int[5];//定義一個數組
Scanner sc=new Scanner(System.in);//調用鍵盤錄入方法
System.out.println("請輸入五個數值:");//給出輸入提示
for (int i = 0; i < arr.length; i++) {//循環遍歷數組
arr[i]=sc.nextInt();//將鍵盤錄入的值賦給數組
}
System.out.println("你輸入的數組為:");//給出輸出提示
for (int i = 0; i < arr.length; i++) {//遍歷鍵盤錄入存入到數組中的數據
System.out.println(arr[i]);
}
System.out.println("-------");
int[]arr2=maxAndmin(arr);//調用交換方法
System.out.println("改變后:");//給出新數組輸出提示
for (int i = 0; i < arr2.length; i++) {//遍歷修改后的數組
System.out.println(arr2[i]);
}
}
public static int[] maxAndmin(int[]arr){//創建交換最大最小值方法,返回值為數組類型
int max=arr[0];//定義最大值
int min=arr[0];//定義最小值
int maxidex=0;//定義最大值索引
int minidex=0;//定義最小值索引
for (int i = 0; i < arr.length; i++) {
if (max<arr[i]){//求出原數組最大值
max=arr[i];
maxidex=i;
}
}
for (int i = 0; i < arr.length; i++) {
if (min>arr[i]){//求出原數組最小值
min=arr[i];
minidex=i;
}
}
int a=arr[maxidex];//交換最大最小值