Java开发 | 方法 | 重载 | 递归 | 练习题

 前言

 大家好,我是程序猿爱打拳。今天讲解的是Java中方法的使用。Java中的方法类似于C语言里面的函数其中都有实参与形参。但Java中的方法又比C语言中的函数更为强大,为何呢?请看下文。

 

目录

1.为什么要有方法?

2.方法的概念及使用

2.1什么是方法?

2.2方法定义

2.3方法的调用

2.4实参和形参

2.5没有返回值的方法

3.方法重(chong)载

3.1方法重载是什么?

3.2方法重载的使用

3.3方法签名

4.递归

4.1递归的概念

4.2递归执行过程


1.为什么要有方法?

当我们执行同一种类型的操作时,每执行一次我们就得编写一次代码。这样会使我们变得非常烦躁而且不利于开发。因此我们把这同一种类型的操作编写为一个方法,当我们需要这个操作的时候就调用这个方法以免每次都得编写同一种代码。

上图中,右边就是一个方法。当老师被问及宿舍地址时,老师可以使用该公告,非常的方便。 当我们编写程序的时候反复的去编写同一种类型的代码时是很烦躁的,因此我们需要一串专门的代码来实现复用效果,这串代码就是我们认为的方法!与上图的公告是一样的意思。


2.方法的概念及使用

2.1什么是方法?

Java中的方法类似于C语言的"函数",但也有些不同处,不同处是Java中方法更好用,下文会讲到。

方法的几个特点:

  1. 可重复利用,一份代码可以在多个位置中使用
  2. 实现模块化程序
  3. 简单易懂

2.2方法定义

在C语言中我们有main函数,在Java中我们有main方法。那么方法的语法格式我就拿main方法来介绍:

上图就是main方法的语法格式其他方法格式也是相同的,下面我们在main方法里实现一个数的阶乘:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个数:");
        int num = sc.nextInt();
        int sum = 1;
        for (int i = 1; i <= num ; i++) {
            sum *= i;
        }
        System.out.println(num+"的阶乘为:"+sum);
    }
}

运行效果:


2.3方法的调用

方法是如何调用呢,一般我们是在主函数里面调用方法。比如给定两个数,求其最大数使用名为Max的方法来实现:

public class Test {
    public static int Max(int x,int y) {
        return x>y?x:y;
    }
    public static void main(String[] args) {
        int ret = Max(5,2);
        System.out.println(ret);
    }
}

以上程序中的Max就是一个方法,这个方法的类型参数以及方法体都是我来编写。我可以从main方法中调用Max方法最后返回一个最大值。这就是方法的调用,跟C语言很相似,C语言中有实参形参方法中也是有实参和形参的。


2.4实参和形参

形参是实参的一份临时拷贝,形参通过实参来得到具体的数据从而进行操作。我们来编写一个add的方法来理解。

public class Test {
    public static int add(int x,int y) {
        return x+y;
    }
    public static void main(String[] args) {
        int ret = add(2,3);
        System.out.println(ret);
    }
}

输出:

以上代码中,main方法中add()里面的2和3就是实参,add方法()里面的就是形参。形参必须与实参类型一致。方法的返回类型也必须与接收返回的类型一致。如下图所示:

学习过C语言中函数的伙伴就不难理解,实参与形参的关系。在C语言中我们知道了形参是实参中的一份临时拷贝。Java中也是一样的,如交换两个整数:

(1)C语言实现

#include<stdio.h>

void Swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
	printf("Swap函数中:\n");
	printf("x=%d\n", x);
	printf("y=%d\n", y);
}
int main()
{
	int a = 10;
	int b = 20;
	Swap(a, b);
	printf("main函数中:\n");
	printf("x=%d\n", a);
	printf("y=%d\n", b);
	return 0;
}

 输出效果:

(2)Java实现

