# 【方法重載、Debug調試】
##### 今日復習指南
~~~
1.方法重載用(0.5個小時內完成,多寫幾遍)
Demo02OverLoad.java 定義四個重載的求和方法
? ?Demo04OverLoadTest.java 定義四個重載的判斷是否相同的方法
? ?
2.方法練習(1.0個小時內完成,多寫幾遍)
? ?Demo02EachArrayMethod.java 定義方法打印int數組的內容
? ?Demo03EachArrayMax.java 定義方法獲取int數組最大值
? ?
3.方法參數區別和debug調試(0.5個小時內完成,演示效果)
? ?Demo01DeBugSum.java
? ?Demo02DeBug.java
~~~
##### 今日內容
~~~
方法的重載【重點】
方法的參數傳遞【難點】
方法練習【重點】
Debug調試【理解】
~~~
### 第一章 方法重載【理解】
##### 1.1 方法重載的引入
~~~
需求:
1.定義一個獲取兩個int數字之和的方法
? ?2.定義一個獲取三個int數字之和的方法
? ?3.定義一個獲取兩個double數字之和的方法
? ?4.定義一個獲取三個double數字之和的方法
?
定義一個獲取兩個int數字之和的方法
三要素:
1.方法名稱: ? ?
? ? ? ?2.參數列表: ? ?
? ? ? ?3.返回值類型: ?
發現問題:
以下四個方法,都是完成求和功能,只是參數列表不同,
? ?然而我們卻給每個方法起了一個相當之復雜的名字,
? ?導致程序員使用和學習方法的成本增加(太復雜,記不住)
?
解決方案:
? ?使用方法重載
?
~~~
~~~
?
public class Demo01Method {
? ?public static void main(String[] args) {
? ? ? ?System.out.println(getTwoIntNumSum(10,20));
? ? ? ?System.out.println(getThreeIntNumSum(10,20,30));
? ? ? ?System.out.println(getTwoDoubleNumSum(10.0,20.0));
? ? ? ?System.out.println(getThreeDoubleNumSum(10.0,20.0,30.0));
? }
?
? ?//1.定義一個獲取兩個int數字之和的方法
? ?public static int getTwoIntNumSum(int a, int b) {
? ? ? ?System.out.println("兩個int數字之和的方法被調用了.....");
? ? ? ?return a + b;
? }
?
? ?//2.定義一個獲取三個int數字之和的方法
? ?public static int getThreeIntNumSum(int a, int b, int c) {
? ? ? ?System.out.println("三個int數字之和的方法被調用了.....");
? ? ? ?return a + b + c;
? }
?
? ?//3.定義一個獲取兩個double數字之和的方法
? ?public static double getTwoDoubleNumSum(double a, double b) {
? ? ? ?System.out.println("兩個double數字之和的方法被調用了.....");
? ? ? ?return a + b;
? }
?
? ?//4.定義一個獲取三個double數字之和的方法
? ?public static double getThreeDoubleNumSum(double a, double b,double c) {
? ? ? ?System.out.println("三個double數字之和的方法被調用了.....");
? ? ? ?return a + b + c;
? }
}
?
~~~
##### 1.2 方法重載的概念
~~~
方法重載
1.概念:
在同一個類中,多個功能相同,但是參數列表不同的方法,可以使用相同的名字,這種多個同名不同參的方法,
可以存在于同一個類中的現象,叫做方法重載
簡單來講:
比如某個類中已經有了一個名字叫method的方法,我們可以再寫多個名稱叫method的方法,但是要求,
每個名稱為method的方法,之間的參數列表必須要有區別
?
2.作用/目的:
(1)減少程序員的學習和使用的成本(原來必須要記4個方法名,現在只需要記一個方法名)
(2)減少了方法名稱的數量
?
? ?3.調用
(1)根據名稱
(2)參數數量
(3)參數類型(優先做完全類型匹配,否則做自動類型提升的匹配)
?
?
~~~
~~~
public class Demo02OverLoad {
? ?public static void main(String[] args) {
? ? ? ?System.out.println(getSum(10,20));
? ? ? ?System.out.println(getSum(10,20,30));
? ? ? ?System.out.println(getSum(10.0,20.0));
? ? ? ?System.out.println(getSum(10.0,20.0,30.0));
? }
?
? ?//1.定義一個獲取兩個int數字之和的方法
? ?public static int getSum(int a, int b) {
? ? ? ?System.out.println("兩個int數字之和的方法被調用了.....");
? ? ? ?return a + b;
? }
?
? ?//2.定義一個獲取三個int數字之和的方法
? ?public static int getSum(int a, int b, int c) {
? ? ? ?System.out.println("三個int數字之和的方法被調用了.....");
? ? ? ?return a + b + c;
? }
?
? ?//3.定義一個獲取兩個double數字之和的方法
? ?public static double getSum(double a, double b) {
? ? ? ?System.out.println("兩個double數字之和的方法被調用了.....");
? ? ? ?return a + b;
? }
?
? ?//4.定義一個獲取三個double數字之和的方法
? ?public static double getSum(double a, double b,double c) {
? ? ? ?System.out.println("三個double數字之和的方法被調用了.....");
? ? ? ?return a + b + c;
? }
}
?
~~~
##### 1.3 方法重載的注意事項
~~~
/*
? ?參數列表不同有哪些情況可以構成方法重載?
? ? ? ?1.參數的數量不同
? ? ? ?2.參數的類型不同
? ? ? ?3.多個類型,順序不同
?
? ?總結:
? ? ? ?方法重載的本質區別: 一定是看方法參數的數量和類型上的區別
*/
public class Demo02OverLoadNotice {
? ?public static void main(String[] args) {
?
? }
?
? ?//1.沒有參數
? ?public static void method() {
?
? }
?
? ?//2.有一個int參數
? ?//方法1沒有參數,方法2有1個int參數,參數的數量不同可以構成重載
? ?public static void method(int a) {
?
? }
?
?
?
? ?//3.有2個int參數
? ?//方法3和方法2,參數數量不同,方法3和方法1參數數量也不同,參數的數量不同可以構成重載
? ?public static void method(int a,int b) {
?
? }
?
? ?//4.有1個double參數
? ?//方法4和方法1,都是1個參數,但是類型不同,參數的類型不同可以構成重載
? ?public static void method(double a) {
?
? }
?
? ?//5.有兩個double參數
? ?//方法5有2個double參數,方法3有2個int參數,參數的類型不同可以構成重載
? ?public static void method(double a,double b) {
?
? }
? ?//6.有一個int參數和一個double參數
? ?public static void method(int a,double b) {
?
? }
?
? ?//7.有一個double參數和一個int參數
? ?//方法6的參數先int后double,方法7的參數是先double后int,多個類型,順序不同
? ?public static void method(double a, int b) {
?
? }
}
?
~~~
~~~
/*
? ?方法重載與哪些因素無關?
? ? ? ?1.與參數的名稱無關
? ? ? ?2.與返回值類型無關
? ? ? ?3.與修飾符無關
*/
public class Demo03OverLoadNotice {
? ?public static void main(String[] args) {
?
? }
?
? ?//1.有2個int參數
? ?public static int method(int a, int b) {
? ? ? ?return 200;
? }
?
? ?//2.有2個int參數
? ?//報錯: 不是方法重載,因為方法1和方法2,只有參數的名稱不同,然而方法重載與參數名稱無關
? ?/*public static int method(int c, int d) {
? ? ? ?return 100;
? ?}*/
?
? ?//3.有2個int參數
? ?//報錯: 不是方法重載,因為方法1和方法3,只有返回值類型不同,然而方法重載與返回值類型無關
? ?/*public static double method(int a, int b) {
? ? ? ?return 200.0;
? ?}*/
?
? ?//4.有2個int參數
? ?//報錯: 不是方法重載,因為方法1和方法4,只有修飾符不同,然后方法重載與修飾符無關
? ?/*public int method(int a, int b) {
? ? ? ?return 200;
? ?}*/
? ?//5.有2個int參數
? ?//報錯: 不是方法重載,因為方法1和方法5,只有修飾符不同,然后方法重載與修飾符無關
? ?/*private int method(int a, int b) {
? ? ? ?return 200;
? ?}*/
?
}
~~~
##### 1.4 方法重載的練習-比較兩個數據是否相等
~~~
/*
需求:
使用方法重載的思想,設計比較兩個數據是否相等的方法,兼容全整數類型(byte,short,int,long)
方法重載的思想: 同一個類中,多個功能相同,參數列表不同的方法,可以使用同一個名字
實現步驟:
1.使用方法重載的思想,定義比較兩個byte數據是否相同的方法compare
2.使用方法重載的思想,定義比較兩個short數據是否相同的方法compare
3.使用方法重載的思想,定義比較兩個int數據是否相同的方法compare
4.使用方法重載的思想,定義比較兩個long數據是否相同的方法compare
5.調用以上四個方法
使用方法重載的思想,定義比較兩個byte數據是否相同的方法compare
三要素:
1.方法名稱: compare
2.參數列表: byte a, byte b
3.返回值類型: boolean
*/
public class Demo04OverLoadTest {
public static void main(String[] args) {
//調用以下四個方法: 傳遞變量
byte a = 10, b = 20;
System.out.println(compare(a, b));
short s1 = 10, s2 = 10;
System.out.println(compare(s1, s2));
int c = 100, d = 200;
System.out.println(compare(c, d));
long e = 1000L,f = 1000L;
System.out.println(compare(e,f));
}
//1.使用方法重載的思想,定義比較兩個byte數據是否相同的方法compare
public static boolean compare(byte a, byte b) {
System.out.println("兩個byte....");
if (a == b) {
return true;
} else {
return false;
}
}
//2.使用方法重載的思想,定義比較兩個short數據是否相同的方法compare
public static boolean compare(short a, short b) {
System.out.println("兩個short....");
if (a == b) {
return true;
}
//執行到這里,說明a和b一定是不相同的
return false;
}
//3.使用方法重載的思想,定義比較兩個int數據是否相同的方法compare
public static boolean compare(int a, int b) {
System.out.println("兩個int....");
return (a == b) ? true : false;
}
//4.使用方法重載的思想,定義比較兩個long數據是否相同的方法compare
public static boolean compare(long a, long b) {
System.out.println("兩個long....");
return a == b;
}
}
~~~
### 第二章 方法的參數傳遞【理解】
##### 2.1 方法參數傳遞
~~~
參數傳遞:
可以理解當我們要調用一個方法時,我們會把指定的數值,傳遞給方法中的參數(定義方法時()中定義的變量),
這樣方法中的參數就擁有了這個指定的值,可以使用該值,在方法中運算了。這種傳遞方式,我們稱為參數傳遞。
形式參數: 定義方法時,()中定義的參數(1個/多個變量),叫做形式參數 定義時是沒有值的
實際參數: 調用方法時,()中指定的數據(常量/變量),叫做實際參數 使用時必須是有值的
注意:
1.基本類型變量a的值賦值給基本類型變量b,其實是把a的值復制一份,賦值給b,之后不管如何修改變量b的值,都不會影響變量a中的值
2.局部變量:
(1)概念: 在定義方法方法()中定義的變量或者在方法內部定義的變量,都叫做局部變量
(2)特點: 只在方法內部有效,出了所在的方法,就無法使用了
public class Demo01Var {
public static void main(String[] args) {
//定義int變量a,并賦值
int a = 10;
//定義int變量b,未賦值
int b;
b = a;//把變量a的值賦(復制)值給變量b
System.out.println("a="+a);//10
System.out.println("b="+b);//10
b = b*10;
System.out.println("a="+a);//10
System.out.println("b="+b);//100
//c是在method方法中定義的,出了method方法,就不能使用了
//System.out.println(c);
method(a,b);//a和b既叫做實際參數,有叫做局部變量
}
public static void method(int m,int n) {//m和n既叫做形式參數,有叫做局部變量
//a和b是在main方法中定義的,出了main方法,就不能使用了
//System.out.println(a);
//System.out.println(b);
int c = 2000;
System.out.println(c);
}
}
~~~
圖解:

