天天看點

方法和數組 - 打好基礎很重要1. 方法2. 數組

為滿足移動端和PC端的雙重閱讀體驗,以及文章品質的保證,開始重構的以及新寫的文章都會基于 “語雀” 平台編寫,公衆号會同步剛釋出的文章,但随後的修改或者更新隻會在語雀中維護。

👉 點選底部左下角 “閱讀原文” 即可跳轉到文章最新頁面!理想二旬不止@BWH_Steven

1. 方法

1.1 引入

還記得我們的HelloWorld例程嗎?我們現在對于輸出語句應該已經很熟悉了

System.out.println("HelloWorld");
           

複制

解釋:

  • System 是系統類。
  • out 是标準輸出對象。
  • println() 是一個方法。

如果我們想要在一個類中實作一些功能,但是如果我們想要多次使用某一個功能,顯然我們需要重複書寫這個功能的代碼多次,而方法就相當于把某些代碼封裝成一個模闆,哪次想用直接調用就可以了。

1.2 定義

定義:方法是定義在類中的一段獨立的代碼塊,用來實作某個功能。

  • 其實我們在程式設計界中更喜歡叫它們為函數,但是在Java中我們也可以叫做方法

作用:

函數的主要作用是為了提高代碼的複用性。

使程式簡短而清晰,更加利于維護

// [] 中代表可選項,即參數不是必須的
修飾符 傳回值類型 方法名 ([參數類型 參數名1, 參數類型 參數名2,...]){
    執行語句
    return 傳回值 // 傳回值的類型必須與傳回值類型一緻
}
           

複制

public static int testMethod(int age1, int age2) {
    int age = age1 + age2;
    return age;
}
           

複制

  • 修飾符: public static:public 代表公開的,static 是靜态的,這樣才能在 主函數中調用。具體我們會在後面具體介紹修飾符和 static 的知識。
  • 傳回值類型: 就是功能結果的資料類型,因為有一些方法需要将最後的結果傳回給你,進而讓開發者使用這個結果。而有一些方法執行代碼中的指令即可,執行後就可以結束了,并沒有傳回值(void)
舉例更好了解哦:最近有一場周傑倫的演唱會,我通過好多朋友幫忙一起的搶票方法,最後得到了兩張票,這兩張票就是“搶票”方法的傳回值,我(開發者)可以對這個傳回值進行任何操作,例如自己去看,或者送給朋友,甚至可以用來當草稿紙(哭…),而你幫朋友助力 "車票加速" "砍一刀",雖然你沒有什麼實質收貨,但是确實助力成功了。
  • 參數類型:參數的資料類型,主方法可以調用其他方法,其他方法可以互相調用,但不能調用主方法,主函數是系統調用的。

1.3 方法的調用

在剛開始的時候,尤其是沒有學習面向對象概念的時候,其實大部分都是直接在同一個類下編寫多個方法,然後再主函數中調用即可。後面學習了面向對象就會知道不同類之間的方法是怎麼調用的。

舉個方法調用的例子:

public class Demo {

    public static void main(String[] args) {
        int age = testMethod(10, 20);
        System.out.println("年齡和為:" + age);
    }

    public static int testMethod(int age1, int age2) {
        int age = age1 + age2;
        return age;
    }
}
           

複制

我們定義了一個 testMethod 方法,參數是傳入兩個 int 類型的年齡,将兩者取和後傳回即可。而在主函數中,調用了 testMethod 方法,傳入參數 10 和 20,然後接收 int 類型的傳回值 age,并且輸出列印了 age。

其實如果我們不需要對方法的傳回值 age 進行處理的話,直接使用如下寫法也是可以的。

public static void main(String[] args) {
    System.out.println("年齡和為:" + testMethod(10, 20););
}
           

複制

不過就前期而言,多寫一步也沒什麼壞處。

方法中也是如此,例如對于比較兩個參數值 a 和 b 是否相同 if 語句的優化

// 普通版
if(a == b){
    return true;
} else{
    return false;
}

// 三元運算符改進
boolean flag = ((a == b) ? true : false);
return flag;

// 直接傳回三元運算符
return ((a == b) ? true : false);

// 直接傳回
return a == b;
           

複制

1.4 方法重載

一般來說,我們都是根據作用來命名方法(方法名有意義),但是很多時候會我們會針對不同的資料類型,或者參數個數來進行操作,例如我們所要求幾個數字中的最大值問題就出現了這兩種問題。使用方法重載,既可以保證命名有意義,也可以避免記憶過多的不同名稱

int max (int a, int b, int c);

double max (double a, double b, double c);

long max (long a, long b, long c);

int max (int a, b);
           

複制

定義:用同一方法名定義多個方法,這些方法的參數個數或者參數類型不同

作用:使一個方法名賦予新的含義,使一個方法名可以多用

适用:實作細節不同的同一類功能時候

了解:其實就是使得一個方法擁有了更多的可能性,一個名稱解決多種問題。

注意:

  1. 函數的傳回類型不同,但參數個數和類型相同,不是重載 。
  2. 重載函數的的參數個數,參數類型,參數順序至少有一個需要不同 。

2. 數組

2.1 概念

講解數組的概念之前,我們先來舉個例子,幫助一下了解:

我們在籃球場比賽中,夢之隊運動員共有10名,我們分别将每個人定義為幾号運動員,這樣我們找某一個人的時候,我們就會先找到夢之隊這支隊伍,然後去找對應編号的人。而數組就像這隻隊伍的概念一樣,而數組中的每一個元素就是每一個球員,當你需要找數組的某一個元素的時候,隻需要找到你需要查找的數組(夢之隊),再根據數組下标(對應編号)去尋找對應元素(球員)。這樣做的好處就是,我們将一批同類型的元素整理歸納到了一起,并且标号記錄。既友善了查找與使用,又避免了定義多個變量的麻煩。

