> 文档中心 > 【JavaSE系列】 第五话 —— 方法的使用

【JavaSE系列】 第五话 —— 方法的使用

目录

 🍚一、本节重点内容

 🧀二、思维导图

 🍜三、方法的概念和使用

       🥣🥣3.1 什么是 方法

       🍞🍞3.2 方法的定义

                🥡​​​​​​​🥡​​​​​​​🥡3.2.1 语法格式

       🍺​​​​​​​🍺3.3 方法调用的执行过程

                🧇​​​​​​​🧇​​​​​​​🧇 3.3.1 方法调用的过程

                🍖​​​​​​​🍖​​​​​​​🍖3.3.2 下面举例详细分析一下一个方法的执行过程

                 🍗​​​​​​​🍗​​​​​​​🍗3.3.3 代码示例

       🍇​​​​​​​🍇3.4 形参与实参的关系(重要)

       🥤​​​​​​​🥤3.5 有没有返回值的方法

                🧊​​​​​​​🧊​​​​​​​🧊3.5.1 代码示例

       🍿​​​​​​​🍿3.6 方法的重载

                🍟​​​​​​​🍟​​​​​​​🍟3.6.1 方法重载的概念

                🍔​​​​​​​🍔​​​​​​​🍔3.6.2 方法重载的要求

                🍕​​​​​​​🍕​​​​​​​🍕3.6.3 方法签名

       ​🎁​​​​​​​​🎁3.7 递归

                🎵​​​​​​​🎵​​​​​​​🎵3.7.1 递归的必要条件

                ⌚​​​​​​​⌚​​​​​​​⌚ 3.7.2 递归过程的具体代码分析实例

 📝总结


​​​​​​​

一、本节重点内容

  1. 掌握 方法的定义以及使用
  2. 掌握 方法传参 ;
  3. 掌握 方法重载 ;
  4. 掌握 递归


二、思维导图


三、方法的概念和使用

3.1 什么是 方法

       简单来说,方法就是一个 代码的片段,类似于C语言里面的函数。即:把一个功能给抽象出来了,使其变成一个模块;只需要传递相应的参数,便可以调用相应的方法,便可以调用这个功能。

       那么,方法的存在具有哪些意义呢:

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


3.2 方法的定义

3.2.1 语法格式

 【说明】

  1. 在Java里面,方法中 如果有返回值类型的话,那么方法体中一定要有返回值(并且与返回值类型相对应),否则会报错:
  2. 下面来列一个简单的例子:

 【注意事项】

  1. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void;
  2. 方法名字:采用小驼峰命名
  3. 形参列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开;
  4. 在java当中,方法必须写在类当中;方法不能嵌套定义(各方法是同级别的,但可以嵌套调用);没有方法声明一说(即:只要方法定义在类里面即可,与 main函数 的位置无关) 。


 3.3 方法调用的执行过程

 3.3.1 方法调用的过程

【注意】

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

3.3.2 下面举例详细分析一下一个方法的执行过程

【注意】Java中 从本质上来说,都是按值传递。 

 

3.3.3 代码示例

实现 1! + 2! + 3! + 4! + 5! 的代码:

       这一章我们已经正式的接触到了 方法,因此 我们需要把某一种特定的功能 写成一个模块了,这样就会更加方便。

第一步:我们 写出一个数的阶乘的方法:

第二步:我们 把每一个数的阶乘 给加到一起:

第三步:可以调用以上方法来实现功能:

然后编译起来看结果:

 3.4 形参与实参的关系(重要)

【说明】形参是实参的一份临时拷贝。

给看个图片:

曾经,在C语言中 是用交换函数swap来介绍 形参和实参的:

 分析:

       在经过swap交换后,交换的只是 形参 里面的数值,而并没有交换 实参 里面的数值;按照C语言来说,要想实现交换实参里面的值,那么就需要 形参 接收的是地址;可是,Java没有 按址传递 的概念。

       x、y是在main函数里面定义的,属于局部变量;局部变量在栈上开辟内存(一块特殊的内存空间),对于Java而言,栈上变量的地址是拿不到的。

       等到以后介绍到 类和对象 的内容,才可以对它进行操作(放在堆上的 都是对象,这个以后进行介绍)。


 3.5 有没有返回值的方法

方法的放回只有两种情况:有 或者 没有。

如果有,那么 返回值的类型 与 方法中要返回的类型 一一对应;

如果没有,那么 返回值的类型 需要变成 void,同时 方法中不能含有 return 。

那么如何判断方法到底需不需要返回值呢?

——其实很简单,就是来判断 这个方法在接下来的过程中到底有没有“搞事情”;一般情况下,最好都要把方法返回一个值出来(推荐)。

 

3.5.1 代码示例

 


 3.6 方法的重载

3.6.1 方法重载的概念

在Java中,如果多个方法的方法名相同,但是参数列表不同,那么 就称这几个方法重载了。

代码示例:

public class TestDemo {    /**     * 实现两个整数相加的     * @param a     * @param b     * @return     */    public static int add(int a,int b){ return a+b;    }    /**     * 实现3个整数相加的     * @param a     * @param b     * @param c     * @return     */    public static int add(int a,int b,int c){ return a+b+c;    }    /**     * 实现3个小数相加的     * @param a     * @param b     * @param c     * @return     */    public static double add(double a,double b,double c){ return a+b+c;    }    public static void main(String[] args) { System.out.println(add(1, 2)); System.out.println(add(1, 2, 3)); System.out.println(add(1.1, 1.2, 1.3));    }}

如上,三个方法就是重载的。

3.6.2 方法重载的要求

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

第一个和第二个条件很好理解,那么 我们就来具体介绍一下 第三个条件的意思:

        由此可见,真正影响 方法重载的 是 方法名和参数列表,而 返回值是不会影响方法的重载的。

       上面实例中,虽然返回值是不同的,但是 方法名和参数列表相同,所以 IDEA仍然把它当做了同一个方法,所以就报错了。

       所以说,返回值 一样 或者 不一样,不能考虑 能不能重载;真正决定重载的,是方法名和参数列表。

       简单的来说,平时用IDEA敲代码的情况,它会自动出现 一些方法重载的提示(这个会在介绍数组的时候会有大量的方法重载)。

3.6.3 方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量。

但是为什么在类中 可以定义 方法名相同的方法呢?

这就涉及到了 方法签名的概念,方法签名即:经过编译器编译修改过之后方法最终的名字。

具体方式为:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

代码示例:

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);} }

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

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

 

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

 


3.7 递归

       在某些情况下,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了

3.7.1 递归的必要条件

  1. 自己调用自己;
  2. 有一个趋近于终止的条件(递归出口)。

 

 【注意】写递归,需要提前推导它的一个递归公式。

 3.7.2 递归过程的具体代码分析实例

代码示例:

public class TestDemo {    public static void func(int n){ if(n==1){     System.out.println(n);     return; } func(n-1); System.out.println(n);    } public static void main(String[] args) { func(5);    }}

图示:

 【说明】正是由于每一次递归 都执行了一半,都要保存一下线程,这才会出现栈溢出的原因。


总结

这一话的需要知道的内容就这么多了,

下一篇博客打算分享一些递归的练习题,用来巩固一下所学的知识,同时也会“装备”到这篇博客上去;

当然啦如果铁铁们可以一键三连那就更棒了,特别特别感谢 ୧(๑•̀⌄•́๑)૭ 。