# :-: Java基本語法
[TOC]
# 1.函數
## 1.1.函數的引入
* 循環練習:
需求:獲取1-100之間6的倍數的個數。
分析:
1、個數是未知的,所以定義變量。
2、6的倍數咋表示?只要是對6能整除,也就是沒有余數。
3、需要對1-100之間所以的數都要進行判斷是不是6的倍數。如果是,需要對個數變量進行自增。
4、怎么完成1-100之間呢?使用循環。

* 在實際開發中,類似的功能很可能經常出現;
很可能又要新的需求:計算1到100之間7的倍數的個數;
計算1到50之間6的倍數的個數;
……
為了解決這個問題,可以使用函數(方法;)
## 1.2.函數的概念
### 1.2.1.函數的概念
java中的函數,又叫做方法,是定義在類中的一段獨立的代碼,具有特定功能;
### 1.2.2.函數的作用
函數的作用,就是用來提高程序的復用性(降低程序的冗余性),提高開發效率,降低維護成本的;
##1.3.函數的使用
###1.3.1.函數的書寫格式
書寫格式:
```
修飾符 返回值類型 函數名(數據類型 變量名,數據類型 變量名……){
具體實現功能的代碼(方法體);
return 語句;
}
```
格式詳解:

###1.3.2.函數的聲明方式

聲明函數的方式:兩個明確

* 結論:
聲明函數的過程:
1、搞清楚這個函數的功能;
2、根據函數的格式寫出函數的架子(缺少返回值類型和參數列表)
3、根據函數的功能搞定兩個明確:
(1)明確函數的返回值類型:問:這個功能執行完畢后有沒有結果返回?
(2)明確函數的參數列表:問:這個功能是否需要調用者傳遞數據?
4、書寫函數的功能代碼;
### 1.3.3.函數的調用方式
根據函數名和參數列表來調用;

### 1.3.4.函數執行的過程

### 1.3.5.函數的聲明誤區
畫蛇添足;

注意:
一個函數一個功能,不要太復雜,都寫在一個函數里面;一般一個函數大概二三十行代碼;在復雜,就要考慮邏輯上有沒有問題;
如果邏輯沒有問題,最好將大的功能拆分為多個小的功能,寫成多個小的函數,然后通過函數調用實現大的功能;
## 1.4.函數的重載(overload)
### 1.4.1.問題的引入
需求1:計兩個整數的和;
需求2:計算三個整數的和
需求3:計算四個整數的和

### 1.4.2.重載的概念
概念:在Java中,函數的重載,指的是:在同一個類中,允許存在多個函數名相同、參數列表不同的函數;這種情況叫做函數的重載;
函數的重載,和函數的返回值類型無關;
函數的重載,和函數的返回值類型無關;
函數的重載,和函數的返回值類型無關;
參數列表不同,指的是:
參數個數不同;
相同位置的參數的類型不同;
### 1.4.3.重載的好處
使用函數的重載,可以讓多個類似功能的函數使用相同的函數名,需要記憶的函數名數量就大大降低,開發者使用起來非常方便;
注意:在類似功能比較多的時候,可以使用函數的重載;
### 1.4.4.重載練習
已知函數:
```
public static int add(int a,char b){}
```
下列那些函數與之重載?
```
a:public static void add(int b,char a){}:不重載;因為函數名和參數列表都相同;
b:public static int add1(int a,char b){}:不重載;因為函數名不同;
c:public static void add(int a){}: 重載;
d:public static void add(char a,int b){} 重載;
e:public static void add(){}: 重載;
```
## 1.5.函數總結
* 函數的概念:Java中的函數,又叫做方法,指的是定義在類中的一段獨立的代碼塊,可以實現一個具體功能;
* 函數的作用:函數通過將一段功能代碼抽取出來,在所有需要的地方直接調用的方式,提高程序的復用性;
* 函數的格式:
```
修飾符 返回值類型 函數名(參數列表){
方法體代碼;
return 語句;
}
```
* 函數聲明方法:
根據函數的功能,確定兩個明確:
* 1、明確函數的參數列表:這個功能需不需要調用者傳遞數據?如果需要,有多少數據,數據的類型是什么?
* 2、明確函數的返回值類型:這個功能結束后,有沒有數據需要返回?如果有,返回數據的類型是什么?
1. 函數使用誤區:
在一個函數中,只需要書寫和這個函數的功能有關的代碼,不要書寫其它無用代碼;
1. 函數的調用:
調用一個函數,需要通過函數名和參數列表共同確認一個函數;
如果需要接收函數結束后返回的數據,需要使用和函數返回值類型一樣的變量來接收;
如果一個函數沒有數據返回(返回值類型是void),就不能使用變量來接收;
1. 函數的重載:
概念:在同一個類中,允許存在多個函數名相同、參數列表不同的函數,叫做函數的重載;
好處:降低開發者需要記憶的函數名字,提高開發效率;
注意:函數的重載和函數的返回值類型無關,只和函數名和參數列表有關;
# 2.數組
## 2.1.問題引入
需求:計算一個班級100人的考試總分;

## 2.2.數組的概念
數組,就是一種容器,它可以保存多個相同類型的數據;而且數組一旦創建,容量不能更改
## 2.3.數組的定義格式
數組使用[] 表示;定義格式是:
數據類型[] 數組名(變量名) = new 數據類型[數組的容量];

## 2.4.數組的使用
### 2.4.1.數組元素的存取&數組的索引

