【JAVA】八、“方法的使用”知识点详细整理(持续更新中)

news/2025/3/28 12:26:53/

目录

8. 方法概念及使用

8.1 方法定义

1. 语法格式

2. 详细说明

8.2 方法调用的执行过程 

1. 具体过程

2. 栈帧的理解

8.3 实参和形参的关系 

1. 形参(形式参数)  

2. 实参(实际参数)

8.4 没有返回值的方法

8.5 方法重载

1. 核心概念

2. 重载的三大规则

3. 常见陷阱

4. 总结 


8. 方法概念及使用

        在介绍方法的使用前,我们先聊聊别的,还记得小时候玩过的积木吗?我们可以用各种形状的积木,搭建出城堡、汽车、甚至整个城市。而在Java编程中,方法就像这些积木,它们是预先定义好的代码块,可以完成特定的功能。

        想象一下,你要写一个程序来制作一杯咖啡。你可以把“磨咖啡豆”、“烧开水”、“冲泡咖啡”这些步骤,分别写成独立的方法。然后,在主程序中,你只需要按照顺序调用这些方法,就能轻松制作出一杯香浓的咖啡;下面开始正式进入介绍。


8.1 方法定义

1. 语法格式

2. 详细说明
  • 修饰符:

   控制方法的访问权限,如public、private、protected或默认(不写)。
   例如:`public` 表示该方法可以被其他类访问。

  • 返回类型:

   方法执行后返回的数据类型。如果方法不返回任何值,则使用void。返回值类型必须要与返回的实体类型一致。
   例如:int表示方法返回一个整数,void表示方法不返回任何值。

  • 方法名:

   方法的名称,遵循标识符命名规则(驼峰命名法)。
   例如:`calculateSum`、`printMessage`。

  • 参数列表:

   方法接收的输入参数,用逗号分隔。每个参数包括参数类型和参数名。如果没有参数,()中什么都不写。
   例如:(int a, int b) 表示方法接收两个整数参数。

  • 方法体:

   包含方法的具体实现代码。
   例如:计算、循环、条件判断等。

  • return语句:

   如果方法有返回类型(非 void),则必须使用 return 语句返回一个值
   例如:return a + b; 返回两个整数的和。

注意:java中方法必须写在类中!

例子:调用方法计算两个数的和并输出。

java">public class Example {// 定义一个方法,计算两个整数的和public static int add(int a, int b) {int sum = a + b;return sum; // 返回计算结果}public static void main(String[] args) {// 调用add方法int result = add(5, 3);System.out.println("5 + 3 = " + result);}
}

 结果:

java">5 + 3 = 8

8.2 方法调用的执行过程 

流程大致如上图,下面博主进行详细介绍:

1. 具体过程
  • 方法调用

       当程序执行到一个方法调用语句时(例如上面的代码 add(5, 3);),Java虚拟机会暂停当前方法的执行,并开始执行被调用的方法。

  • 参数传递

       如果方法有参数,调用时会将实际参数的值传递给形式参数(方法定义中的参数)。

例如上述代码中:调用 add(5, 3) 时,5 和 3 会分别传递给方法定义中的 int a 和 int b

  • 方法栈帧的创建

       Java虚拟机会为被调用的方法创建一个新的栈帧,并将其压入调用栈。

栈帧中存储了方法的局部变量、参数和返回地址等信息。

  • 方法体的执行

      执行被调用方法的方法体中的代码。

例如:在 add 方法中,计算 a + b 并将结果存储在局部变量 sum 中。

  • 返回值的处理

       如果方法有返回值(非 void),则会将返回值传递给调用者。

例如:add 方法返回 sum 的值,调用者可以接收并使用这个值。

  • 栈帧的销毁

       方法执行完毕后,其对应的栈帧会从调用栈中弹出,释放内存

