【Java】方法的理解与使用

简介: 【Java】方法的理解与使用

前言

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

一. 方法的相关介绍

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

1. 方法的定义

方法语法格式

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

示例:

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

public class Blog {
    // 方法的定义
    public static int add(int x, int y) {
        return x + y;
    }
}

注意事项:


修饰符:初学直接使用public static 固定搭配

返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void

方法名字:采用小驼峰命名(第一个单词首字母小写,后面的单词首字母大写)

参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开

方法体:方法内部要执行的语句

在java当中,方法必须写在类当中,且方法不能嵌套定义

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

执行结果:73d8c9be8b2a4960a39693770de0ac9a.png

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

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

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

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

73d8c9be8b2a4960a39693770de0ac9a.png

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

特殊字符 数据类型
V void
Z boolean
B byte
C char
S short
I int
J long
F float
D double
[ 数组(以 [ 开头,配合其他的特殊字符,表述对应数据类型的数组,几个[表述几维数组)
L 引用类型,以L开头,以 ; 结尾,中间是引用类型的全类名

三. 递归

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

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

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


例如, 我们求 N!

起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.

递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!


递归的必要条件:


将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同

递归出口

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

四. 关于 “调用栈”

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

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

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

目录
相关文章
|
17天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
57 4
|
27天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
45 17
|
21天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
61 2
|
1月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
49 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
29天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
19 3
|
1月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
29天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
17 2
|
29天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
17 1
|
29天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
34 1
|
29天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
27 1
下一篇
无影云桌面