# :-: Java基本语法
[TOC]
# 1.函数
## 1.1.函数的引入
* 循环练习:
需求:获取1-100之间6的倍数的个数。
分析:
1、个数是未知的,所以定义变量。
2、6的倍数咋表示?只要是对6能整除,也就是没有余数。
3、需要对1-100之间所以的数都要进行判断是不是6的倍数。如果是,需要对个数变量进行自增。
4、怎么完成1-100之间呢?使用循环。
![](https://box.kancloud.cn/4b7dc8b99d3c4e49b639df2e5d9b67a3_895x381.png)
* 在实际开发中,类似的功能很可能经常出现;
很可能又要新的需求:计算1到100之间7的倍数的个数;
计算1到50之间6的倍数的个数;
……
为了解决这个问题,可以使用函数(方法;)
## 1.2.函数的概念
### 1.2.1.函数的概念
java中的函数,又叫做方法,是定义在类中的一段独立的代码,具有特定功能;
### 1.2.2.函数的作用
函数的作用,就是用来提高程序的复用性(降低程序的冗余性),提高开发效率,降低维护成本的;
##1.3.函数的使用
###1.3.1.函数的书写格式
书写格式:
```
修饰符 返回值类型 函数名(数据类型 变量名,数据类型 变量名……){
具体实现功能的代码(方法体);
return 语句;
}
```
格式详解:
![](https://box.kancloud.cn/827886666215797970f2b23cc763d259_1131x538.png)
###1.3.2.函数的声明方式
![](https://box.kancloud.cn/630f7d045978ba0fd4bf6337c80ced79_584x299.png)
声明函数的方式:两个明确
![](https://box.kancloud.cn/6c6246022ec5bae17ec438f51b6f43ef_892x678.png)
* 结论:
声明函数的过程:
1、搞清楚这个函数的功能;
2、根据函数的格式写出函数的架子(缺少返回值类型和参数列表)
3、根据函数的功能搞定两个明确:
(1)明确函数的返回值类型:问:这个功能执行完毕后有没有结果返回?
(2)明确函数的参数列表:问:这个功能是否需要调用者传递数据?
4、书写函数的功能代码;
### 1.3.3.函数的调用方式
根据函数名和参数列表来调用;
![](https://box.kancloud.cn/bcaf9f50c2706714712df95a5059bd77_689x362.png)
### 1.3.4.函数执行的过程
![](https://box.kancloud.cn/8213c68c79bd3eb503db4de61270708e_1196x516.png)
### 1.3.5.函数的声明误区
画蛇添足;
![](https://box.kancloud.cn/6fdc46f87abffd437d432559c8101ef2_682x231.png)
注意:
一个函数一个功能,不要太复杂,都写在一个函数里面;一般一个函数大概二三十行代码;在复杂,就要考虑逻辑上有没有问题;
如果逻辑没有问题,最好将大的功能拆分为多个小的功能,写成多个小的函数,然后通过函数调用实现大的功能;
## 1.4.函数的重载(overload)
### 1.4.1.问题的引入
需求1:计两个整数的和;
需求2:计算三个整数的和
需求3:计算四个整数的和
![](https://box.kancloud.cn/bc6515c7dc848ff2dbf33d8d92f07461_554x527.png)
### 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人的考试总分;
![](https://box.kancloud.cn/bb4ca34730ddb858fb9a4e9902112703_678x273.png)
## 2.2.数组的概念
数组,就是一种容器,它可以保存多个相同类型的数据;而且数组一旦创建,容量不能更改
## 2.3.数组的定义格式
数组使用[] 表示;定义格式是:
数据类型[] 数组名(变量名) = new 数据类型[数组的容量];
![](https://box.kancloud.cn/47f43f930b5ff17b4bd21e30ca0b49a6_278x80.png)
## 2.4.数组的使用
### 2.4.1.数组元素的存取&数组的索引
![](https://box.kancloud.cn/214520f52863646f87e19962fe2040b8_674x290.png)
结论:
Java中,数组都具有索引,索引实际上就是数组中每个存储单元的编号;
向数组中保存数据和取出数据,都是通过索引进行的;
索引的特点是:
从0开始,依次递增;最大索引就是数组容量减一;
2.4.2.数组的遍历&数组的length属性
![](https://box.kancloud.cn/5559131e7ae9605586500dbdbbe7b4c3_635x315.png)
在每个数组中,都有一个length属性,表示数组的容量;
使用方式是:
数组名.length;
注意:因为数组一旦创建,容量就固定不变,所以数组的length属性也不能改变;
![](https://box.kancloud.cn/e79962a0bc30c9fd8cbc83aa2205665b_805x461.png)
2.5.数组的内存原理(了解)
2.5.1.java的内存组成
![](https://box.kancloud.cn/dcb6881a51c975b868560952cd9d2af2_482x414.png)
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);
}
```
内存图解:
![](https://box.kancloud.cn/f4b729c68c7c9e21f104557eda9af874_1142x466.png)
需求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]);
}
```
![](https://box.kancloud.cn/b8d4c63815d1637ab02785ef00ee7703_1031x415.png)
### 2.5.3.引用传递和值传递
![](https://box.kancloud.cn/e57a0a251e04a67893af057fffe978e5_1140x527.png)
如果是引用类型的变量,那么在变量中保存的是堆内存中的空间地址;
如果是引用类型的变量进行赋值,实际传递的是保存在变量中的地址,像这种传递数据的方式就叫做引用传递;
如果是基本类型的变量进行赋值,实际传递的是保存在变量中的常量值,叫做按值传递;
因为值传递传递的是实际数据,所以不同的基本类型的变量的修改,相互之间没有影响;
应为引用传递传递的是堆内存中的引用地址,所以如果不同的变量保存的是相同的引用地址,那么他们都指向同一块空间;任何一个变量对空间的修改,都已影响其他变量;
## 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};
![](https://box.kancloud.cn/c89fd40a9e779380cbb05e469c6905f3_1287x489.png)
## 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) );
}
}
```
程序运行结果:
![](https://box.kancloud.cn/1d69bd991f2cec71e84ec5feac63413b_449x101.png)
# 4.二维数组介绍
## 4.1.什么是二维数组
数组是一种容器,可以保存多个相同类型的数据;
在内存的角度看,数组就是内存中连续在一起的多个存储空间;
![](https://box.kancloud.cn/046a23377d5f5cc0dad09d976bc0902f_591x497.png)
如果一个数组中保存的数据的类型就是数组类型,那么数组中每个存储单元中都保存的是一个其他数组的内存地址;
这种数组的数组就叫做二维数组;
## 4.2.二维数组使用演示
## 4.2.1.二维数组的格式
int[][] arr = new int[2][3];//表示创建一个二维数组;这个二维数组的每一个元素都是一个一维数组;
//上面声明中的数字2表示声明的二维数组的长度是2;3表示二维数组中每个一维数组的长度是3;
![](https://box.kancloud.cn/2ea34f2a460244950e1a8a85982d2ea4_346x251.png)
### 4.2.2.二维数组的使用
![](https://box.kancloud.cn/348fdf07a08540dd0787904d310c430b_566x423.png)
二维数组的遍历:
![](https://box.kancloud.cn/2928cfcca7838b4906688310a529f7d8_874x490.png)
作业:求下面二维数组的最大值、最小值、和、以及平均值;
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、数据的数量要确定;(如果不确定,就不知道创建多大的数组合适)
如果数据很多,但是数据类型不一样,或者数据总数也不确定;这个时候就要使用新的容器:集合