夹哇基础知识总结part4(方法的使用)

Java当中方法的使用

一、方法是什么?

1、java方法 对应 c语言的函数。
2、方法就是一个代码片段,可以看做是一个功能。
3、能够模块化的组织代码。让代码能够被重复使用,简化开发。
4、main()也是一个方法

二、方法的书写规范

   public static 返回值(int char void等) 方法名称 (形式参数列表){
            方法体;
    }
其中:
  方法名:采用“小驼峰”形式
  加public static的原因:因为当前所有的方法写完后,会在main方法中调用,因为main方法是public static的
   返回值:可有可无,看具体业务需求。;如果有返回值 那么返回值的类型需要和方法的返回值类型匹配
  形式参数列表:形参->>实参的一份拷贝。
  方法体{}:具体方法的实现。
  return : 代表着方法(函数)的结束,一旦return,下面的代码都不执行了。

下面使用几个方法来具体介绍一下方法的含义以及定义方法:

public class Method01 {
    //方法:求两个数的最大值
    public static int maxNum(int num1, int num2) {
        return num1 > num2 ? num1 : num2;
    }
    //方法:求三个数的最大值
    public static int maxThreeNum(int num1, int num2, int num3) {
        return maxNum(maxNum(num1, num2), num3);          //函数的重复调用,在一个函数里可以调用另一个函数。
    }
    //方法:实现两个整数相加
    public static int numAdd(int num1,int num2){
        return num1+num2;
    }
    //方法:计算n的阶乘和(可优化)
    public static int factor(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {            //产生1-n
         //**************************************
         //  int ret = 1;                         //
         //  for (int j = 1; j <= i; j++) {       //这部分的功能是求一个数字的阶乘,
         //       ret *= j;                       //所以可以单独封装成一个方法。
         //  }                                    //
         //**************************************
            sum +=fac(i);
        }
        return sum;
    }
    //方法5的延伸:求一个数字的阶乘
    public  static int fac(int num){
        int ret = 1;
        for (int i = 1; i <= num; i++) {
            ret *= i;
        }
        return ret;
    }
//main方法在这!!!!
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n1 = sc.nextInt();                         //n1,n2,n3在方法内,称之为局部变量,在内存中存在栈上,
        int n2 = sc.nextInt();
        int n3 = sc.nextInt();
        System.out.println(maxNum(n1, n2));
        System.out.println(maxThreeNum(n1, n2, n3));   //如果函数有返回值就可以直接写在sout里
        System.out.println(numAdd(n1, n2));
        System.out.println(factor(5));
    }
}

三、实参与形参的关系

Java中方法的传参方式是“按值传递”的

	//方法1:交换两个数的值,
    public static void swap(int x, int y ){
        int tmp = x;
        x = y;
        y = tmp;
    }
       /**
    *@Describle: 方法中实参和形参的关系
    *@Author: Pryor_Pan
    *@Date: 2021/03/31
   */
    public static void main1(String[] args) {
        int a = 10;
        int b = 20;
        //这是在main中普通的交换a和b的值
//        int tmp = a;
//        a = b;
//        b = tmp;
        //***************
        swap(a,b);                      //这一步只交换了方法中形参的值,实参的值并没有发生改变。此处要想使用该方法交换两个数的值,需要用到类和对象,或者数组。
        System.out.println(a+" " + b);  //output: 10  20
    }

在这里插入图片描述

  上面我们可以看到,我们定义了一个用于交换两个整数的值的方法,调用了该方法以后a和b的值并没有发生改变,这是为什么呢?
  由于Java按值传递的特性,在调用方法的时候,传到方法中的值叫做形参,方法只是对形参的值作了交换,而实际上实参的值并没有发生改变,所以这礼物我们看到a的值还是10,b的值还是20.

四、方法的重载

在数据类型的学习中,我们知道,Java中变量名是不能重复的,比如:
我一开始定义了一个int型的变量a:
      int a = 10;
当我们再尝试定义另一个叫做a的变量时,系统会提示异常:
      double a = 9.9;
在这里插入图片描述

但是,对于方法来说,不存在这样的约束:

    //方法2:分别计算两(三)个整(浮点)数的和
    public static int sum(int a, int b){                        //方法名为sum,参数为 两个 int
        return a+b;
    }
    public static double sum(double a,double b){                //方法名为sum,参数为 两个 double
        return a+b;
    }
    public static double sum(double a,double b,double c){       //方法名为sum,参数为 三个 double
        return a+b+c;
    }
    
    public static void main1(String[] args) {
        int a = 10;
        int b = 20;
        double x = 5.5;
        double y = 4.5;
        double z = 2.0;
        System.out.println(sum(a, b));              //这三条语句虽然调用的方法名都是sum,
        System.out.println(sum(x, y));              //但是由于他们的形参参数类型(个数)不同
        System.out.println(sum(x, y, z));           //所以调用的时候并不会报错。
    }

  在定义方法时,我们可以同时定义多个方法,他们的方法名可以相同,但前提是,他们的返回类型、参数个数之中,必须至少有一个不同,满足了这个条件,我们就可以使用同一个方法名来给多个方法命名了。
这就是方法的重载!!

五、递归(我调我自己)

1、方法的递归:一个方法在执行的过程中调用自身,就称之为“递归” (我调我自己)
    他是一个把一个大问题化解小的问题,因为,大问题的处理方式
    和小问题的处理方式是一样的,比如:求n的阶乘,那么求4的阶乘和求3的
    阶乘的方法是一样的
 要满足的条件:
   1)、要调用自己本身
   2)、要有一个趋近于终止的条件
   3)、推导出递归的公式重要

经典的可用递归求解的问题

1、求一个数的阶乘(递归)
//方法1:求一个数的阶乘(递归)
    public static int fac(int n) {
        //如果没有这个终止条件,就会一直递归下去,最终就把栈挤爆了。一个栈一般就1M~2M大小。报错:StackOverflowError
        if (n == 1) {
            return 1;
        }
        return n * fac(n - 1);
    }
2、按顺序打印一个数字的每一位
//方法2:按顺序打印一个数字的每一位,
    public static void func1(int n) {
        //首先终止条件:如果是一个数字,那不用执行递归,直接输出。
        if (n > 9) {
            func1(n / 10);                  //当不是个位数的时候,除以10,尝试把它变成个位数,因为只有个位数才能被输出
        }
        System.out.print(n % 10 + " ");
    }
3、求1+2+3+4+…+n
//方法3:求1+2+3+4+.....+n
    public static int addNum(int n){
        if (n == 1){
           return 1;
        }
        return n+addNum(n-1);
    }
4、斐波那契数列
//方法5:用递归求斐波那契数列第n项,第n项等于前两项的和.
// 这是一个双路递归,了不得了,每次递归要找两个前置项,又要找前四项,又要找前八项,又要找前十六项,子子孙孙无穷尽也。
    public static int fabonaci1(int n){
        if (n == 1 || n == 2){
            return 1;
        }
        return fabonaci1(n-1)+fabonaci1(n-2);         //所以,一般不建议用递归实现斐波那契数列,,用迭代(循环)
    }

斐波那契数列也有非递归的写法:

//方法5.1:用循环求斐波那契数列第n项(非递归)
    public static int fabonaci2(int n){
        int f1 = 1;
        int f2 = 1;
        int f3 = 1;             //f3的初始值设为1的原因是因为当n等于1的时候直接是f3的初始值。
        for(int i = 3 ;i<=n ; i++){
            f3 = f1+f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值