• Java中的方法是什么?(Java系列2)


    目录

    前言:

    1.什么是方法

    2.方法的定义

    3.方法调用的执行过程

    4.实参和形参的关系

    5.方法重载

    6.方法签名

    7.递归

    8.关于“调用栈”

    结束语:


    前言:

    在上一次博客中小编主要和大家分享了Java中的一些基础知识,与小编之前和大家分享的C语言没有太大的区别,但是从这次开始小编就要和大家分享一些Java中与C语言不一样的地方了,准备好接收哦!

    1.什么是方法

    首先我们得明白什么是方法,所谓方法就是一个代码片段,类似于C语言当中的函数。

    方法存在的意义:

    • 是能够模块化的组织代码。
    • 做到代码可以被重复使用,一份代码可以被用于多个地方。
    • 让代码理解起来更加简洁。
    • 直接调用现有的代码“开方”,不必重新造轮子。

    2.方法的定义

    语法格式:

    []中的值表示可以加也可以不加。

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

    注意:

    • 修饰符现阶段直接使用public static固定搭配。
    • 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void。
    • 方法名字,采用小驼峰命名。
    • 参数列表:如果方法没有参数,()中什么都不写;如果有参数,需要指定参数类型,多个参数之间使用逗号隔开。
    • 方法体:是方法内部要执行的语句。
    • 在Java当中,方法必须写在类当中。
    • 在Java当中,方法不能嵌套定义。
    • 在Java当中,没有方法声明这么一说。 
    • 在Java当中,方法可以放在任何的位置,都会被调用,不需要像C语言当中一样需要放在主函数之前不用声明,放在主函数或者是放在其它地方就需要被声明。

    3.方法调用的执行过程

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

    代码如下所示:

    1. import java.util.Scanner;
    2. public class Test1 {
    3. public static int Add(int x, int y) {
    4. return x + y;
    5. }
    6. public static void main(String[] args) {
    7. Scanner scan = new Scanner(System.in);
    8. int a = scan.nextInt();
    9. int b = scan.nextInt();
    10. int ret = Add(a,b);
    11. System.out.println(ret);
    12. }
    13. }


    结果如下所示:

    解析:


     

    4.实参和形参的关系

    在Java中,实参值永远都是拷贝到形参中去的,形参和实参本质是两个实体。形参的名字可以随意取。

    我们可以看到下面代码中被调用方法中的值已近被交换了,但是主方法中却没有被交换。这样我们就可以更加确信实参与形参是两个实体了。

    代码如下所示:

    1. import java.util.Scanner;
    2. public class Test2 {
    3. public static void Swap(int x, int y) {
    4. int tmp = 0;
    5. tmp = x;
    6. x = y;
    7. y = tmp;
    8. System.out.println("Swap方法中的:" + x + " " + y);
    9. }
    10. public static void main(String[] args) {
    11. Scanner scanner = new Scanner(System.in);
    12. int a = scanner.nextInt();
    13. int b = scanner.nextInt();
    14. Swap(a,b);
    15. System.out.println("主方法中的:" + a + " " + b);
    16. }
    17. }

    结果如下所示:

    5.方法重载

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

    注意:

    • 方法名必须相同。
    • 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)。
    • 与返回值的类型是否相同无关。
    • 编译器在编译代码的时候会对实参类型进行推演,根据推演的结果来确定调用哪个方法。

    代码如下所示:

    1. public class Test3 {
    2. public static int Sum(int a, int b) {
    3. return a + b;
    4. }
    5. public static int Sum(int a, int b, int c) {
    6. return a + b + c;
    7. }
    8. public static double Sum(double a, double b) {
    9. return a + b;
    10. }
    11. public static double Sum(double a, double b, double c) {
    12. return a + b + c;
    13. }
    14. public static double Sum(int a, double b) {
    15. return a + b;
    16. }
    17. public static double Sum(double b,int a) {
    18. return a + b;
    19. }
    20. public static void main(String[] args) {
    21. int ret1 = Sum(10,20);
    22. System.out.println(ret1);
    23. System.out.println("==============");
    24. System.out.println(Sum(3.2, 9));
    25. System.out.println("==============");
    26. System.out.println(Sum(2,4.1));
    27. System.out.println("==============");
    28. System.out.println(Sum(1,2,3));
    29. System.out.println("==============");
    30. System.out.println(Sum(1.2,2.3,3.4));
    31. }
    32. }

    结果如下所示:

     

    6.方法签名

    在同一个作用域中不能定义两个相同名称的标识符,比如:方法中不能定义两个名字一样的变量,那么为什么类中就可以定义方法名相同的方法呢?

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

    7.递归

    自身中又包含了自己,一个方法在执行过程中调用自身,就称为递归。

    递归的必要条件:

    • 将问题划分成子问题,注意:子问题必须要与原问题的解法一致。
    • 要有递归出口。

    我们直接看一个经典的案例:河内塔。 

    代码如下所示:

    1. public class Test4 {
    2. /**
    3. * @param n 几个盘子
    4. * @param pos1 起始位置
    5. * @param pos2 中转位置
    6. * @param pos3 目的位置
    7. */
    8. public static void move(char pos1,char pos2) {
    9. System.out.print(pos1 + "->" + pos2 + " ");
    10. }
    11. public static void Hanoi(int n, char pos1, char pos2, char pos3) {
    12. if(n == 1) {
    13. move(pos1,pos3);
    14. return;
    15. }
    16. Hanoi(n - 1,pos1,pos3,pos2);
    17. move(pos1,pos3);
    18. Hanoi(n - 1,pos2,pos1,pos3);
    19. }
    20. public static void main(String[] args) {
    21. Hanoi(1,'A','B','C');
    22. System.out.println();
    23. Hanoi(2,'A','B','C');
    24. System.out.println();
    25. Hanoi(3,'A','B','C');
    26. System.out.println();
    27. }
    28. }

    结果如下所示:

    8.关于“调用栈”

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

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

    结束语:

    这次小编就给大家分享到这里啦如果想要深入了解Hanoi的同学可以去看小编写的C语言这篇:http://t.csdn.cn/ezdy1 ,希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

  • 相关阅读:
    解决docker通过volumes挂载文件,宿主机修改后容器内不同步,重启服务才能同步
    链上物理资产「规模化」或将推动产业协作互联网迎来爆发
    C语言刷题练习(Day2)
    解决方案:炼丹师养成计划 Pytorch+DeepLearning遇见的各种报错与踩坑避坑记录(四)
    基于CefSharp开发浏览器(十)CefSharp.Wpf中文输入法偏移处理
    我的奋斗:我在外企那些年(二)
    Guetzli的原理
    苹果与芯片巨头Arm达成20年新合作协议,将继续采用芯片技术
    【计算机网络】网络编程接口 Socket API 解读(3)
    纳米软件自动电源测试系统如何助力电源模块启动延迟和上升/下降时间测试?
  • 原文地址:https://blog.csdn.net/weixin_61599986/article/details/127932240