##### 2.2 基本類型作為方法參數傳遞
~~~
基本類型作為方法參數傳遞的特點
1.基本類型變量,保存的是具體的數據值
2.基本類型變量作為方法參數傳遞時,傳遞的也是具體的數據值
3.基本類型變量作為方法參數傳遞特點:
形式參數的改變,不會影響實際參數
形式參數: 定義方法時,()中定義的變量
實際參數: 調用方法時,()中給出的數據/變量
change方法內部修改形式參數a和b的值,不會影響main方法中實際參數a和b的值
基本類型作為方法的形式參數時,形式參數的改變,不會影響實際參數
注意:
1.每個方法的執行都有自己獨立的內存空間(在棧中)
2.方法內部定義的變量,也有自己獨立的內存空間
總結:
1.不同的方法內部可以定義相同名稱的變量
2.每個方法有自己獨立的空間,方法中的變量也有自己獨立的空間,它們之間是互不影響,互不干擾的
~~~
~~~
public class Demo02BaseVar {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("ms...a="+a);//10
System.out.println("ms...b="+b);//20
change(a,b);
System.out.println("me...a="+a);//10
System.out.println("me...b="+b);//20
}
public static void change(int a,int b) {
System.out.println("cs...a="+a);//10
System.out.println("cs...b="+b);//20
a = a * 10;
b = b * 10;
System.out.println("ce...a="+a);//100
System.out.println("ce...b="+b);//200
}
}
~~~
##### 圖解:


