方法的有关知识(含递归)
方法使用
方法就是一个
代码片段
.
类似于
C
语言中的
"
函数
"
。
方法(代码片段)定义:
public class Method{
// 方法的定义
public static int add(int x, int y) {
return x + y;
}
}
修饰符(public static) 返回值类型 方法名称([参数类型 形参]){
方法体代码;
[return 返回值];
}
方法调用
需要开辟内存--方法调用结束 内存销毁
过程:调用方法--传递参数--找到方法地址--执行被调用方法的方法体--被调方法结束返回--回到主调方法继续往下执行
定义方法不执行方法代码只有调用才执行;一个方法可调用多次
方法传参
形参:函数中自变量,用来保存函数在调用传递的值
实参:拷贝到形参中,形参和实参本质是两个实体
方法重载
指方法名相同,但是参数列表不同(参数的个数、参数的类型、类型的次序),与返回值类型是否相同无关
在方法名相同的情况下,这三个只要有一个不同
,那么这个方法就会被重载;
两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的(编译出错)
方法签名
在同一个作用域中不能定义两个相同名称的标识符。(方法中不能定义两个名字一样的变量)
类中可以定义方法名相同的方法--方法签名即:经过编译器编译修改
过之后方法最终的名字
。
具体方式为:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
使用JDK自带的javap反汇编工具查看,具体操作如下:
- 先对工程进行编译生成.class字节码文件
- 在控制台中进入到要查看的.class所在的目录
- 输入:javap -v 字节码文件名字即可
方法签名中的一些特殊符号说明:
[--引用类型,以L开头,以;结尾,中间是引用类型的全类名
递归
定义
一个方法在执行过程中
调用自身
,
就称为
"
递归
".
递归相当于数学上的
"
数学归纳法
",
有一个起始条件
,
然后有一个递推公式
必要条件
1.
将原问题划分成其子问题,注意:子问题必须要与原问题的
解法相同
2.
递归出口
调用栈
方法调用的时候, 会有一个 "栈" 这样的内存空间
描述当前的调用关系
. 称为调用栈.
每一次的方法调用就称为一个 "
栈帧
", 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息
运用递归求斐波那契数
public class test {
public static void main(String[] args) {
System.out.println(fib2(3));
System.out.println(fib2(6));
}
public static int fib2(int n){
if(n==1||n==2){
return 1;
}
int f1=1;
int f2=1;
int f3=1;
for(int i=3;i<=n;i++){
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
可以使用循环来减少递归中的数据冗余
public static int fib(int n) {
int last2 = 1;
int last1 = 1;
int cur = 0;
for (int i = 3; i <= n; i++) {
cur = last1 + last2;
last2 = last1;
last1 = cur;
}
return cur;