• 【Java SE】方法的使用


    1.方法概念及使用

    1.1方法(method)

    方法就是一个代码片段. 类似于 C 语言中的 “函数”。

    1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
    2. 做到代码被重复使用, 一份代码可以在多个位置使用.
    3. 让代码更好理解更简单.
    4. 直接调用现有方法开发, 不必重复造轮子.

    1.2方法的定义

    // 方法定义
    修饰符 返回值类型 方法名称([参数类型 形参 ...]){
    方法体代码;
    [return 返回值];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意事项

    1. 修饰符:现阶段直接使用public static 固定搭配
    2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
    3. 方法名字:采用小驼峰命名
    4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
    5. 方法体:方法内部要执行的语句
    6. 在java当中,方法必须写在类当中
    7. 在java当中,方法不能嵌套定义
    8. 在java当中,没有方法声明一说

    1.3方法调用的执行过程

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

    例1:: 计算 1! + 2! + 3! + 4! + 5!
    在这里插入图片描述

    1.4 ⭐实参和形参的关系

    实参的值永远都是拷贝到形参中,形参和实参本质是两个实体,故改变形参实参不会随之改变。那么就有同学会问,Java没有C语言中的地址,那么它是如何改变的呢?这就要说到另一个知识点“引用”了,具体我们以后再学。
    对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用

    1.5没有返回值的方法

    方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成void

    2.方法重载

    2.1 方法重载概念

    在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
    注意:

    1. 方法名必须相同
    2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
    3. 与返回值类型是否相同无关

    2.2方法签名

    方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

    3.递归

    一个方法在执行过程中调用自身, 就称为 “递归”.
    递归的必要条件:

    1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
    2. 递归出口
      递归重要的是结束条件和递归表达式!
      例1:求1234各项之和
      在这里插入图片描述
      例2:打印1234 各项
      在这里插入图片描述
      例3:求斐波那契数列的第n项
      方法一:迭代实现
      在这里插入图片描述
      方法2:递归实现
      在这里插入图片描述
      在这里插入图片描述
      但是循环的效率远大于递归!

    递归经典:汉诺塔

    在这里插入图片描述

    汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。【百度百科】
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    由以上可得每移动n个需要(2^n)-1步骤。

    我们可以发现,要想移动所有的盘子,可以逆着思路推理。终止条件是将最底下一个盘子从起始位置移动到目标位置。而上面n-1个盘子是可以借助目标位置先放在中转位置上面。再将最下面一个盘子放在目标位置上,然后将n-1个盘子借助起始位置放在目标位置上。如此递归下去…

    于是我们可以写出以下代码:
    在这里插入图片描述
    运行一下:(3的情况)
    在这里插入图片描述
    可以对比我们刚才推理的结果,答案是一样的。

    /**
         * pos1 起始位置
         * pos2 中转位置
         * pos3 目标位置
         */
        public static void hanio(int n,char pos1,char pos2,char pos3){
        if (n == 1){
            move(pos1,pos3);//最后一步都是把最底下的盘子从起始位置(pos1)转移到目标位置(pos3)
            return;
        }
        hanio(n-1,pos1,pos3,pos2);//将n-1个盘子从起始位置(pos1)借助中转位置(pos3)移动到目标位置(pos2)
        move(pos1,pos3);//把最底下的盘子从起始位置移到目标位置
        hanio(n-1,pos2,pos1,pos3);//将n-1个盘子从起始位置(pos2)借助中转位置(pos1)移动到目标位置(pos3)
        }
    
        /**
         *
         * @param pos1 起始位置
         * @param pos2 目标位置
         */
        public static void move(char pos1,char pos2){
            System.out.print(pos1+"->"+pos2+" ");//模拟鼠标实现
        }
    
        public static void main(String[] args) {
            hanio(3,'A','B','C');
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    [工具]工控机磁盘容量监控通知工具
    ​​【项目实战】犬只牵绳智能识别:源码详细解读与部署步骤
    Ubuntu上运行ProbLog程序的基本方法
    经济型EtherCAT运动控制器(七):运动缓冲
    [蓝桥杯2015决赛]穿越雷区 (BFS)
    《数据分析与处理》第二周实验
    为什么要做媒体发稿?企业为什么都注重媒体推广?
    Python爬虫基础之Selenium详解
    Win11升级包下载后如何删除
    华为eNSP配置专题-策略路由的配置
  • 原文地址:https://blog.csdn.net/qq_61138087/article/details/126110491