##### 2.2 引用類型作為方法參數傳遞
~~~
引用類型作為方法參數傳遞的特點
1.引用類型變量,保存的是堆內存中的地址值
2.引用類型變量作為方法參數傳遞時,傳遞的也是具體的堆內存中的地址值
3.引用類型變量作為方法參數傳遞特點:
引用類型變量作為方法的形式參數時,通過形式參數找到對應的堆內存空間的內容進行修改,
再通過實際參數看到的就是修改之后的內容
引用類型作為方法的形式參數時,形式參數的改變,會影響實際參數
數組作為方法參數傳遞的特點
1.數組變量名稱保存的是數組在堆內存空間的地址值
2.數組作為方法參數傳遞時,傳遞的是地址值
3.數組作為方法形式參數時,通過形式參數找到堆內存中的數組,修改其內容后,實際參數看到的是修改之后的
數組作為方法的形式參數時,形式參數的改變,會影響實際參數
~~~
~~~
public class Demo03RefVar {
public static void main(String[] args) {
int[] arr = {10,20};
System.out.println("ms...arr[0]="+arr[0]);//10
System.out.println("ms...arr[1]="+arr[1]);//20
change( arr );//實際參數
System.out.println("me...arr[0]="+arr[0]);//100
System.out.println("me...arr[1]="+arr[1]);//200
}
public static void change(int[] arr) {//arr: 形式參數
System.out.println("cs...arr[0]="+arr[0]);//10
System.out.println("cs...arr[1]="+arr[1]);//20
arr[0] = arr[0] * 10;
arr[1] = arr[1] * 10;
System.out.println("ce...arr[0]="+arr[0]);//100
System.out.println("ce...arr[1]="+arr[1]);//200
return ;
}
}
~~~
圖解:

### 第三章 方法的練習【重點】
##### 3.1 數組遍歷練習(不定義方法)
~~~
/*
需求(先不定義方法):
完成數組的遍歷(打印數組元素),要求遍歷的結果是在一行上的。
例如:[11, 22, 33, 44, 55]
舉例:
原數組: {11,22,33,44,55}
打印格式:[11, 22, 33, 44, 55]
實現步驟:
1.定義int數組array,并初始化
2.打印"[",不換行
3.使用for循環遍歷數組
3.1 打印當前元素,不換行
3.2 如果3.1中打印的不是最后一個元素,打印", ",不換行
4.打印"]"
問題:
因為沒有把打印數組內容的功能,定義成方法,所以有多少個數組,打印數組的代碼就得重復多少遍
解決方案:
把按照指定格式打印數組內容的功能,定義成方法
*/
public class Demo01EachArray {
public static void main(String[] args) {
//1.定義int數組array,并初始化
int[] array = {11,22,33,44,55};
//2.打印"[",不換行
System.out.print("[");
//3.使用for循環遍歷數組
for (int i = 0; i < array.length; i++) {
//3.1 打印當前元素,不換行
System.out.print(array[i]);
//3.2 如果3.1中打印的不是最后一個元素,打印", ",不換行
if (i != array.length - 1) {
System.out.print(", ");
}
}
//4.打印"]"
System.out.println("]");
System.out.println("------------------------");
//int數組變量,指向了新的數組
array = new int[] {100,200,300,500,800};
//2.打印"[",不換行
System.out.print("[");
//3.使用for循環遍歷數組
for (int i = 0; i < array.length; i++) {
//3.1 打印當前元素,不換行
System.out.print(array[i]);
//3.2 如果3.1中打印的不是最后一個元素,打印", ",不換行
if (i != array.length - 1) {
System.out.print(", ");
}
}
//4.打印"]"
System.out.println("]");
}
}
~~~
##### 3.2 數組遍歷練習(定義方法)
~~~
/*
需求(定義方法):
設計一個方法用于int數組遍歷(打印數組元素),
要求遍歷的結果是在一行上的。例如:[11, 22, 33, 44, 55]
舉例:
原數組: {11,22,33,44,55}
打印格式:[11, 22, 33, 44, 55]
定義方法,用來遍歷int數組
三要素:
1.方法名稱: printArray
2.參數列表: int[] array 因為只有int類型數組變量才可以結束int類型的數組
3.返回值類型: void
實現步驟:
1.打印"[",不換行
2.使用for循環遍歷數組
2.1 打印當前元素,不換行
2.2 如果3.1中打印的不是最后一個元素,打印", ",不換行
3.打印"]"
main方法的實現步驟:
1.定義printArray方法,用來遍歷int數組
2.定義int數組array,并初始化
3.調用printArray方法,傳遞int數組array
*/
public class Demo02EachArrayMethod {
public static void main(String[] args) {
//2.定義int數組array,并初始化
int[] array = {11,22,33,44,55};//數組名array: 保存的是數組在內存空間的地址值
//3.調用printArray方法,傳遞int數組array
printArray(array);//傳遞的是數組在內存空間的地址值
//數組變量array,又指向了一個新的數組
array = new int[] {110,220,330,440,550};
printArray(array);
}
//定義方法,用來遍歷int數組
public static void printArray(int[] array) {
//1.打印"[",不換行
System.out.print("[");
//2.使用for循環遍歷數組
for (int i = 0; i < array.length; i++) {
//2.1 打印當前元素,不換行
System.out.print(array[i]);
//2.2 如果3.1中打印的不是最后一個元素,打印", ",不換行
if (i != array.length - 1) {
System.out.print(", ");
}
}
//3.打印"]"
System.out.println("]");
}
}
~~~
##### 3.2 方法練習求數組最大值
~~~
package com.itheima03;
/*
需求:
設計一個方法用于獲取int數組中元素的最大值
舉例:
原數組: {11,22,33,44,55}
最大值: 55
三要素:
1.方法名稱: getArrayMax
2.參數列表: int[] array
3.返回值類型: int
獲取int數組中元素的最大值方法的實現步驟:
1.假設數組array中索引0對應的元素是最大的,保存到int變量max中
2.使用for循環遍歷數組,依次獲取后面的(從索引1開始)每個元素
2.1 如果當前元素值 大于 max 說明max中的值已經不是最大的了,把當前元素值 賦值 給 max
3.for循環結束,返回max
main方法的實現步驟
1.定義獲取int數組最大值的方法getArrayMax
2.定義int數組array,并初始化
3.調用getArrayMax方法,傳遞int數組array,獲取最大值保存到int變量max中
4.打印max的值
*/
public class Demo03EachArrayMax {
public static void main(String[] args) {
//1.定義獲取int數組最大值的方法getArrayMax
//2.定義int數組array,并初始化
int[] array = {11,22,33,44,55};
//3.調用getArrayMax方法,傳遞int數組array,獲取最大值保存到int變量max中
int max = getArrayMax(array);
//4.打印max的值
System.out.print("原數組:");
printArray(array);
System.out.println("最大值: "+max);
}
//設計一個方法用于獲取int數組中元素的最大值
public static int getArrayMax(int[] array) {
//1.假設數組array中索引0對應的元素是最大的,保存到int變量max中
int max = array[0];
//2.使用for循環遍歷數組,依次獲取后面的(從索引1開始)每個元素
for (int i = 1; i < array.length; i++) {
//2.1 如果當前元素值 大于 max 說明max中的值已經不是最大的了,把當前元素值 賦值 給 max
if (array[i] > max) {
max = array[i];
}
}
//3.for循環結束,返回max
return max;
}
//定義方法,用來遍歷int數組
public static void printArray(int[] array) {
//1.打印"[",不換行
System.out.print("[");
//2.使用for循環遍歷數組
for (int i = 0; i < array.length; i++) {
//2.1 打印當前元素,不換行
System.out.print(array[i]);
//2.2 如果3.1中打印的不是最后一個元素,打印", ",不換行
if (i != array.length - 1) {
System.out.print(", ");
}
}
//3.打印"]"
System.out.println("]");
}
}
~~~
##### 3.3 引用類型變量作為方法參數方法調用圖解