程序继续执行调用方法的下一条语句。

  • 继续执行调用的方法

       方法调用结束后,程序会回到调用的方法中,继续执行后续代码。方法在执行的过程中如果遇到了return,那么方法就结束了,意味着该方法在栈上开辟的内存就没有了。

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

2. 栈帧的理解

        在Java中,栈帧(Stack Frame) 是方法调用时在调用栈(Call Stack)中创建的一个数据结构,用于存储方法的执行信息。每个方法调用都会创建一个独立的栈帧,栈帧中包含了方法的局部变量、参数、操作数栈以及方法的返回地址等信息。


8.3 实参和形参的关系 

java中,实参的值永远都是赋值到形参中,形参和实参是两个实体。

1. 形参(形式参数)  
  • 定义形参是方法定义时声明的参数,用于接收调用方法时传递的值。

  • 特点

    • 形参的作用域仅限于方法内部

    • 形参是局部变量,方法执行结束后会被销毁。

java">// a 和 b 是形参
public static int add(int a, int b) { return a + b;
}

 在上面的代码中,a 和 b 是形参,它们的作用是接收调用方法时传递的实际值。


2. 实参(实际参数)
  • 定义实参是方法调用时传递给方法的具体值或变量。

  • 特点

    • 实参可以是常量、变量或表达式。

    • 实参的值会在方法调用时传递给形参

java">int result = add(5, 3); // 5 和 3 是实参

 在上面的代码中,5 和 3 是实参,它们会被传递给 add 方法的形参 a 和 b


 下面是一个简单的例子帮助友友们的理解,希望能对大家有帮助:

java">public class ParameterExamp {// 定义一个方法,a 和 b 是形参public static int add(int a, int b) {a = a + 10; // 修改形参 a 的值return a + b;}public static void main(String[] args) {int x = 5;int y = 3;// 调用 add 方法,x 和 y 是实参int result = add(x, y);System.out.println("结果是: " + result); // 输出 18System.out.println("x 的值: " + x);     // 输出 5(x 的值未被修改)}
}

首先方法调用

在 main 方法中,定义变量 x 和 y,并赋值 5 和 3

调用 add(x, y) 时,实参 x 和 y 的值会被传递给形参 a 和 b

接着数据传递

实参 x 的值 5 被复制给形参 a;实参 y 的值 3 被复制给形参 b

然后是方法执行

在 add 方法中,形参 a 的值被修改为 a + 10(即 15)。

计算 a + b,结果为 18,并返回。

最后是方法返回

方法执行完毕后,形参 a 和 b 被销毁。实参 x 和 y 的值不受影响,仍然是 5 和 3


8.4 没有返回值的方法

方法的返回值是可选的,有些时候可以没有的,没有时返回值类型必须写成void

语法格式如下:

java">[访问修饰符] void 方法名([参数列表]) {// 方法体// 执行某些操作
}

 举例说明:最终结果为8

java">public class Calculator {// 定义一个没有返回值的方法,用于执行加法并打印结果public static void addAndPrint(int a, int b) {int result = a + b; // 调用加法操作System.out.println("结果: " + result); // 调用打印方法}public static void main(String[] args) {addAndPrint(5, 3); // 调用 void 方法}
}

8.5 方法重载

首先,方法重载是什么?

1. 核心概念

        在同一个类中,允许存在多个“同名方法”,但它们的“参数列表必须不同”(类型、数量或者是顺序要不同)。

变形金刚版解释:想象你有一个叫“擎天柱”的机器人,它能根据敌人类型切换武器形态——参数不同,行为不同,但名字还是“擎天柱”!(ps博主还是比较喜欢大黄蜂~)


2. 重载的三大规则

1️⃣ 参数类型不同
2️⃣ 参数数量不同
3️⃣ 参数顺序不同
🚫 注意:返回类型不同但参数列表相同?不算重载!这是“无效分身术”!

例子:不同参数类型的重载

