1. 程式人生 > 實用技巧 >STL 容器 小 demo

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就是方法的形參,提前定義好的當該方法被呼叫時,一個接受外界輸入資料的盒子
      public int add(int a,int 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);
      System.out.println(add);
      }

      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);
    }
    }