方法的概念及使用
方法(method)?
方法就是一个代码片段. 类似于 C 语言中的 "函数"。(c++的方法)
方法的定义
//方法的定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
示例:判定闰年
public class Method{
//方法定义
public static boolean isLeapYear(int year){
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
return true;
}else{
return false;
}
}
}
【注意事项】
1. 修饰符:现阶段直接使用public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. 在java当中,方法必须写在类当中
7. 在java当中,方法不能嵌套定义
8. 在java当中,没有方法声明一说
方法调用的执行过程
调用方法 -> 传递参数 -> 找到方法地址 -> 执行被调用的方法体 -> 被调用方法结束返回 -> 回到主调方法继续往下执行
【注意实项】
1.定义方法的时候,不会执行方法的而代码。只有调用的时候才会执行
2.一个方法可以被多次调用
实参和形参的关系
概念:同C语言
形参:传值调用(不修改传入参数)两个实体
实参:传引用类型参数(修改传入参数)
方法重载
条件
1.方法名称相同
2.参数列表不同(参数类型,参数个数,次序不同)
3.返回值不同不影响
4.编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
//注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
public class Method{
public static void main(String []args){
int a=20;
int b=10;
int ret=add(a,b);
System.out.println("ret = "+ ret);
}
public static int add(int a,int b){
return a+b;
}
public static double add(double a,double b){
return a+b;
}
//编译出错
Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)
public static double add(int x, int y) {
^
1 个错误
}
方法签名(了解,帮助理解重载)
在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可 以定义方法名相同的方法呢?
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
public class TestMethod{
public static int add(int x,int y){
return x+y;
}
public static double add(double x,double y){
return x+y;
}
public static void main(String []args){
add(1,2);
add(1.2,3.3);
}
}
上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:
1. 先对工程进行编译生成.class字节码文件
2. 在控制台中进入到要查看的.class所在的目录
3. 输入:javap -v 字节码文件名字即可
方法签名中的一些特殊符号说明:
特殊字符 | 数据类型 |
V | void |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
[ | 数组(以[开头,配合其他的特殊字符,表述对应数据类型的数组,几个[表述几维数组) |
L | 引用类型,以L开头,以;结尾,中间是引用类型的全类名 |
递归与迭代
同C语言相同
示例1:汉诺塔问题
目的:使用递归打印1个n层的汉诺塔从A柱到C柱的所有步骤
原理:封装1个函数Hanio(num, ‘A’, ‘B’, ‘C’)。
其中num是塔数;A、B、C,3个字符为抽象成的3个柱子。
如果只有1层那么输出A;
否则就有2种情况,其1是将n-1个碟子从A经C到B。其2是将n-1个碟子从B经A到C
塔数 | 步骤 |
1 | A->C |
2 | A->B、A->C、B->C |
3 | A->C、A->B、C->B、A->C、B->A、B->C、A->C |
4 | A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->B,A->C,B->C |
偶 | A->B |
奇 | A->C |
//汉诺塔问题--2^n-1(移动次数)
//将n-1个盘子经过C挪到B
//将第n个盘子挪到C
//将n-1个盘子经过A挪到C
public static void hanio(int n,char A,char B,char C){
if (1 == n)
System.out.println(A+"->"+C);
else
{
hanio(n-1, A, C, B);
System.out.println(A+"->"+C);
hanio(n-1, B, A, C);
}
}
示例2:青蛙跳台阶
一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶
,例如:跳上第一级台阶只有一种跳法:直接跳 1 级即可。跳上两级台阶,有两种跳法: 每次跳 1 级,跳两次; 或者一次跳 2 级.
问要跳上第 n 级台阶有多少种跳法?
首先跳到 n 级台阶可以分解为两种情况:
1.之前跳到 n-1 级台阶,然后再跳 1 级到达 n 级;2.之前跳到 n-2 级台阶,然后再跳 2 级到达 n 级;
因此 n 级跳法数量,等于这两种情况之和。
即 F(n) = F(n-1) + F(n-2)
同理可继续推导:
F(n-1) = F(n-2) + F(n-3)
F(n-2) = F(n-3) + F(n-4)
...
F(2) = F(1) + F(0)
F(1) = 1
F(0) = 1
可见这是斐波那契数列,数列中从第三个数开始,每个数都是前两个数之和。那么只需从 F(0) + F(1) = F(2) 开始计算,一直加到 F(n) 即可得出结果。
变态跳台阶同理
public static int frogJump(int n){
if(n==1)
return 1;
if(n==2)
return 2;
return frogJump(n-1)+frogJump(n-2);
}
最难不过坚持!