方法
什麼是方法
- 方法(method)是程式中最小的執行單元。
- 實際應用當中,將重複的方法打包
- 提高程式碼的複用性
- 提高程式碼可維持性
總結:
-
什麼是方法?
方法是程式中最小的執行單元。
-
實際開發中,什麼時候用到方法?
重複的程式碼、具有獨立功能的程式碼可以抽取到方法中。
-
實際開發中,方法有什麼好處?
- 可以提高程式碼的複用性
- 可以提高程式碼的可維護性
方法的格式
把一些程式碼打包在一起,用到的時候就呼叫
方法定義
把一些程式碼打包在一起,該過程稱為方法定義。
方法的定義格式
public static 返回值型別 方法名 (引數) {
方法體;
return 返回體;
}
方法呼叫
方法定義後並不是直接執行的,需要手動呼叫才能執行,該過程稱為方法呼叫。
最簡單的方法定義和呼叫
格式(方法):
public static void 方法名 (){
方法體 (就是打包起來的程式碼);
}
範例(方法):
public static void playGame (){
七個列印語句;
}
格式(呼叫):
方法名 ();
範例(呼叫):
playGame ();
注意:方法必須先定義後呼叫,否則程式將報錯
public class MethodDemo1 {
public static void main(String[] args) {
//目標:掌握最簡單的方法定義和呼叫的格式
//呼叫方法
playGame();
}
//定義一個方法
public static void playGame(){
System.out.println("選人物");
System.out.println("準備開局");
System.out.println("對線");
System.out.println("崩盤");
System.out.println("崩盤");
System.out.println("罵隊友");
System.out.println("送人頭");
System.out.println("GG");
}
}
練習
展示女朋友的資訊
需求:定義一個方法,在方法內部列印你女朋友的所有資訊。
public class MethodDemo2 {
public static void main(String[] args) {
//目標:利用方法最簡單的格式完成當前練習
//呼叫方法
printGFInfo();
}
public static void printGFInfo(){
System.out.println("柳如煙");
System.out.println("校花");
System.out.println("18歲");
}
}
人肉計算機
需求:定義一個方法,在方法內部定義兩個變數。
求出他們的和並進行列印。
public class MethodDemo3 {
public static void main(String[] args) {
//目標:利用方法最簡單的格式完成當前練習
//需求:在方法內部定義兩個變數並求和列印
getSum();
}
public static void getSum(){
int num1 = 10;
int num2 = 20;
int result = num1 + num2;
System.out.println(result);
}
}
帶引數的方法的定義和呼叫
單個引數(方法)
格式:
public static void 方法名(引數){ ... ...}
範例:
public static void method(int number){ ... ...}
多個引數(方法)
格式:
public static void 方法名(引數1,引數2,......){ ... ...}
範例:
public static void getSum(int number1,int number2){ ... ...}
帶引數方法(呼叫)
單個引數
單個引數:方法名(引數);
範例1:method(10);
範例2:method(變數);
多個引數
多個引數:方法名(引數1,引數2,......);
範例1:getSum(10,20);
範例2:getSum(變數1,變數2);
注意:方法呼叫時,引數的數量與型別必須與方法定義中小括號裡面的變數一一對應,否則程式將報錯。
public class MethodDemo4 {
public static void main(String[] args) {
//目標:掌握帶引數方法定義的格式和呼叫的格式
getSum(10,20);
}
public static void getSum(int num1, int num2){
int result = num1 + num2;
System.out.println(result);
}
}
形參和實參
- 形參:全稱形式引數,是指方法定義中的引數
- 實參:全稱實際引數,方法呼叫中的引數
注意:方法呼叫時,形參和實參必須一一對應,否則程式將報錯。
練習
人肉計算機1
需求:定義一個方法,求長方形的周長,將結果在方法中進行列印。
public class Test1 {
public static void main(String[] args) {
//需求:定義一個方法,求長方形的周長,將結果在方法中進行列印。
//目標:根據不同的需求,荀澤定義無參的方法,還是帶引數的方法
getLength(5.2,1.3);
}
//1.我要幹嘛?求長方形的周長
//2.我幹這件事情,需要幹什麼才能完成?長 寬
public static void getLength(double len,double width){
double result = (len + width) * 2;
System.out.println(result);
}
}
人肉計算機2
需求:定義一個方法,求圓的面積,將結果在方法中進行列印。
public class Test2 {
public static void main(String[] args) {
//需求:定義一個方法,求圓的面積,將結果在方法中進行列印。
//目標:根據不同的需求,選擇定義無參的方法,還是帶引數的方法
getArea(1.5);
}
//1.我要幹嘛?求圓的面積
//2.我幹這件事,需要什麼才能完成? 半徑的平方 * π
public static void getArea(double radius){
double result = radius * radius * 3.14;
System.out.println(result);
}
}
帶返回值方法的定義和呼叫
方法的返回值其實就是方法執行的最終結果。
- 如果在呼叫處要根據方法的結果,去編寫另一段程式碼邏輯
- 為了在呼叫處拿到方法產生的結果,就需要定義帶有返回值的方法
帶返回值方法 定義
格式:
public staric 返回值型別 方法名 (引數){
方法體;
return 返回值;
}
範例:
public static int getSum(int a,int b){
int c = a + b;
return c;
}
帶返回值方法的呼叫
-
直接呼叫:
方法名(引數);
-
賦值呼叫:
整數型別 變數名 = 方法名 (實參);
-
輸出呼叫:
System.out.println(方法名 (實參));
public class MethodDemo5 {
public static void main(String[] args) {
//目標:掌握帶返回值方法的定義和呼叫格式
//直接呼叫
getSum(10,20,30);
//賦值呼叫
int sum = getSum(10,20,30);
System.out.println(sum);
//輸出呼叫
System.out.println(getSum(10,20,30));
}
public static int getSum(int num1,int num2,int num3){
int result = num1 + num2 + num3;
return result;//返回給方法的呼叫處
}
}
總結
-
什麼時候用到有返回值的方法?
在呼叫處要根據方法的結果,去編寫另一段程式碼。
-
由返回值方法的定義格式
public static 返回值型別 方法名(引數){ 方法體; return 返回值; }
-
有返回值方法的呼叫格式
直接呼叫,賦值呼叫,輸出呼叫
-
有返回值方法中引數的執行過程
練習
人肉計算機
需求:定義一個方法,求一家商場每個季度的營業額。
根據方法結果再計算出全年營業額。
public class MethodDemo5 {
public static void main(String[] args) {
//目標:掌握帶返回值方法的定義和呼叫格式
//先計算第一個季度的營業額
int sum1 = getSum(10,20,30);
//再來計算第二個季度的營業額
int sum2 = getSum(20,30,40);
//計算第三個季度的營業額
int sum3 = getSum(20,30,40);
//計算第四個季度的營業額
int sum4 = getSum(20,30,40);
//求全年的總營業額
int sum = sum1 + sum2 + sum3 + sum4;
System.out.println(sum);
}
public static int getSum(int num1,int num2,int num3){
int result = num1 + num2 + num3;
return result;//返回給方法的呼叫處
}
}
比較大小
需求:定義方法,比較兩個長方形的面積。
public class Test3 {
public static void main(String[] args) {
//目標:要能區分出什麼時候使用帶返回值的方法
//需求:定義方法,比較兩個長方形的面積。
//呼叫方法獲取長方形的面積,再進行比較
double area1 = getArea(5.3,1.7);
double area2 = getArea(2.4,2.7);
if(area1 > area2){
System.out.println("第一個長方形更大");
}else{
System.out.println("第二個長方形更大");
}
}
//定義一個方法求長方形的面積
//1.我要幹什麼?求長方形的面積
//2.需要什麼?長 寬
//3.方法的呼叫處,是否需要繼續使用方法的結果
//如果要用,那麼方法必須有返回值
//如果不要用,方法可以寫範湖只,也可以不寫返回值
public static double getArea(double len,double width){
double area = len * width;
return area;
}
//在以後實際開發應用當中,我們易班是把重複的程式碼或者具有獨立功能的程式碼抽取到方法當中。
//以後我們直接呼叫就可以了
}
方法小結
方法的注意事項
-
方法不呼叫就不執行
-
方法與方法之間是平級關係,不能互相巢狀定義
-
方法的編寫順序和執行順序無關
-
方法的返回值型別為void,表示該方法沒有返回值,沒有返回值的方法可以省略return語句不寫。
如果要編寫return,後面不能跟具體的資料。
-
return語句下面,不能編寫程式碼,因為永遠執行不到,屬於無效的程式碼
return關鍵字
- 方法沒有返回值:可以省略不寫。如果書寫,表示結束方法
- 方法有返回值:必須要寫。表示結束方法和返回結果
方法過載
-
在同一個類中,定義了多個同名的方法,這些同名的方法具有同種的功能。
-
每個方法具有不同的引數型別或引數個數,這些同名的方法,就構成了過載關係
-
簡單記:同一個類中,方法名相同,引數不同的方法。與返回值無關。
引數不同:個數不同、型別不同、順序不同
順序不同可以構成過載,但是不建議!
練習
方法過載
需求:使用方法過載的思想,設計比價兩個整數是否相同的方法。
要求:相容全整數型別(byte,short,int,long)
public class Test4 {
public static void main(String[] args) {
/*需求:使用方法過載的思想,設計比價兩個整數是否相同的方法。
要求:相容全整數型別(byte,short,int,long)
*/
//呼叫
compare(10,20);
compare((byte) 10,(byte) 20);
byte b1 = 10;
byte b2 = 20;
compare(b1,b2);
}
//會把相同功能的方法名起成一樣的名字
//好處1;定義方法的時候可以不用那麼多的單詞了
//好處2:呼叫方法的時候也不需要那麼麻煩了。
public static void compare(byte b1,byte b2){
System.out.println(b1 == b2);
}
public static void compare(short s1,short s2){
System.out.println(s1 == s2);
}
public static void compare(int i1,int i2){
System.out.println(i1 == i2);
}
public static void compare(long n1,long n2){
System.out.println(n1 == n2);
}
}
練習
陣列遍歷
需求:設計一個方法用於陣列遍歷,要求遍歷的結果是在一行上的。例如:[11,22,33,44,55]
public class Test5 {
public static void main(String[] args) {
//1.定義陣列
int[] arr = {11,22,33,44,55};
//2.呼叫方法遍歷陣列
printArr(arr);
}
//定義方法用於陣列的遍歷
//1.我要幹嘛? 遍歷陣列
//2.我幹這件事需要什麼才能完成? 陣列
//3.方法的呼叫處是否需要繼續使用結果? 不需要返回值
public static void printArr(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length - 1){
System.out.print(arr[i]);
}else{
System.out.print(arr[i] + ", ");
}
}
System.out.println("]");
}
}
陣列最大值
需求:設計一個方法求陣列的最大值,並將最大值返回
public class Test6 {
public static void main(String[] args) {
//1.定義陣列
int[] arr = {1,2,3,4,5};
//2.呼叫方法求最大值
int max = getMax(arr);
//3.列印
System.out.println(max);
}
//1.我要幹嘛? 求最大值
//2.我幹這件事,需要什麼才能完成? 陣列
//3.是否返回? 返回
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
}
判斷是否存在
需求:定義一個方法判斷陣列中的某一個資料是否存在,將結果返回給呼叫處
public class Test7 {
public static void main(String[] args) {
//1.定義陣列
int[] arr = {1,2,3,4,5};
//2.判斷一個數字在陣列中是否存在
boolean flag = contains(arr,4);
System.out.println(flag);
}
//1.我要幹嘛?
//2.我幹這件事,需要什麼才能完成? 陣列 數字
//3.呼叫處是否需要繼續使用結果? 返回 true false
public static boolean contains(int[] arr,int number){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == number){
return true;
}
}
//什麼時候數字在陣列中是不存在的
//當陣列裡面所有的資料全部比較完畢之後
return false;
//return break 關鍵字的區別
//return:其實跟迴圈沒有什麼關係,跟方法有關,表示1結束方法 2返回接過
// 如果方法執行到了return,那麼整個方法全部結束,裡面的迴圈也會隨之結束
//break關鍵字
//其實跟方法沒有什麼關係,結束迴圈或者switch。
}
}
複製陣列
需求:定義一個方法copyOfRange(int[] arr,int from,int to)
功能:將陣列arr中從索引from(包含from)開始。到索引to結束(不包含to)的元素複製到新陣列中,將新陣列返回
public class Test8 {
public static void main(String[] args) {
/*需求:定義一個方法copyOfRange(int[] arr,int from,int to)
功能:將陣列arr中從索引from(包含from)開始。到索引to結束(不包含to)的元素複製到新陣列中,將新陣列返回
*/
//1.定義原始陣列
int[] arr = {1,2,3,4,5,6,7,8,9};
//2.呼叫方法
int[] copyArr = copyOfRange(arr,3,7);
//3.遍歷陣列
for (int i = 0; i < copyArr.length; i++) {
System.out.print(copyArr[i] + " ");
}
}
public static int[] copyOfRange(int[] arr,int from,int to){
//1.定義陣列
int[] newArr = new int[to - from];
//2.把原始陣列arr中的from到to上對應的元素,直接複製到newArr中
//偽造索引
int index = 0;
for (int i = from; i < to; i++) {
newArr[index] = arr[i];
index++;
}
//3.返回
return newArr;
}
}
方法的記憶體
方法呼叫的基本記憶體原理
- 方法被呼叫之後就會進棧執行
- 方法進棧時,先進棧的方法後出,後進展的方法先出(先進後處)
方法傳遞基本資料型別的記憶體原理
基本資料型別
- 變數中儲存的是真實的資料
引用資料型別
- 只要是new出來的都是引用資料型別
- 變數中儲存的是地址值
- 引用:使用了其他空間的資料
從記憶體的角度去解釋:
- 基本資料型別:資料值是儲存在自己的空間中
- 特點:賦值給其他變數,也是賦的真實的值
- 引用資料型別:資料值是儲存在其他空間中,自己空間中儲存的是地址值
- 特點:賦值給其他變數,賦的地址值
方法傳遞引用資料型別的記憶體處理
- 傳遞基本資料型別時,傳遞的是真正的資料,形參的改變,不影響實際引數的值
- 傳遞引用資料型別時,傳遞的是地址值,形參的改變,硬性實際引數的值