public class Test {
    public static void Swap(int x,int y) {
        int tmp = x;
        x = y;
        y = tmp;
        System.out.println("Swap方法中:");
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        Swap(a,b);
        System.out.println("main方法中:");
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

显示效果:

 以上两个代码展示了C和Java中函数与方法相同之处。


2.5没有返回值的方法

在上面的2.2方法的定义中,我们知道了方法在定义的时候要给定返回类型。我们想返回整型就写int,想返回双精度浮点型就写double。想没有返回值就写void,如定义一个方法求两数之和并且无返回值:

public class Test {
    public static void print(int x,int y) {
        int sum = x+y;
        System.out.println(sum);
    }
    public static void main(String[] args) {
        int a= 10;
        int b= 20;
        print(a,b);
    }
}

输出:

以上print方法的返回值为void,表示无返回值。这点跟C语言中函数的返回值类型是一样的。


3.方法重(chong)载

在日常生活中“好人”的定义是不同的,你在马路上扶一位老爷爷过吗,老爷爷说你是个好人。当舔狗时女生说你是个好人。这就是好人不同的定义,方法也一样,可以有不同的定义。


3.1方法重载是什么?

当我们使用同一种操作时,有时候因为类型的不同。而要重新编写代码,这给我们带来了极大的不变。因此Java中提供了一种叫方法重载的功能。

方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。

方法重载的特点:

  1. 同一个类,同一个方法名
  2. 不同:参数列表不同。(类型,个数,顺序不同)

3.2方法重载的使用

public class Test {
    public static int Sum(int x,int y) {
        return x+y;
    }
    public static double Sum(double x,double y) {
        return x+y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double c = 3.1;
        double d = 4.2;
        int ret1 = Sum(a,b);
        double ret2 = Sum(c,d);
        System.out.println(ret1);
        System.out.println(ret2);
    }
}

输出:

以上程序我们可以看到,实现两个整数的加法用到的是Sum方法,实现两个浮点型的加法也是用的Sum方法,这就是方法的重载。那么重载唯一需要注意的是:除了方法名可以一致外,其余所有的类型都得与返回类型、形参、实参一致。


3.3方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?那是因为有了方法的签名。
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

public class Test {
    public static int Sum(int x,int y) {
        return x+y;
    }
    public static double Sum(double x,double y) {
        return x+y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double c = 3.1;
        double d = 4.2;
        int ret1 = Sum(a,b);
        double ret2 = Sum(c,d);
        System.out.println(ret1);
        System.out.println(ret2);
    }
}

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

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

 以上图片中的Test.Sum:(II)I对应就是Sum(int int),Test.Sum:(DD)D对应的就是Sum(double double)。证明了3.1中提到的方法的重载是Java的一个功能。常见的签名符号为:

特殊字符 数据类型
V void
Z boolean
B byte
C char
S short
I

int

J long
F float
D double
[ 数组
L 引用类型

4.递归

在我们生活中会听到这样一则故事:从前有座山山里有座庙......。然后你会讲给你的朋友,你的朋友会讲给他的朋友就这样递归下去。


4.1递归的概念

一个方法在执行过程中调用自己,就称为递归。比如我们要求N!,我们会依次从N*到1,因此我可以把1设置为终止条件,只要*到1程序就结束。当然递归的时候,我们最好是找到一个公式。就那N!来说。我可以这样设置N*(N-1)。并且终止条件设置为N==1。

递归的必然条件:

  1. 将原问题划分为一个个子问题,子问题必须要与原问题的解法相同
  2. 必须要有终止条件

如求5的阶乘:

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

输出:


4.2递归执行过程

递归的程序执行过程不太容易理解,我们必须通过一个流程图或者调用编译器底层栈帧来理解,方法是如何一步步调用自己并且结束调用自己的。

如求5的阶乘:

public class Test {
    public static int diGui(int n) {
        System.out.println("递归开始,n="+n);
        if(n==1) {
            System.out.println("递归结束,n=1 ret=1");
            return 1;
        }
        int ret = n * diGui(n-1);
        System.out.println("递归结束,n="+n+",ret="+ret);
        return ret;
    }
    public static void main(String[] args) {
        int ret = diGui(5);
        System.out.println("ret="+ret);
    }
}

输出:

 执行流程图:


以上就是本篇博文的全部内容了,感谢您的阅读!

 Never Give Up

猜你喜欢

转载自blog.csdn.net/weixin_64916311/article/details/129343564