JavaSE之数组、方法知识点总结
文章目录
一、方法
1.方法
(1)定义:将一个独立的代码块{}抽取出来,并为其起名字(方法名)。
(2)作用:减少代码的冗余,提高代码的复用性
(3)方法的类别:
有返回值类型的方法
没有返回值类型的方法
2.方法的定义与调用
(1)有返回值类型的方法格式:
public static 返回值类型 方法名(形式参数类型1 参数名称1,形式参数类型2 参数名称2...)
{
业务逻辑...
return 结果;
}
(2)没有返回值类型的方法格式:
public static void 方法名(形式参数类型1 参数名称1,形式参数类型2 参数名称2...)
{
业务逻辑...
}
(3)格式的详细介绍
权限修饰符:public(公共的,访问权限足够大) static(静态)
返回值类型:基本数据类型和引用数据类型
方法名:遵循标识符的规则
形式参数类型:基本数据类型和引用数据类型
参数名称(变量名称):遵循标识符的规则
return: 这个方法调用完毕了,带回具体的结果
void:没有返回值
(4)方法调用
有返回值类型
1)单独调用(没有意义)
2)输出调用:不推荐
3)赋值调用:推荐
没有返回值:单独调用
3.方法重载 (Overload)
(1)定义:在同一个类里,方法名相同,参数列表不同,与返回值无关。
(2)参数列表不同:
1)数据类型一样的,参数个数不同
2)参数个数一样,类型不同!
3)参数个数不一样,参数类型不同
(3)应用:调用方法,实际传入的参数类型和个数,系统会自动匹配到相应的方法。
(4)需要使用重载的情况:一个类里,有多个方法,且功能大致一样,细节实现不一样就可以考虑使用重载。
4.实参与形参
(1)形式参数(形参):声明方法时,规定参数类型和变量名
(2)实际参数(实参):调用方法时,传入的数据
(3)注意:
1)形参必须声明类型
2)实参不用声明类型
3)多个形参用逗号隔开
4)实参与实参之间也是用逗号隔开
5)形参规定的类型及顺序,实参必须遵守
5.基本类型和引用类型做形参的特点
(1)基本类型作为形参进行传递,形参的改变对实参没有影响。
(2)引用类型作为形参进行传递,形参改变,实参也随之发生改变。
(3)String类型作为形参,形参的改变对实参没有影响。
(4)基理:
1)基本数据类型做形参传递的是值;
2)引用类型做形参传递的是内存地址;
3)字符串是一个常量,一旦被赋值,其值不能被更改。
6.注意事项
(1)方法和方法平级关系,不能嵌套使用。
特殊:方法递归:方法调用方法本身的一种现象。
(2)定义方法注意两个明确
明确返回值类型
明确参数类型以及参数个数
(3)定义方法的时候:
如果有参数必须得有参数类型
举例:public static int add(int x,int y){}
(4)定义方法的时候,()后面不要出现; (目前来说没意义的方法!)
(5)调用方法的时候,实际参数不需要携带数据类型。
7.递归:方法调用方法自身
(1)注意
如果方法一直调用自身,就是个死循环,程序会崩溃掉, 因为每次调用方法都会在栈内存中开辟空间,如果栈内存满 载了,程序就会报栈内存溢出的错误,这种错误是不可恢复的,程序百分百崩溃掉。真正去玩递归,一定要根据需求找规 律和找出口。
(2)找规律:什么情况下方法应该调用方法自身
(3)找出口:防止死循环,返回具体的值时,才能一层一层往上返回。
二、数组
1.数组
(1)数组:一组数据的集合,是可以存储多个数据的一种容器。
(2)定义格式:
数据类型[ ] 数组名称 ;
数据类型 数组名称[ ] ;
举例:
int[] arr; (习惯于第一种) 定义了一个int类型数组arr变量
int arr[] ;定义了一个int类型的arr数组
(3)注意:
1)数组只能存一种类型,数组声明时使用什么类型,里面的数据就必须是什么类型。
2)数组里的数据又叫做元素。
3)数组里的元素都有从0开始的编号,叫做下标/索引。
4)数组是引用数据类型。
5)数组一旦创建,该数组的长度就不可以更改。
2.数组的初始化
(1)初始化(创建数组):
1)动态初始化:指定了数组长度,系统默认给定数组的元素值。
2)静态初始化:指定了具体的元素内容,系统默认指定数组的长度。
(2)默认值:
整数类型:0 (int[] is = new int[4];)
浮点类型:0.0
字符类型:’ '(空格)
布尔类型:false
引用类型:null(空)
(3)动态初始化:
数据类型[ ] 数组名称 = new 数据类型[数组长度] ;
数据类型 数组名称[ ] = new 数据类型[数组长度] ;
举例:
int[] arr = new int[3] ;//创建了一个数组对象,分配3个长度
int arr[] = new int[2] ;//.创建了一个数组对象,分配2个长度
(4)静态初始化
1)标准格式:
数据类型[ ] 数组名称 = new 数据类型[ ] {元素1,元素2,元素3…} ;
数据类型 数组名称[ ] = new 数据类型[ ] {元素1,元素2,元素3…} ;
举例:
int[] arr = new int[]{11,22,33} ;
2)简化格式:
数据类型[ ] 数组名称 ={元素1,元素2,元素3…} ;
数据类型 数组名称[ ] ={元素1,元素2,元素3…} ;
举例:
int[] arr = {1,2,3} ;
(5)数组中元素的的访问方式:数组名称[角标]来访问
举例:arr[0]:数组arr的0号下标元素(第一个元素)
(6)数组的遍历:将数组中的元素一一输出。
(7)数组的length属性: 获取数组的长度。
可以通过数组对象名称.length,获取长度。
3.for循环遍历 vs foreach循环遍历
(1)格式:
for循环遍历
for(初始化语句;循环条件;步进语句){
Systen.out.println(数组名[下标]);
}
foreach循环遍历
for(数组的数据类型 变量名 : 数组名){
Systen.out.println(变量名);
}
(2)应用场景:
for循环遍历:遍历时,可以拿到下标进行操作。
foreach循环遍历:遍历时,拿不到下标,只能拿到数据。
(3)使用
遍历要用到下标,只能用for循环。如果仅仅是输出数组内的数据,用foreach即可。
4.冒泡排序(从小到大)
(1)思想:两两比较,将较大的值往后放;第一次比较完毕,最大值就出现在最大索引处,依次这样比较。
(2)规律:
N个数字来排序
两两(相邻)相比,小靠前
外层循环N-1(轮数)
内层循环N-1-i(每轮比较次数)
(3)代码实现
for(int i = 0; i<arr.length-1; i++){
for(int j = 0; j<arr.length-1-i ;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
5.二维数组
(1)定义:它就是一个包含多个一维数组的数组。
举例:
排队:将一个班的人排成m排n列的方阵
一排看成一个有n个元素的一维数组
总共有m排,即为m个一维数组
组成方阵即为一个二维数组
(2)二维数数组的定义格式
数据类型[ ] 数组名称[ ] ;
数据类型[ ][ ] 数组名称 ;
(3)注意
int x,y[] ; //x是普通遍量,y是一维数组
int x[][],y[] ;//x是二维数组,y是一维数组。
6.二维数组的初始化
(1)动态初始化: 指定数组长度,系统给数组中元素分配默认值。
(2)静态初始化: 指定了具体的元素内容,系统默认指定数组的长度。
(3)动态初始化格式1
数据类型[ ][ ] 数组名称 = new 数据类型[m][n] ;
m:表示当前二维数组中的一维数组的个数。
n:表示每一个一维数组的长度。
举例:
int[][] arr = new int[3][2] ;
或
int[] arr[] = new int[3][2] ;
System.out.println(arr) ; //二维数组对象 [[I@6d06d69c
[[I@6d06d69c解释:
[[:表示二维数组
I:int类型
@:地址值标记
6d06d69c:十六进制数据
(4)动态初始化格式2
数据类型[ ][ ] 数组名称 = new 数据类型[m][ ] ;
数据类型[ ] 数组名称[ ] = new 数据类型[m][ ] ;
举例:
int[] arr[] = new int[2][] ;
arr[0]=new int[3];
arr[1]=new int[4];
上面:当前二维数组arr中有2个一维数组,但是不知道2个一维数组的长度,所以需要动态给定一维数组的长度
(5)静态初始化格式
1)标准格式
数据类型[ ][ ] 数组名称 = new 数据类型[ ][ ]{{元素1,元素2,…},{元素1,元素2…},{元素1,元素2…}};
2)简化格式
数据类型[ ][ ] 数组名称 = {{元素1,元素2,…},{元素1,元素2…},{元素1,元素2…}};
(6)注:要么动态初始化/要么静态初始化,动静结合会报错
int[][] arr = new int[3][2]{{1,2,3},{4,5,6}} ;
7.二维数组遍历
二维数组是由多个一维数组组成,需要将每一个一维数组的元素获取到,一一输出,使用嵌套for循环遍历,或者嵌套 foreach。
三、提及的知识
1.转移字符
定义:字母前面加上右手杠(\)来表示常见的那些不能显示的ASCII字符,称为转义字符。
序号 | 转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|---|
1 | \a | 响铃(BEL) | 007 |
2 | \b | 退格(BS) ,将当前位置移到前一列 | 008 |
3 | \f | 换页(FF),将当前位置移到下页开头 | 012 |
4 | \n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
5 | \r | 回车(CR) ,将当前位置移到本行开头 | 013 |
6 | \t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
7 | \v | 垂直制表(VT) | 011 |
8 | \\ | 代表一个反斜线字符"\" | 092 |
9 | \’ | 代表一个单引号(撇号)字符 | 039 |
10 | \" | 代表一个双引号字符 | 034 |
11 | \? | 代表一个问号 | 063 |
12 | \0 | 空字符(NUL) | 000 |
13 | \ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
14 | \xhh | 十六进制所代表的任意字符 | 十六进制 |
2.Math
java.lang.Math
包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
获取随机数的方法:
public static double random() :取值范围[0.0,1.0)
3.异常(Throwable)
(1)定义:程序出问题了。
(2)分类:
1)error : 内存异常了 (通过一些第三方工具避免了!)
举例: 一些软件通过一些特殊的操作:造成软件崩溃了!
2)Exception: 能够通过本身代码来解决问题
(3)编译时期异常:只要不是运行时期的异常都属于编译时期。
(4)RuntimeExcetion:运行时期异常,在执行过程中,由于代码结构不严谨,导致的问题。
举例:
第一个异常:数组角标越界!
java.lang.ArrayIndexOutOfBoundsException:
出现的原因:访问不存在的角标!就出异常了
解决方案:改动角标值即可!
第二个异常:空指针异常:
java.lang.NullPointerException:
出现的原因:某个对象都为null,还需要使用对象访问内容或者调用其他功能!
解决方案:只需要对某个对象做一个非空判断!(逻辑判断)
4.java内存分配
栈内存:存储一般都是局部变量(在方法定义中/方法声明上);
堆内存:new出来的东西都在堆内存中;
方法区:存储相关class区,相关static区域、字符串常量池等。
总结
本文主要从方法的作用与分类、方法的定义与调用、方法的重载、实参与形参、值传递和地址传递、方法的递归调用、一维数组的概念与定义格式、一维数组的初始化、一维数组的遍历、冒泡排序、二维数组的概念与定义格式、二维数组的初始化、二维数组的遍历等方面总结了JavaSE数组和方法部分的知识点。并就数组中的常见问题作了另外的简单整理。