結論:
Java中,數組都具有索引,索引實際上就是數組中每個存儲單元的編號;
向數組中保存數據和取出數據,都是通過索引進行的;
索引的特點是:
從0開始,依次遞增;最大索引就是數組容量減一;
2.4.2.數組的遍歷&數組的length屬性

在每個數組中,都有一個length屬性,表示數組的容量;
使用方式是:
數組名.length;
注意:因為數組一旦創建,容量就固定不變,所以數組的length屬性也不能改變;

2.5.數組的內存原理(了解)
2.5.1.java的內存組成

2.5.2.數組的內存圖解
需求1:畫出下面代碼執行的內存圖解:
```
public static void main(String[] args)
{
int[] array = new int[3];
array[0] = 10;
int a = array[0];
System.out.println(a);
System.out.println(array);
array = null;
System.out.println(array);
}
```
內存圖解:

需求2:下面的代碼執行結果是什么?為什么?
```
public static void main(String[] args) {
int[] array = new int[3];
int[] arr = array;
array[1] = 100;
System.out.println(arr[1]);
arr[1] = 50;
System.out.println(array[1]);
}
```

### 2.5.3.引用傳遞和值傳遞

如果是引用類型的變量,那么在變量中保存的是堆內存中的空間地址;
如果是引用類型的變量進行賦值,實際傳遞的是保存在變量中的地址,像這種傳遞數據的方式就叫做引用傳遞;
如果是基本類型的變量進行賦值,實際傳遞的是保存在變量中的常量值,叫做按值傳遞;
因為值傳遞傳遞的是實際數據,所以不同的基本類型的變量的修改,相互之間沒有影響;
應為引用傳遞傳遞的是堆內存中的引用地址,所以如果不同的變量保存的是相同的引用地址,那么他們都指向同一塊空間;任何一個變量對空間的修改,都已影響其他變量;
## 2.6.數組使用中的常見問題
### 2.6.1.NullPointerException
### 2.6.2.ArrayIndexOutOfBoundsException
## 2.7.數組的第二種定義格式
數組定義格式:
數據類型[] 數組名 = new 數據類型[數組容量];
數組名[索引] = 數據;
### 2.7.1.第二種定義格式
如果在定義數組時已經知道數組中會保存什么數據,就可以使用另一種定義方式,在創建數組的同時將數據保存在數組中;
格式:
數據類型[] 數組名 = new 數據類型[]{數據1,數據2,數據3,數據4……數據n};
注意:使用這種方式,不能在中括號中寫數組的容量;
這種定義格式的簡寫形式:
數據類型[] 數組名 = {數據1,數據2,數據3,數據4……數據n};
注意:簡寫只是為了書寫方便,實際上編譯器還是會加上new 這一部分;
注意:使用簡寫形式時,不能將數組變量的聲明和賦值寫成兩行;
# 3.方法和數組的練習
## 3.1.數組平均值:
例子:求下列數字的平均值:1.0,2.4,3.5,4.3,5.1,6.8,7.2,8,9,10
## 3.2.數組求最大值
例子:求下列數字的最大值:1.0,2.4,3.5,4.3,5.1,6.8,7.2,8,9,10
## 3.3.將數組中的元素轉為指定格式的字符串
例子:給定數組,返回指定格式的字符串;例如:將數組{1,2,3,4}轉為字符串:”[1,2,3,4]”;
## 3.4.將數組中元素倒序
例子:數組{1,2,3,4,5}倒序后為{5,4,3,2,1};

## 3.5.數組的查找
## 3.6.數組的排序
## 3.7.Arrays數組工具介紹
上面介紹了數組的一些練習,而針對數組的常見操作,Java已經提供好了,并書寫在Arrays中。在程序中是可以直接使用的。
```
public class Demo {
public static void main(String[] args) {
// 定義數組
int[] arr = { 23, 15, 67, 25, 90, 33 };
// 打印數組
System.out.println( Arrays.toString(arr) );
// 數組排序
Arrays.sort(arr);
System.out.println( Arrays.toString(arr) );
}
}
```
程序運行結果:

# 4.二維數組介紹
## 4.1.什么是二維數組
數組是一種容器,可以保存多個相同類型的數據;
在內存的角度看,數組就是內存中連續在一起的多個存儲空間;

如果一個數組中保存的數據的類型就是數組類型,那么數組中每個存儲單元中都保存的是一個其他數組的內存地址;
這種數組的數組就叫做二維數組;
## 4.2.二維數組使用演示
## 4.2.1.二維數組的格式
int[][] arr = new int[2][3];//表示創建一個二維數組;這個二維數組的每一個元素都是一個一維數組;
//上面聲明中的數字2表示聲明的二維數組的長度是2;3表示二維數組中每個一維數組的長度是3;

### 4.2.2.二維數組的使用

二維數組的遍歷:

作業:求下面二維數組的最大值、最小值、和、以及平均值;
int[][] a = new int[][]{new int[2],new int[]{2,3,4},{-1,-2,-3,4,5,6,7,8},null};
# 5.數組使用總結
## 5.1.數組的特點
1、數組是容器,可以保存相同類型的數據;
2、數組是容器,都具有容量,通過length屬性獲取;一個數組創建完成之后,容量大小不可改變;
3、數組中的元素都具有索引,索引是整數,從0開始,連續遞增,最大索引是數組容量減一;
## 5.2.數組使用場景
1、有多個數據要保存,數據類型一樣;
2、數據的數量要確定;(如果不確定,就不知道創建多大的數組合適)
如果數據很多,但是數據類型不一樣,或者數據總數也不確定;這個時候就要使用新的容器:集合