一.认知
我们将一段表示某一功能的代码封装起来就是函数。
该函数就实现了某一个功能。
功能,本身就是抽象的,不是具体的。
类似a+b我们将此包装起来定义为function(a b)
我们如果想得到两个数之和可以由此带入
function(1 1) = 2
函数定义语法规则:
修饰符 返回类型 函数名(参数){ 函数体(实现函数的功能) }
int add(int x,int y) {
int jg = x+y;
return jg;
}
Int:返回类型,如果函数没有返回值,类型就是void。如果有返回类型,那么函数在任何情况下都要有返回值
Add: 函数名,函数名的命名规则与变量名相同;一般函数名要能表示函数的功能。
(int x,int y):参数,函数中的不确定值;要实现功能所依赖的数据;在写参数数要标明其数据类型。参数名可以任意。
{函数体}:实现函数功能的逻辑代码
Return关键字: 返回数据。 当函数执行时遇到return,函数运行结束,return后的代码不会被执行。
函数即使没有返回类型,即void,也可是使用return来结束函数的执行。
例:
写一个函数,判断某个数组中是否包含某个值
public static boolean contain(int[] a, int x){
for(int i=0;i<a.length;i++){
if(a[i]==x){
return true;
}
}
return false;
}
二.调用
函数调用表示要使用函数的功能,
此时就需要指定参数的值(如果函数有参数)
根据函数的修饰符不同,有不同的调用方式
- public static 公有的静态函数
类名.函数名(参数); (如果调用当前类的函数,可以不写类名)
- public 公有的函数(非静态)
创建对象,然后 对象.函数名(参数)
函数定义:
public static int add(int x,int y) {
int jg = x+y;
System.out.println(jg);
return jg;
}
函数调用:
只有调用函数,函数才会执行
Test1.add(2, 3); //Test1是类名
函数的调用过程分析:
在函数调用时,需要指定参数的值。我们指定参数的值为2,3。
@1 将2,3分别赋值给参数x,y (传参)
@2 执行函数体中的代码
概念:
- 形参与实参
这只是一种叫法: 1 在函数定义时,指明的参数叫做形参,比如,x,y是形参 (一种形式,不明确的值) 2
在函数调用时,指明的参数叫做实参,比如,2,3是实参 (实实在在,明确的值)
- 传参
在函数调用时,会自动将实参值赋值给形参值,这个动作,称为传参
例1:引用数据类型参数(数组)
//定义一个函数交换两个数组的第一个值
public static void swap(int[] a,int[] b){
int c = a[0];
a[0] = b[0];
b[0] = c;
}
函数调用:
int[] a = {1,1,1};
int[] b = {0,0,0};
Test3.swap(a, b);
System.out.println(a[0]);//0
System.out.println(b[0]);//1
结果可以交换值
例2:基础数据类型传参:
//定义一个函数,交换两个数
public static void swap2(int x,int y) {
int z = x;
x = y;
y =z;
}
函数调用:
int x = 2;
int y = 3;
swap2(x,y);
System.out.println(x);//2
System.out.println(y);//3
结果不能交换值
这里因为形参和实参不是同一个变量,只是在函数调用时,将实参值赋值给形参,它俩值相等而已。
当参数是数组时,形参和实参指向同一块内存空间,通过形参操作内存空间,对实参也会有影响。