# :-: 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、数据的数量要确定;(如果不确定,就不知道创建多大的数组合适)
如果数据很多,但是数据类型不一样,或者数据总数也不确定;这个时候就要使用新的容器:集合