1.什么是函数?
函数是定义在类中的一段独立的代码块,用来实现某个功能。Java中,函数又被称为方法。
- 函数的主要作用是提高代码的复用性。
- 函数都是在栈内存中运行。
修饰符 返回值类型 函数名(){
函数体;
}
- 修饰符:可以是访问修饰符,也可以说是函数修饰符(abstract、final、static、synchronized),还可以是两者的组合。
- 返回值类型:用于限定函数返回值的数据类型。
2.函数的调用
- 调用静态方法
public class hjl{
public static void main(String[] args){
doing();
}
public static void doing(){
System.out.println("hello word");
}
}
- 调用非静态方法
public class hjl{
public static void main(String[] args){
hjl d = new hjl();
d.doing();
}
public void doing(){
System.out.println("hello word");
}
}
3.函数的分类
- 有参有返回值
public int doing(int age){
return 1;
}
- 无参有返回值
public int doing(){
return 1;
}
- 有参无返回值
public void doing(int age){
}
- 无参无返回值
public void doing(){
}
4. 变量
局部变量:就是在成员方法里面定义的变量我们称之为局部变量
成员变量:定义在类的内部,方法的外部,在其所在类内的所有方法均可调用。
注:java没有全局变量,只有成员变量。
5.函数在内存中的调用本质
在java中,方法以及局部变量(即在方法中声明的变量)是放在堆上的。当你调用一个方法时,该方法会放在调用栈的栈顶。栈顶的方法是目前正在执行的方法,直到执行完毕才会从栈顶释放。
6.函数的重载
在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可,调用的时候,自动匹配对应的函数。
例子:
public class hjl {
public static int add(int a, int b) {
return a+b;
}
//通过调用另一个重载函数实现重载
public static int add(int a, int b, int c) {
return a+b++c;
}
public static void main(String[] args) {
System.out.println(add(1,2));
System.out.println(add(2,3,4));
}
}
输出结果:
3
9
思考:函数重载所有编程语言都有的吗?
函数重载现象是强数据类型语言(java、C、C++、C#)所特有的现象;弱数据类型语言(javascript、python、ruby)是不具备函数重载。
7.函数的递归
函数的递归:函数自身调用自身
斐波那契数列:1 2 3 5 8 13 21 34 55 89 …
代码实现:
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=sc.nextInt();
System.out.println(doing(num));
}
public static int doing(int q){
if(q==1 || q==2){
return q;
}
return doing(q-1)+doing(q-2);
}
输出结果:
请输入一个数字:6
13
递归时的内存模型:
优点:分治理念的体现,可以把非常复杂的问题,简单解决
缺点:非常耗费内存,所以说,当栈被全部占用后,触发StackOverflowError异常!!!
注意,可以使用java -X -Xss 大小, 来调整JVM的栈大小空间
-Xms<大小> 设置初始 Java 堆大小
-Xmx<大小> 设置最大 Java 堆大小