• 【Java】方法的理解与使用


    活动地址:CSDN21天学习挑战赛
    在这里插入图片描述博客主页: XIN-XIANG荣
    系列专栏:【Java SE】
    一句短话: 难在坚持,贵在坚持,成在坚持!
    博客说明: 尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上的伙伴,文章中如果发现错误及不足之处,还望在评论区留言,我们一起交流进步!😊

    前言

    😽这篇博客介绍Java当中的方法,类似于C语言中的函数,与之区别的是多了方法重载的知识需要掌握!

    一. 方法的相关介绍

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

    1. 方法的定义

    方法语法格式

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

    示例:

    实现一个两个整数相加的方法

    public class Blog {
        // 方法的定义
        public static int add(int x, int y) {
            return x + y;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意事项:

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

    2. 方法调用的执行过程

    调用方法—**>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>**回到主调方法继续往下执行
    注意事项:

    • 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
    • 一个方法可以被多次调用

    代码示例: 计算 1! + 2! + 3! + 4! + 5!

    使用方法, 避免使用二重循环, 让代码更简单清晰

    public class Blog {
        public static void main(String[] args) {
            int sum = 0;
            for (int i = 1; i <= 5; i++) {
                sum += fac(i);
            } 
            System.out.println("sum = " + sum);
        }
        
        // 方法的定义
        public static int fac(int n) {
            int result = 1;
            for (int i = 1; i <= n; i++) {
                result *= i;
            }
            System.out.println("计算 n 的阶乘中"+n+"! = " + result);
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    执行结果:

    img

    3. 实参和形参的关系

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

    对于 基础类型 来说, 形参相当于实参的拷贝,对于形参的改变不会影响实参,即 传值调用 ;要想通过形参改变实参,可以传引用类型来做(比如数组),此时是 传址调用。

    二. 方法重载

    在自然语言中,经常会出现“一词多义”的现象,比如:“好人”。
    一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。

    在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了;编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法 。

    重载函数常用来实现功能类似而所处理的数据类型不同的问题

    1. 函数重载的规则

    1. 方法名必须相同
    2. 参数列表必须不同(参数的个数不同/参数的类型不同/类型的次序必须不同)
    3. 与返回值类型是否相同无关,两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的

    代码示例:

    public class Blog {
        public static void main(String[] args) {
            add(1, 2); // 调用add(int, int)
            add(1.5, 2.5); // 调用add(double, double)
            add(1.5, 2.5, 3.5); // 调用add(double, double, double)
        }
        
        public static int add(int x, int y) {
            return x + y;
        }
        public static double add(double x, double y) {
            return x + y;
        }
        public static double add(double x, double y, double z) {
            return x + y + z;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2. 方法签名

    在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那**为什么类中就可以定义方法名相同的方法呢,**这里就是因为有方法签名的存在了,虽然我们所起的方法名是相同的,但经过编译器中处理后的方法名是有所不同可以区分的。

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

    public class TestMethod {
        public static int add(int x, int y){
            return x + y;
        }
        
        public static double add(double x, double y){
            return x + y;
        }
        
        public static void main(String[] args) {
            add(1,2);
            add(1.5, 2.5);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:

    1. 先对工程进行编译生成.class字节码文件
    2. 在控制台中进入到要查看的.class所在的目录
    3. 输入:javap -v 字节码文件名字即可

    img

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

    特殊字符数据类型
    Vvoid
    Zboolean
    Bbyte
    Cchar
    Sshort
    Iint
    Jlong
    Ffloat
    Ddouble
    [数组(以 [ 开头,配合其他的特殊字符,表述对应数据类型的数组,几个[表述几维数组)
    L引用类型,以L开头,以 ; 结尾,中间是引用类型的全类名

    三. 递归

    一个方法在执行过程中调用自身, 就称为 “递归”.

    该种思想在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了

    递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.

    例如, 我们求 N!
    起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
    递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!

    递归的必要条件:

    1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
    2. 递归出口

    这里关于递归不再多做介绍,在C语言函数部分的博客,对于递归有详细的介绍,可以参考学习。

    四. 关于 “调用栈”

    方法调用的时候, 会有一个 “栈” 这样的内存空间描述当前的调用关系. 称为调用栈.

    每一次的方法调用就称为一个 “栈帧”, 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息.

    可以参考我C语言部分函数栈帧的的博客。

    结语

    各位小伙伴,看到这里就是缘分嘛,希望我的这些内容可以给你带来那么一丝丝帮助,可以的话三连支持一下呗😁!!! 感谢每一位走到这里的小伙伴,我们可以一起学习交流,一起进步😉!!!加油🏃!!!

    img

  • 相关阅读:
    Python日期处理库:掌握时间的艺术
    工作流-普通节点转会签节点
    学习登录接口过程中的踩坑记录
    使用Tensorboard碰到AttributeError: module ‘distutils‘ has no attribute ‘version‘
    Bootstrap 自定义Tooltips背景色样式等
    希尔排序的实现
    从一道面试题来谈谈Golang中的 ==
    Linux下修改触摸板默认行为的方法以及所遇问题和解决
    electron使用better-sqlite3打包失败(electron打包有进程没有界面)
    艾美捷PEG-2000 DMG解决方案
  • 原文地址:https://blog.csdn.net/Trong_/article/details/126136924