概念:數組是一個容量固定,存儲一些相同類型元素的順序集合,而且所有的數組都是由連續的記憶體位置組成的。

dataType[] arrayRefVar; // 首選的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首選方法
           

複制

第一種讀法:定義一個 dataType類型的數組 arrayRefvar 變量,它可以認為是 Java 風格的定義格式,推薦第一種,不過也隻是程式設計風格不同罷了。

2.2 初始化

知道了定義後,如何真正的去建立一個數組出來呢?new 一個出來就好了。

new 的概念會在面向對象中重點闡述,這裡我們隻要記住即可。

在這個 new 一個數組的過程中,就會為數組開辟記憶體空間,為每個數組元素賦予值(記憶體配置設定問題就在下面哦)

2.2.1 動态初始化

動态初始化:隻指定長度,由系統給出初始化值。

  • 也就是說,我們隻告訴系統,我們需要一個多大容量的數組,但是我們在初始化的時候還不去指派,這個時候其實系統會在背後預設為數組設定一個初始值。例如 int 類型的數組就會預設指派 0。
// 格式
資料類型 [] 數組名 = new 資料類型 [數組長度];
           

複制

// 舉例
int [] arr = new int [3];
           

複制

2.2.2 靜态初始化

給出初始化值,由系統決定長度,例如大括号内有3個元素,系統就會預設的建立一個長度是 3 的數組。

// 格式
資料類型 [] 數組名 = new 資料類型 [] {元素1,元素2,...};v
           

複制

// 舉例
int [] arr = new int [] {1,2,3};
           

複制

簡化格式

// 格式
資料類型 [] 數組名 = {元素1,元素2,...};
           

複制

// 舉例
int [] arr = {1,2,3};
           

複制

2.3 數組的通路

數組的元素是通過索引通路的。數組索引從 0 開始,是以索引值從 0 到 數組長度-1。

例如想通路 array 數組第一個元素就是 array[0]

後面我們會學習 Java 中的集合,例如 ArrayList 等,雖然我們後面基本都是以這些集合為主,但是它們的底層其實都離不開數組,是以後面學習要注意比對。

在Java中,數組是一種效率最高的存儲和随機通路對象的引用序列的方式。數組就是一個簡單的線性序列,這使得元素通路非常快速。但是為這種速度所付出的代價是數組對象的大小被固定,并且在其生命周期中不可改變。你可能會建議使用ArrayList,它可以通過建立一個新執行個體,然後把舊執行個體中所有的引用到移到新執行個體中,進而實作更多空間的自動配置設定。盡管通常應該首選ArrayList而不是數組、但是這種彈性需要開銷,是以,ArrayList的效率比數組低很多。

——Thinking in Java 第16章

2.4 數組的周遊

什麼是周遊?簡單來說就是把數組中的每一個元素都讀一遍,你可以對數組中的每一個數進行處理,又或者找到數組中那個你需要的數。

2.4.1 普通 for

但是有時候就想哈,每一次我的數組元素數量較少的時候還可以,我數一數有多少個元素也就知道我需要周遊多少次了,但是如果數組元素太多呢,又或者我把周遊數組編寫成一個方法,參數就是一個數組,不同的數組(元素數量不同),很顯然需要周遊的次數是不靈活的,是以我們介紹一個更為靈活的屬性——length

針對元素數量較多的數組 可以使用 length屬性 擷取數組的長度

public static void main(String[] args) {
    int [] array = {11, 22, 33, 44, 55};
    for(int i = 0; i < array.length; i++){
        System.out.println(array[i]);
    }
}
           

複制

2.4.2 增強 for

JDK 1.5 引進了一種新的循環類型,被稱為 For-Each 循環或者增強For循環, 它能在不使用下标的情況下周遊數組。

public static void main(String[] args) {
        int [] array = {11, 22, 33, 44, 55};
        for (int arr : array){
            System.out.println(arr);
        }
    }
           

複制

它的功能強大就在于不必為了下标的起始值和終止值而分心,代碼更加簡潔,更不容易出錯。

事物總是有兩面性的,雖然增強for循環帶來了簡潔和快速,但是并不是萬能的,有的時候我們必須使用傳統的for循環,例如不希望周遊每一個元素,或者在循環内部需要使用下标等。

補充:

如果僅僅是想要列印數組中的所有值,我們可以利用Arrays類中的toString方法

輸出後格式如下:[1,3,6,5,6]

2.5 二維數組

2.5.1 概念

具有兩個下标的數組稱為二維數組。有些資料要依賴于兩個因素才能惟一地确定。

例如我們下面的這個案例一個班級有三個學生,每個學生又對應四科成績,是以我們必須用一個二維數組來存儲,第一項儲存學生資訊,第二項存儲成績資訊

Student Number Course1 Course2 Course3 Course4
Student1 55 66 58 77
Student2 87 58 48 64
Student3 65 78 70 56

例如想表示第三個學生的第四門課程如下:float a[3][4]

方法和數組 - 打好基礎很重要1. 方法2. 數組

image.png

2.5.2 格式

// 格式
type arrayName = new type[arrayLength1][arrayLenght2];
           

複制

// 例子
int a[][] = new int [2][3];
           

複制

  • arrayLength1 為行數(表示這個二維數組有多少個一維數組)
  • arrayLenght2 為列數(表示這個一維數組的元素個數)
type arrayName = new type[arrayLength1][];
           

複制

  • 表示這個二維數組可以有多少個一維數組
  • 列數沒有給出,可以動态的給

舉個例子:

String s[][] = new String[2][];

s[0] = new String[2];
s[1] = new String[3];

s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");
           

複制