STL 容器 小 demo
1、方法概念
Java方法是語句的集合,他們在一起執行一個功能
-
方法是解決一類問題的所需步驟的有序集合
-
方法包含於類或物件中
-
方法在程式中被建立,在其他地方被引用
設計方法時,要儘量保證方法的原子性,就是一個方法只完成一個功能,有益於後續擴充套件
2、方法定義和呼叫
2.1、定義
//語法
修飾符 返回值型別 方法名(引數型別 引數名){
方法體
return 返回值;
}
//示例1
public int add(int a,int b){
int c = a + b;
return c;
}
//示例2
public void test(){
System.out.println("這個方法沒有返回值");
}
-
修飾符:定義了該方法的訪問型別,告訴編譯器如何呼叫該方法,可選
-
返回值型別:方法可能存在返回值,像示例1,返回一個數據型別為int整形的資料,方法也可能不存在返回值,在這種情況下,返回值型別的關鍵字為void,如示例2所示
-
方法名:方法的實際名稱,和引數列表共同構成方法簽名
-
引數型別和引數名:兩者共同構成引數列表,引數列表是指方法的引數型別,引數先後順序,引數的個數
-
引數相當於是一個佔位符,可選,當方法被呼叫時,傳遞具體的值(實參,引數實際的值)給引數
-
形參:當該方法被呼叫時用於接受外界輸入的資料
//這裡的a和b就是方法的形參,提前定義好的當該方法被呼叫時,一個接受外界輸入資料的盒子
-
實參:呼叫方法時,實際傳給該方法的資料
//該方法被呼叫時,1傳遞給了a,2傳遞給了b
add(1,2);
-
-
方法體:方法體包含具體的語句,定義該方法的功能
2.2、呼叫
//語法
物件名.方法名(實參列表)
-
Java支援兩種呼叫方法的方式,根據是否有返回值來選擇
-
當方法返回一個值的時候,方法呼叫通常被當作一個值
public class Test {
public static void main(String[] args) {
//add方法被呼叫方法呼叫,結果為一個整型資料
int add = add(1, 2);
}
public static int add(int a,int b) {
int c = a + b;
return c;
}
} -
如果方法的返回值是void,方法呼叫的結果一定是一條語句
public class Test {
public static void main(String[] args) {
//noReturn方法被呼叫,方法沒有返回值,所有不用定義變數來接收返回值
noReturn();
}
public static void noReturn() {
System.out.println("這個方法沒有返回值");
}
}
-
-
值傳遞和引用傳遞
-
基本資料型別作為引數的方法呼叫
public class Test02 {
/*
這裡的change方法中,形參是a,實參是b
實參給形參傳遞資料的方式為:實參b將值20複製一份給形參a
實參和形參是兩個方法中的相互獨立的區域性變數,所以修改形參a不會影響實參b的值
*/
public static void change(int a){
a = 10;
System.out.println("a = " + a);//輸出結果為:a = 10
}
public static void main(String[] args) {
int b = 20;
change(b);
System.out.println("b = " + b);//輸出結果為:b = 10
}
} -
引用型別作為引數的方法呼叫
//定義一個Point類
class Point{
int x;
int y;
public Point(int x,int y){
this.x = x;
this.y = y;
}
public void show(){
System.out.println("(x = " + x + ",y = " + y + ")");
}
}
public class TestReferencePassing {
/*
這裡的change方法中,形參是point物件中的兩個屬性 x 和 y,實參是change方法中實際賦值給 x 和 y的值。實參給形參傳遞資料的方式為:實參將直接覆蓋修改原先形參的值
*/
public static void change(Point p1){
p1.x = 5;
p1.y = 5;
}
public static void main(String[] args) {
Point point = new Point(1,1);
//呼叫change方法前,show()方法的輸出結果為(x = 1,y = 1)
point.show();
change(point);
//呼叫change方法前,show()方法的輸出結果為(x = 5,y = 5)
//說明Point物件中x和y的值已經發生改變
point.show();
}
}記憶體分配過程如下圖所示:
-
-
基本資料型別的引數傳遞是值傳遞,引用型別的引數傳遞是引用地址,本質上也是值傳遞,所以Java引數傳遞的方式是值傳遞
3、方法過載
-
過載就是在一個類中,有相同的函式名稱,但形參不同的函式
-
方法過載的規則
-
方法名稱必須相同
-
引數列表不同
-
引數型別不同
public void add(int a) {}
public void add(String a) {} -
引數的個數不同
public void add(int a) {}
public void add(int a,int b) {} -
有兩個或者之上的不同引數型別的引數的先後順序不同
public void add(int a,String b) {}
public void add(String b,int a) {}
-
-
方法的返回型別可以相同也可以不相同
-
僅僅返回型別不同不足以構成方法過載
-
-
實現理論
方法名稱相同時,編譯器會根據呼叫方法的引數個數、引數型別等去逐個匹配,以選擇對應的方法
4、可變長引數
//語法
修飾符 返回值型別 方法名(引數型別... 引數名){}
//示例
public void vlParams(int x,int... i){}
-
定義可變長引數後引數的數量不定,根據呼叫方法時傳遞的引數數量而定
-
一個方法中只能指定一個可變長引數,它必須是方法的最後一個引數
5、遞迴
-
方法呼叫自身
-
遞迴結構
-
邊界條件:判斷什麼時候不再呼叫自身的條件
-
前階段:呼叫自身
-
返回階段:得到最終的一個值,返回給程式
public class testRecursion {
public static void main(String[] args) {
System.out.println(recursion(5));
}
//計算 n!(n的階乘)
public static int recursion(int n){
//邊界條件
if (n == 1){
return n;
}else{
//前階段,呼叫自身n * recursion(n-1);
//返回階段:把值返回給程式
return n * recursion(n-1);
}
}
}
-
-
棧溢位
遞迴沒有邊界條件就會引起棧溢位錯誤
public class testRecursion {
public static void main(String[] args) {
//棧溢位錯誤:Exception in thread "main" java.lang.StackOverflowError
System.out.println(recursion(5));
}
public static int recursion(int n){
return n * recursion(n-1);
}
}