函数
1 函数的引入
程序中,相同的功能重复书写,会造成代码冗余和复用性差;开发和维护也很困难。
所以,要把相同的代码抽取出来,放到一个地方。需要使用的时候再去调用,仅传递不同的参数。
1.2 概念和作用
Java中的函数,也叫方法。是一段独立的代码块,直接写在类的,里面的代码实现独立的功能。
作用是解决代码的复用性差的问题。
函数应该一个函数就一个功能,main函数只写功能的调用。
1.3 格式
public static void main(String[] args) {
功能代码;
return 返回的数据;
}
修饰符:
public,private,protect,(空)
static
返回值类型:
void,表示函数不需要返回结果时的函数的返回值类型
。。。
方法名:(自定义)
参数列表:
代码范围:{}
所有函数都是通过return结束运行的。如果函数返回值类型是void,return可省略,但是编译器会帮我们加上。
2 函数使用
2.1 函数的声明
声明一个函数,需要先明确两个东西:
函数的返回值类型;
函数的参数列表
2.2 函数执行内存
- 启动java虚拟机,加载xx.class到内存中,然后开始执行main方法
- 函数进入栈内存,叫做压栈(入栈)
- 函数离开栈内存,叫做弹栈(出栈)
- 正在执行的函数永远是栈顶的函数
- 栈内存中的函数有个特点,先进后出
- 所以,如果main函数调用另一函数x,则x进到栈顶,等执行完后出栈,main再回到栈顶
- main函数出栈,整个程序结束
具体可参考:https://blog.youkuaiyun.com/weixin_38233274/article/details/80332407
2.3 函数的重载(over lord)
概念:在同一个类中,可以定义多个名称相同、参数列表不同的函数。
参数列表不同可以是:参数的个数不同或者参数的类型不同。如果仅顺序不同不算。
强调:函数的重载,只和函数名以及参数列表有关系,和函数的返回值类型无关。
调用函数时,通过函数名和参数列表共同确定一个函数
好处:类似的功能写成重载,需要记忆的函数名大大降低,提高开发效率。
3 数组
3.1 概念和格式
数组,是容器,只能存放相同类型的数据。
数组有容量大小,使用length属性可以获取。
数组创建后容量大小固定不变。
格式
1、数据类型 [ ] 数组名 = new 数据类型 [ 容量 ];
2、数据类型 [ ] 数组名 = new 数据类型 [ ] {1,2,3};
3.2 数组的索引
数组中存放的数据,就是数组的元素。
每个元素有一个序号(索引、下标、角标),从0开始连续递增,最大值是数组容量减一。数组元素的存取都是通过索引完成。
3.3 数组的内存-引用传递
public class demo3 {
public static void main(String[] args) {
//JVM执行时。遇到new关键字,就会去堆内存开辟空间
int [] arr1 = new int [3];
int [] arr2 = arr1;
//变量arr1中保存的是内存地址,又叫做堆空间中实体的引用
System.out.println(arr1);//[I@1db9742
//可以看到arr1和arr2保存的地址相同,所以两个数组会指向同一个地址
System.out.println(arr2);//[I@1db9742
arr1[1] = 2;
arr2[1] = 0;
//当arr2的值发生改变,arr1也跟着变化
System.out.println(arr1[1]);//0
}
}
//当堆内存中的实体不被任何变量引用时,就会变成垃圾空间,等待java的垃圾回收机制回收,然后释放空间
引用类型的变量进行传参,实际上传递的是保存在变量中指向堆中空间的地址,这种传参情况叫做引用传递;
如果一个引用改变了空间中的值,对所有指向这个空间的引用都有影响;
基本类型的变量进行传参,实际传递的是保存在变量中的常量值,是值传递。
详细可参考:https://blog.youkuaiyun.com/u013309870/article/details/75499175
4 数组应用
4.1 求最大值
public static int max(int []arr){
int max = arr[0];
for(int i = 1;i < arr.length;i++){
if(max < arr[i]){
max = arr[i];
}
}
return max;
}
4.2 排序
public static void sort(int [] x)
//封装函数,给定参数(自变量):将主函数的arr数组赋值给x。此处x仅在本函数内使用
//冒泡算法排序
{
int a=x.length-1;//确定比较轮数
for (int i=0;i<a ;i++ )//内循环继续循环,以保证从小到大。这样冒泡效率不高
{
for (int j=0;j<a ;j++ )
//条件如果改成(int j=0;j<a-i ;j++ ),可以减少无用功。
//和选择排序基本一致,不同在于选择先确定最小,从左向右,而这样恰恰相反
{
if (x[j]>x[j+1])//遍历元素和右边的比较大小,如果大则冒泡向右
{
int temp=x[j+1];
x[j+1]=x[j];
x[j]=temp;
}
}
}
}
4.3 平均值
int [][] arr = {{2,4},{7,2,3},{5,8,2,1}};
double sum = 0;
int divisor = 0;
for(int [] a : arr)
{
for (int b : a)
{
sum = sum + b;
divisor++;
}
}
System.out.println(sum/divisor);