Java 方法的使用

目录

1 方法格式

2 实参形参

3 方法重载

3.1 方法签名

4 练习

5 Java 递归


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);
        }
    }
}

运行结果 


  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值