java">public class Calculator {// 处理两个整数相加public static int add(int a, int b) {return a + b;}// 处理两个小数相加public static double add(double a, double b) {return a + b;}// 处理三个整数相加public static int add(int a, int b, int c) {return a + b + c;}public static void main(String[] args) {System.out.println("结果1: " + add(2, 3));     System.out.println("结果2: " + add(2.5, 3.5));System.out.println("结果3: " + add(1, 2, 3));}
}

 结果为:

java">结果1: 5
结果2: 6.0
结果3: 6

3. 常见陷阱
  • 仅返回类型不同

java">// 错误示范!编译器会翻脸!
public static int add(int a, int b) { return a + b; }
public static double add(int a, int b) { return (double)(a + b); }

错误提示:Method add(int, int) is already defined(方法重复定义) 

  • 参数名不同不算重载

    java">// 错误示范!参数名不同但类型相同,不算重载!
    public static void log(String message) { ... }
    public static void log(String text) { ... } // 编译错误!


4. 总结 
  • 同名不同参:参数类型、数量或顺序必须不同。

  • 返回类型随意:可以不同,但不足以构成重载。

  • 不关心权限修饰符publicprivate 等修饰符不影响重载。


制作不易,感谢友友们的点赞收藏关注,如有问题欢迎批评指正,祝友友们生活愉快,学习工作顺顺利利!


http://www.ppmy.cn/news/1580874.html

相关文章

全球化2.0 | ZStack云计算系统工程师(ZCCE)国际认证培训成功举办

近日,ZStack云计算系统工程师(ZCCE)国际认证培训在上海成功举办。本次培训采用 "线下 线上直播" 双轨模式,同步开设中文与英文课程,吸引了来自中国、东南亚、独联体、北美、中东等多个国家和地区的近 90 名…

ocp考试有判断题吗?多少分及格?

ocp考试有判断题吗?多少分及格? OCP考试没有判断题。 OCP考试指的是Oracle OCP中级认证考试,是数据库领域非常有含金量的一种认证,如果拿到OCP证书对于个人入职或者涨薪都有帮助。 OCP考试,可以说是数据库领域最值得考的一个认证&#xf…

Altium Design元件管理笔记

随着工程越来越大,元件越来越多,封装越来越多,为了统一元件封装、原理图,使用AD的一些管理功能。 一、从库中更新元件 在Update From Libraries中,可以从库中更新元件的各种属性、封装、模型。 1.在原理图中&#xff0…

SQL 指南

SQL 指南 引言 SQL(Structured Query Language)是一种用于管理关系数据库的编程语言。它被广泛应用于各种数据库系统中,如MySQL、Oracle、SQL Server等。SQL 指南旨在帮助读者全面了解 SQL 的基础知识、高级应用以及在实际工作中如何高效地使用 SQL。 SQL 基础 1. 数据库…

单片机写的小液晶屏驱动+汉字滚屏

单片机写的小液晶屏驱动汉字滚屏 stm32f401freertos内置HZK16 单片机汉字滚屏

ssh 多重验证的好处:降低密钥长度,动态密码

ssh 多重验证的好处: 多重验证:可能要比单纯提高密钥长度,或密码的长度更好,可以获得更好的保证服务器安全的效果。降低密钥长度:可以提高 CPU运行时的有效速度,特别是在传输大文件、或传输低比特率视频时…

指令系统2(Load/Store 指令)

一. Load/Store 指令 1. 前变址 前变址指令是在读取或存储数据时,先根据基址寄存器(Rn)与偏移量(offset)计算出有效地址,再进行数据操作。相关指令及示例如下: LDR R0, [R1, #4]:从…

【C++】priority_queue的使用及模拟实现(含仿函数介绍)

文章目录 前言一、 priority_queue的介绍二、priority_queue的使用三、仿函数四、priority_queue的模拟实现 前言 一、 priority_queue的介绍(优先级队列是默认使用vector作为其底层存储数据的容器适配器,在vector上又使用了堆算法将vector中元素构造成堆…