目录
1 方法格式
方法就是一个代码片段,类似于 C 语言中的 "函数"
一份代码可以在多个位置使用,当代码规模比较复杂的时候能够模块化的组织代码
直接调用现有方法开发,不必重复造轮子
方法名里面可能有多个参数,每个参数要加类型
没有 else 将会报错,因为满足 if 有返回值,而不满足 if 没有,因此注意不要丢了 return
main 方法是无返回值的,因此不能有返回类型
Java 中的 main 方法是程序的入口,起到启动程序执行的作用,由于其特殊性,main 方法不能有返回值,这是 Java 语言的规定,遵循这一规定可以保证程序的正常执行
① 修饰符:现阶段直接使用 public static 固定搭配
② 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致
③ 如果没有返回值,必须写成 void
④ 方法名采用小驼峰
⑤ 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
⑥ 方法体:方法内部要执行的语句
⑦ 在 Java 当中,方法必须写在类中
⑧ 在 Java 当中,方法不能嵌套定义(方法当中不能定义方法)
⑨ 在 Java 当中,方法是全局的,不需要进行声明,方法调用名字和参数都匹配好就可以,包括参数顺序以及类型
接一下返回值( int ret = sum(x,y);)后才能进行打印
传参的过程
计算出结果30后方法就 sum 栈帧销毁了,这些都属于局部变量,在栈帧里面,会被回收,main 方法执行完毕也会回收了
总结:方法的调用是需要开辟内存的,方法调用结束这块内存就销毁了
方法调用举例
求 K 的阶层和(fac 变量名一般用于求阶层)
快捷键:调用方法后面直接 .sout 可快捷打印
2 实参形参
2和3是实参,在调用时传给形参 a 和 b
Java 没有指针,在 Java 当中无法拿到 a 和 b 的指针,无法拿到局部变量的地址
对于基础类型来说,形参相当于实参的拷贝,即传值调用,实参无法发生改变
解决方法:利用数组,将数组当中的0下标和1下标交换,但其本质 a 和 b 的值并未交换
该方法没有返回值因此写成 void
而真正要解决这个问题我们可以采用类和对象
3 方法重载
方法重载条件
有了方法重载后只需要写出方法就可以选择相应的
public class Test {
public static double add(double a,double b){
return a + b;
}
public static int add(int a,int b,int c){
return a + b + c;
}
public static int add(int a,int b){
return a + b;
}
public static void main(String[] args) {
int sum = add(10,11);
double sum1 = add(1.2,1.5);
int sum2 = add(10,15,20);
System.out.println(sum);
System.out.println(sum1);
System.out.println(sum2);
}
}
3.1 方法签名
在编译器当中如何区分方法?
编译器是将方法名和后面参数组合起来叫的
方法中不能定义两个名字一样的变量,但类中可以定义方法名相同的方法
方法签名即:经过编译器编译修改过之后方法最终的名字
具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字
上述代码经过编译之后,然后使用 JDK 自带的 javap 反汇编工具查看:
(反编译工具javap 后续了解)
先对工程进行编译生成 .class 字节码文件,在控制台中进入到要查看的 .class 所在的目录,在 cmd窗口输入:javap -v 字节码文件名字即可
方法签名中的一些特殊符号说明:
4 练习
1、创建方法求两个数的最大值 max2,随后再写一个求3个数的最大值的函数 max3
要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算
public class Test {
public static int max2(int a,int b){
return a > b ? a : b;
}
public static int max3(int a,int b,int c){
int max = max2(a,b);
return max > c ? max : c;
}
public static void main(String[] args) {
System.out.println(max3(7,24,8));
}
}
2、求斐波那契数列的第n项(迭代实现)
斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89……这个数列从第3项开始 ,每一项都等于前两项之和
public class Test {
public static int fab(int n){
if (n == 1 || n == 2){
return 1;
}else {
return fab(n-1) + fab(n-2);
}
}
public static void main(String[] args) {
System.out.println(fab(3));
}
}
3、在同一个类中定义多个方法:要求不仅可以求2个整数最大值,还可以求3个小数最大值
借助 Java 原生类 Math 当中的 max 方法求最大值
public class Test {
public static int max(int a,int b){
return Math.max(a,b);
}
public static double max(double a,double b,double c){
double max = Math.max(a,b);
return Math.max(max,c);
}
public static void main(String[] args) {
System.out.println(max(1.3, 9.9, 9.6));
}
}
5 Java 递归
递归:自己调用自己且有结束条件(即起始条件)
修改后:(加入终止条件)
递归就是一个递和一个归的过程
1、按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
解析(红色是递的过程,蓝色是归的过程)
当完成函数调用后归时到函数调用的下一步,如果得到值则带人函数
2、递归求 N 的阶乘
解析
3、递归求 1 + 2 + 3 + ... + 10
1到10的和为 sum(10)
1到9的和为 sun(9)
1到10的和为10+ sum(9)
即1到 n 的和为 n + sum(n-1)
解析(红色递,蓝色归)
4、写一个递归方法,输入一个非负整数,返回组成它的数字之和,例如,输入1729,则应该返回19(1+7+2+9)
1729 = 1 + 729的每一位
5、求斐波那契数列的第 N 项
斐波那契数列介绍: 斐波那契数列 - 搜狗百科
递归看起来代码少,但它性能并不一定非常好
对于斐波那契数列来说有重复运算
使用循环的方式来求斐波那契数列问题,避免出现冗余运算
建议:写代码尽量写成函数(方法)形式
补充:idea 中输入一个 s 后回车 也可以快捷打印,打印数组则 Arrays.
6 、Java 递归求解汉诺塔
汉诺塔专门的讲解视频:C语言实现汉诺塔_哔哩哔哩_bilibili
运行代码
public class Test {
public static void main(String[] args) {
hanoi(3,'A','B','C');
}
public static void move(char pos1,char pos2){
//表示一个盘子从一个位置移动到另一个位置
System.out.print(pos1 + "->" + pos2 + " ");
}
//n是盘子数,第一个盘子pos1是起始地,第二个盘子pos2是中转地,第三个盘子pos3是目的地
public static void hanoi(int n,char pos1,char pos2,char pos3){
if (n == 1){
//只有一个盘子直接放入目的地
move(pos1,pos3);
}else {
//把起始地pos1上面n-1个盘子通过pos3中转放到pos2
hanoi(n-1,pos1,pos3,pos2);
//把起始地最后一个盘子放入目的地
move(pos1,pos3);
//此时将pos2上面一共有n-1个盘子通过pos1中转放到pos3完成任务
hanoi(n-1,pos2,pos1,pos3);
}
}
}
运行结果