### 第四章 Debug調試【重點】
##### 4.1 Debug查看求和
~~~
使用步驟:
1.在代碼的第一行左側空白(行號后面)處單擊鼠標左鍵,添加斷點
2.右鍵選擇"debug...",進入斷點調試界面
public class Demo01DeBugSum {
public static void main(String[] args) {
System.out.println("main...start....");
int a = 10;
int b = 20;
int sum = a + b;
System.out.println("sum="+sum);
System.out.println("main...end....");
}
}
~~~
##### 4.2 Debug查看求和方法
~~~
public class Demo02DeBug {
public static void main(String[] args) {
System.out.println("main...start...");
method();
System.out.println("main...end...");
}
public static void method() {
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
return ;
}
}
~~~

##### 總結
~~~
能夠知道方法重載的特點
1.同一個類中,多個名稱相同,參數列表不同的方法,可以使用相同的名稱
2.參數列表不同有哪些情況?
(1)個數不同
(2)類型不同
(3)多個類型順序不同
3.與哪些因素無關
(1)與參數名稱無關
(2)與返回值類型無關
(3)與修飾符無關
能夠使用方法重載完成比較兩個整數是否相同并調用方法
sout(compare(10,20));//調用參數是2個int的compare方法
sout(compare((byte)10,(byte)20));//調用參數是2個byte的compare方法
//獲取2個byte數據是否相同
public static boolean compare(byte a,byte b) {
return a == b;
}
//獲取2個int數據是否相同
public static boolean compare(int a,int b) {
return a == b;
}
能夠使用方法完成數組遍歷并調用方法
public static void printArray(int[] array) {
System.out.print("[");
for(int i = 0;i<array.length;i++) {
System.out.print(array[i]);
if(i != array.length-1) {
System.out.print(", ");
}
}
System.out.println("]");
}
能夠使用方法完成獲取int數組最大值并調用方法
public static int getArrayMax(int[] array) {
int max = array[0];
for(int i = 1;i<array.length;i++) {
if(array[i] > max) {
max = array[i];
}
}
return max;
}
能夠使用斷點調試查看循環求和流程
能夠知道方法的參數是基本類型和引用類型的區別
方法的參數是基本類型特點: 形參的改變不會影響實參
方法的參數是引用類型特點: 形參的改變會影響實參
~~~