• JavaSE---方法的使用


    目录

    1、方法概念及使用

    1.1 概念

    1.2 方法的定义

    1.3 方法调用的执行过程

    1.4 实参和形参的关系

    1.5 没有返回值的方法

    2、方法重载

    2.1 方法重载概念

    2.2 方法签名

    3、递归

    递归求 N 的阶乘

    按照顺序打印数字的每一位

    递归求一个整数各位数字之和

    斐波那契数列


    1、方法概念及使用

    1.1 概念

    方法就是一个代码片段 . 类似于 C 语言中的 " 函数 " 。方法存在的意义 :
            1. 是能够模块化的组织代码 ( 当代码规模比较复杂的时候 ).
            2. 做到代码被重复使用 , 一份代码可以在多个位置使用 .
            3. 让代码更好理解更简单 .
            4. 直接调用现有方法开发 , 不必重复造轮子 .

    1.2 方法的定义

            语法格式
    修饰符 返回值类型 方法名称 ([ 参数类型 形参 ...])
    {
            方法体代码 ;
            [ return 返回值 ];
    }
            实现一个函数,检测一个年份是否为闰年
    1. public class Method
    2. {
    3. // 方法定义
    4. public static boolean isLeapYear(int year)
    5. {
    6. if((0 == year % 4 && 0 != year % 100) || 0 == year % 400)
    7. {
    8. return true;
    9. }
    10. else
    11. {
    12. return false;
    13. }
    14. }
    15. }
          
    注意事项
            1. 修饰符:现阶段直接使用 public static 固定搭配
            2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
            3. 方法名字:采用小驼峰命名
            4. 参数列表:如果方法没有参数, () 中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
            5. 方法体:方法内部要执行的语句
            6. 在 java 当中,方法必须写在类当中
            7. 在 java 当中,方法不能嵌套定义
            8. 在 java 当中,没有方法声明一说

    1.3 方法调用的执行过程

    方法调用过程
            调用方法--- > 传递参数 --- > 找到方法地址 --- > 执行被调方法的方法体 --- > 被调方法结束返回 --- > 回到主调方法继续往下 执行

    注意事项】定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行。一个方法可以被多次调用.

            计算两个整数相加
    1. public class Method
    2. {
    3. public static void main(String[] args)
    4. {
    5. int a = 10; int b = 20;
    6. System.out.println("第一次调用方法之前");
    7. int ret = add(a, b);
    8. System.out.println("第一次调用方法之后");
    9. System.out.println("ret = " + ret);
    10. System.out.println("第二次调用方法之前");
    11. ret = add(30, 50);
    12. System.out.println("第二次调用方法之后");
    13. System.out.println("ret = " + ret);
    14. }
    15. public static int add(int x, int y)
    16. {
    17. System.out.println("调用方法中 x = " + x + " y = " + y);
    18. return x + y;
    19. }
    20. }
    // 执行结果
    一次调用方法之前
    调用方法中 x = 10 y = 20
    第一次调用方法之后
    ret = 30
    第二次调用方法之前
    调用方法中 x = 30 y = 50
    第二次调用方法之后
    ret = 80
            计算 1! + 2! + 3! + 4! + 5!
    1. public class TestMethod
    2. {
    3. public static void main(String[] args)
    4. {
    5. int sum = 0;
    6. for (int i = 1; i <= 5; i++)
    7. {
    8. sum += fac(i);
    9. }
    10. System.out.println("sum = " + sum);
    11. }
    12. public static int fac(int n)
    13. {
    14. System.out.println("计算 n 的阶乘中n! = " + n);
    15. int result = 1;
    16. for (int i = 1; i <= n; i++)
    17. {
    18. result *= i;
    19. }
    20. return result;
    21. }
    22. }
    // 执行结果
    计算 n 的阶乘中 n ! = 1
    计算 n 的阶乘中 n ! = 2
    计算 n 的阶乘中 n ! = 3
    计算 n 的阶乘中 n ! = 4
    计算 n 的阶乘中 n ! = 5
    sum = 153
            使用方法, 避免使用二重循环 , 让代码更简单清晰

    1.4 实参和形参的关系

    1. public static int getSum(int N)
    2. {
    3. // N是形参
    4. return (1+N)*N / 2;
    5. }
    6. getSum(10); // 10是实参,在方法调用时,形参N用来保存10
    1. public static int add(int a, int b)
    2. {
    3. return a + b;
    4. }
    5. add(2, 3); // 2和3是实参,在调用时传给形参a和b

             注意:Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

            交换两个整型变量
    1. public class TestMethod
    2. {
    3. public static void main(String[] args)
    4. {
    5. int a = 10; int b = 20; swap(a, b);
    6. System.out.println("main: a = " + a + " b = " + b);
    7. }
    8. public static void swap(int x, int y)
    9. {
    10. int tmp = x;
    11. x = y;
    12. y = tmp;
    13. System.out.println("swap: x = " + x + " y = " + y);
    14. }
    15. }
    // 运行结果
    swap : x = 20 y = 10
    main : a = 10 b = 20
            可以看到,在swap 函数交换之后,形参 x y 的值发生了改变,但是 main 方法中 a b 还是交换之前的值,即没有交换成功。
    原因分析
            实参a b main 方法中的两个变量,其空间在 main 方法的栈 ( 一块特殊的内存空间 ) 中,而形参 x y swap 方法中的两个变量,x y 的空间在 swap 方法运行时的栈中,因此:实参 a b 与 形参 x y 是两个没有任何关联性的变量, swap 方法调用时,只是将实参 a b 中的值拷贝了一份传递给了形参 x y ,因此对形参 x y 操作不会对实参 a b产生任何影响。

          注意:对于基础类型来说, 形参相当于实参的拷贝. 传值调用

    解决办法 : 传引用类型参数 ( 例如数组来解决这个问题 )
    1. public class TestMethod
    2. {
    3. public static void main(String[] args)
    4. {
    5. int[] arr = {10, 20};
    6. swap(arr);
    7. System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
    8. }
    9. public static void swap(int[] arr)
    10. {
    11. int tmp = arr[0];
    12. arr[0] = arr[1];
    13. arr[1] = tmp;
    14. }
    15. }
    // 运行结果
    arr [ 0 ] = 20
    arr [ 1 ] = 10

    1.5 没有返回值的方法

            方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成 void
    1. class Test
    2. {
    3. public static void main(String[] args)
    4. {
    5. int a = 10;
    6. int b = 20;
    7. print(a, b);
    8. }
    9. public static void print(int x, int y)
    10. {
    11. System.out.println("x = " + x + " y = " + y);
    12. }
    13. }

    2、方法重载

    2.1 方法重载概念

            在Java 中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
    1. public class TestMethod
    2. {
    3. public static void main(String[] args)
    4. {
    5. add(1, 2); // 调用add(int, int)
    6. add(1.5, 2.5); // 调用add(double, double)
    7. add(1.5, 2.5, 3.5); // 调用add(double, double, double)
    8. }
    9. public static int add(int x, int y)
    10. {
    11. return x + y;
    12. }
    13. public static double add(double x, double y)
    14. {
    15. return x + y;
    16. }
    17. public static double add(double x, double y, double z)
    18. {
    19. return x + y + z;
    20. }
    21. }
    注意:
            1. 方法名必须相同
            2. 参数列表必须不同 ( 参数的个数不同、参数的类型不同、类型的次序必须不同 )
            3. 与返回值类型是否相同无关
    1. // 注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
    2. public class TestMethod
    3. {
    4. public static void main(String[] args)
    5. {
    6. int a = 10;
    7. int b = 20;
    8. int ret = add(a, b);
    9. System.out.println("ret = " + ret);
    10. }
    11. public static int add(int x, int y)
    12. {
    13. return x + y;
    14. }
    15. public static double add(int x, int y)
    16. {
    17. return x + y;
    18. }
    19. }
    // 编译出错
    Test . java : 13 : 错误 : 已在类 Test 中定义了方法 add ( int , int )
    public static double add ( int x , int y ) {
                     ^
    1 个错误
            4. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

    2.2 方法签名

            在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就 可以定义方法名相同的方法呢?
            方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名 + 参数列表 + 返回值类型,构成 方法完整的名字。
    1. public class TestMethod
    2. {
    3. public static int add(int x, int y)
    4. {
    5. return x + y;
    6. }
    7. public static double add(double x, double y)
    8. {
    9. return x + y;
    10. }
    11. public static void main(String[] args)
    12. {
    13. add(1,2);
    14. add(1.5, 2.5);
    15. }
    16. }
    上述代码经过编译之后,然后使用 JDK 自带的 javap 反汇编工具查看,具体操作:
            1. 先对工程进行编译生成 .class 字节码文件
            2. 在控制台中进入到要查看的 .class 所在的目录
            3. 输入: javap -v 字节码文件名字即可

             方法签名中的一些特殊符号说明:

     3、递归

     递归求 N 的阶乘

    1. public static void main(String[] args)
    2. {
    3. int n = 5;
    4. int ret = factor(n);
    5. System.out.println("ret = " + ret);
    6. }
    7. public static int factor(int n)
    8. {
    9. if (n == 1)
    10. {
    11. return 1;
    12. }
    13. return n * factor(n - 1); // factor 调用函数自身
    14. }
    15. // 执行结果 ret = 120

     按照顺序打印数字的每一位

    1. public static void print(int n) {
    2. if(n < 10) {
    3. System.out.println(n);
    4. }else {
    5. print(n/10);
    6. System.out.println(n%10);
    7. }
    8. }

     递归求一个整数各位数字之和

    1. public static int sumEvery(int n) {
    2. if(n < 10) {
    3. return n;
    4. }
    5. int tmp = n%10+sumEvery(n/10);
    6. return tmp;
    7. }

    斐波那契数列

    1. public class Test {
    2. public static int count = 0;
    3. public static int fib(int n) {
    4. if(n == 1 || n == 2) {
    5. return 1;
    6. }
    7. if(n == 3) {
    8. count++;
    9. }
    10. int tmp = fib(n-1)+fib(n-2);
    11. return tmp;
    12. }
    13. public static int fib2(int n) {
    14. if(n <= 0) {
    15. return -1;
    16. }
    17. if(n == 1 || n == 2) {
    18. return 1;
    19. }
    20. int f1 = 1;
    21. int f2 = 1;
    22. int f3 = -1;
    23. for (int i = 3; i <= n; i++) {
    24. f3 = f1+f2;
    25. f1 = f2;
    26. f2 = f3;
    27. }
    28. return f3;
    29. }
    30. public static void main(String[] args) {
    31. int ret = fib(41);
    32. System.out.println(ret+" 次数:"+Test.count);
    33. }
    34. }

  • 相关阅读:
    某马机房预约系统 C++项目(一)
    家居行业如何借助AI营销数智化转型?《2023 家居行业AI营销第一课(重庆站)》给你答案
    【学习总结】辐射、辐照等常见光学物理量的定义与关系
    商业智能对企业来说意味着什么
    gitee使用教程
    报错的解决 sqlite3.OperationalError: unrecognized token: “630008.OF“
    前端 表单标签(二)
    带你熟悉NLP预训练模型:BERT
    2021年PHP-Laravel面试题问卷题 答案记录
    ASR语音识别纠错-fast correct
  • 原文地址:https://blog.csdn.net/weixin_51912875/article/details/125709569