一、函数
1、函数的定义:在类中,有特定功能的一段小程序。
2、函数的格式:
修饰符 返回值类型 函数名(形参类型 形式参数1,形参类型 形式参数2...)
{
函数体;
reutrn返回值;
}
A:修饰符 public static
B:返回值类型 程序最终结果的数据类型
C:函数名 其实就是函数的名称,方便我们调用。
D:参数
形参类型 数据类型
形式参数 就是接收实际参数的变量
实际参数 就是实际参与操作的变量(常量)
E:函数体 就是按照正常的逻辑完成功能的代码。
F:返回值 就是程序的最终结果
G:reutrn 返回值哪里调用程序,return就把结果返回到哪里。
3、函数的特点:
A:函数与函数之间是平级关系。不能在函数中定义函数。
B:运行特点 函数只有被调用才执行。
C:定义函数可以将功能代码进行封装,便于对该功能进行复用。
D:函数的出现提高了代码的复用性。
F:对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
4、函数的调用
A:有明确返回值
a:单独调用 一般没有意义。
b:输出调用 但是如果想拿结果继续操作,就有问题了。所以,不好。
c:赋值调用 推荐方式。
B:void类型
单独调用
5、函数重载
A:函数名相同,参数列表不同(个数不同,对应的类型不同)。
与返回值类型无关。
B:举例:
publicstatic int sum(int a,int b){...}
publicstatic int sum(int a,int b,int c){...}
publicstatic int sum(float a,float b){...}
6、案例:
有明确返回值的例子:
A:求两个数据的和
B:比较两个数是否相等
void类型例子:
A:九九乘法表乘法表
2:数组
1、数组的定义:数组是存储同一种类型的多个元素的容器。数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为索引。组成数组的各个变量称为数组的分量,也称为数组的元素。
2、数组的好处:数组中的元素会被自动从0开始编号,方便我们获取。
3、数组的格式:
A:int[]arr = new int[3];
B:intarr[] = new int[3];
C:int[]arr = new int[]{1,2,3};
D:int[]arr = {1,2,3};
推荐使用A和D。
4、Java内存图:
A:栈 存储局部变量使用。
使用完毕,立马消失。
B:堆 所有new出来的都在堆里面。
a:每一个实体都有地址值
b:每一个实体内的内容都有默认值
整数:0
浮点数:0.0
字符:'\u0000'
布尔:false
c:在垃圾回收器空闲的时候被回收。
C:方法区
D:本地方法区
E:寄存器
内存知识补充:
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收),Java会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
5、二维数组:
5.1二维数组的定义:以数组作为数组元素的数组,即“数组的数组”。
5.2二维数组的格式:
A:int[][]arr = new int[3][2];
B:int[][]arr = new int[3][];
C:int[][]arr = {{1,2,3},{4,5},{6,7,8,9}};
6、数组的常见操作:
6.1数组的遍历
二维数组的遍历
6.2数组的排序
A;选择排序
1、先用0角标上的元素依次与其他元素进行比较,将较小值元素存放到0角标。
2、然后再拿1角标上的元素依次进行比较,以此类推。
排序结果
B:数组操作之获取最值
思路:
1) 定义变量,记录每次比较后较大的值.
2) 遍历数组,拿到每个元素,与变量记录的值进行比较,如果发现遍历到的值更大,就把这个值赋给变量.
3) 遍历结束,变量就是记录的最大值.
补充:
1) 数组长度可以为0.
例如:int[] arr = new int[0]; //这样定义是可以的.
2) 数组是引用数据类型,所以其默认值是null.
由此引出,上述查找最值的方法其实是存在问题的.(程序的健壮性)
1) 如果传递一个长度为0的数组进去,会在拿第一个值时,出现索引越界.
2)int[] arr = null; 将此数组传递进去,会出现空指针异常.
此问题将来学习了异常处理机制可以解决.
目前,如果想避免,请保证传递非空数组的参数.
或者换一种思考问题的方式:我不找数组的最值了, 我找数组最值的索引. 能找到索引了, 最值不就也找到了吗.
那么此时对传递的非法参数,就可以返回-1来处理了.
函数如下:
对于此函数的调用,就可以对结果进行判断,而且方法不再报出异常.
7、数组操作的常见问题:
A:数组越界异常。你访问了不存在的索引。
ArrayIndexOutOfBoundsException
B:空指针异常。一个实例(对象)已经不存在了,你还去访问它的内容。
NullPointerException