大家好!今天我们将深入理解方法(Method)这一核心概念。方法是Java编程的基本单元,掌握它能让我们写出更优雅、更模块化的代码。本文将通过大量实例带你从零掌握方法定义、重载、参数传递等关键知识点。
一、方法概述
方法可以理解为解决特定问题的功能模块。就像我们日常生活中做某件事采取的"解决办法":
-
🚗 小明要坐车上学 → 解决方案:坐公交或打车
-
💻 程序要计算矩形面积 → 解决方案:定义一个
getArea()方法
在Java中,方法用来完成特定功能的代码块,通常包含多条语句,可以处理文本、控制输入或计算数值。方法通过方法名和参数被调用,并返回处理结果。
二、方法的语法格式
基本语法结构
java
修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...) {
执行语句;
return 返回值;
}
各组成部分说明
表格
| 组成部分 | 说明 | 注意事项 |
|---|---|---|
| 修饰符 | 如public static等访问控制符 | 后续会详细学习 |
| 返回值类型 | 方法返回结果的数据类型 | 无返回值时使用void |
| 方法名 | 方法的标识符 | 遵循小驼峰命名法 |
| 参数列表 | 调用时需要传入的数据 | 可无参数,但()不能省略 |
| return | 结束方法并返回值 | void方法可省略 |
第一个方法示例
java
public class MethodDemo01 {
public static void main(String[] args) {
int area = getArea(3, 5); // 📞 调用getArea方法
System.out.println("The area is " + area);
}
// 🎯 定义求矩形面积的方法
public static int getArea(int x, int y) {
int temp = x * y; // 计算结果
return temp; // 返回结果
}
}
运行结果:
The area is 15
三、方法调用过程图解
方法调用时,参数会在内存中创建临时变量。以getArea(3, 5)为例:
调用过程:
1. main方法调用getArea(3, 5)
2. 内存中为x分配空间并赋值3
3. 内存中为y分配空间并赋值5
4. 计算x*y = 15
5. return 15返回给调用者
6. getArea方法执行完毕,x和y被释放
7. main方法继续执行
这种"调用-执行-返回-释放"的机制是方法的核心工作原理。
四、方法定义实战练习
练习1:无返回值无参数方法
需求:打印3行3列的*号矩形
java
public static void printRect() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print("*");
}
System.out.println();
}
}
调用方式:printRect();
练习2:有返回值无参数方法
需求:从键盘读取一个整数
java
public static int getNumber() {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
return number;
}
调用方式:int num = getNumber();
练习3:无返回值有参数方法
需求:打印M行N列的*号矩形
java
public static void printRect2(int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print("*");
}
System.out.println();
}
}
调用方式:printRect2(4, 6);
练习4:有返回值有参数方法
需求:求三个数的平均值
java
public static double getAvg(double a, double b, double c) {
double result = (a + b + c) / 3;
return result;
}
调用方式:double avg = getAvg(90, 85, 95);
五、方法重载详解
为什么需要重载?
想象你要实现多个加法功能:
-
两个整数相加
-
三个整数相加
-
两个小数相加
如果每个方法名都不同(add01, add02, add03),调用时容易混淆。Java提供了方法重载机制来解决这个问题。
重载的定义
方法重载:在同一个类中,方法名相同但参数列表不同(参数个数、类型或顺序不同)。
java
// ✅ 正确的重载示例
public static int add(int x, int y) { /*...*/ }
public static int add(int x, int y, int z) { /*...*/ }
public static double add(double x, double y) { /*...*/ }
重载的注意事项
-
参数必须不同
-
个数不同:
method(int x)vsmethod(int x, int y) -
类型不同:
method(int x)vsmethod(double x) -
顺序不同:
method(int x, double y)vsmethod(double x, int y)
-
-
与返回值无关
java// ❌ 错误!这不是重载,不能共存 void method(int x) { } int method(int y) { return y; } -
与参数名无关
java// ❌ 错误!参数名不同但本质相同 method(int x) { } method(int y) { }
完整重载示例
java
public class MethodDemo03 {
public static void main(String[] args) {
int sum1 = add(1, 2); // 调2个参数的版本
int sum2 = add(1, 2, 3); // 调3个参数的版本
double sum3 = add(1.2, 2.3); // 调double版本
System.out.println("sum1=" + sum1); // 3
System.out.println("sum2=" + sum2); // 6
System.out.println("sum3=" + sum3); // 3.5
}
public static int add(int x, int y) { return x + y; }
public static int add(int x, int y, int z) { return x + y + z; }
public static double add(double x, double y) { return x + y; }
}
六、参数传递机制
核心概念
-
形式参数(形参):方法定义时的参数变量
-
实际参数(实参):方法调用时传入的具体数值
两种参数传递方式
1️⃣ 基本数据类型传参
java
public class ArgumentsDemo01 {
public static void main(String[] args) {
int a = 5, b = 10;
change(a, b); // 传入实参
System.out.println("a=" + a); // a=5(没变!)
System.out.println("b=" + b); // b=10(没变!)
}
public static void change(int a, int b) { // 形参
a = 200;
b = 500;
}
}
结论:基本数据类型传递的是值拷贝,形参改变不影响实参。
2️⃣ 引用数据类型传参
java
public class ArgumentsDemo02 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
change(arr); // 传入数组引用
for (int i : arr) {
System.out.print(i + " "); // 2 4 6(改变了!)
}
}
public static void change(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] *= 2; // 修改数组元素
}
}
}
结论:引用数据类型传递的是内存地址,形参和实参指向同一对象,修改会互相影响(String除外)。
七、实战案例
案例1:随机点名器
需求分析:
-
存储全班同学姓名
-
打印所有同学姓名
-
随机抽取一名同学
java
import java.util.Random;
import java.util.Scanner;
public class CallName {
public static void main(String[] args) {
System.out.println("--------随机点名器--------");
String[] students = new String[3]; // 存储容器
addStudentName(students); // 1.存储姓名
printStudentName(students); // 2.打印姓名
String randomName = randomStudentName(students); // 3.随机点名
System.out.println("被点到名的同学是: " + randomName);
}
/** 1.存储全班同学名字 */
public static void addStudentName(String[] students) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < students.length; i++) {
System.out.println("存储第" + i + "个名称:");
students[i] = sc.next();
}
}
/** 2.打印全班同学名字 */
public static void printStudentName(String[] students) {
for (int i = 0; i < students.length; i++) {
System.out.println("第" + i + "个学生名称:" + students[i]);
}
}
/** 3.获取随机点到的学生姓名 */
public static String randomStudentName(String[] students) {
int index = new Random().nextInt(students.length);
return students[index];
}
}
案例2:库存管理系统
需求:实现库存查看、修改和退出功能
java
import java.util.Scanner;
public class Demo库存管理 {
public static void main(String[] args) {
// 初始化商品数据
String[] brands = {"MacBookAir", "ThinkpadT450"};
double[] sizes = {13.3, 14.0};
double[] prices = {6988.88, 5999.99};
int[] counts = {0, 0};
while (true) {
int choose = chooseFunction(); // 显示菜单
switch (choose) {
case 1:
printStore(brands, sizes, prices, counts);
break;
case 2:
update(brands, counts);
break;
case 3:
exit();
return; // 退出程序
default:
System.out.println("功能选择有误,请输入正确的功能序号!");
}
}
}
/** 功能菜单 */
public static int chooseFunction() {
System.out.println("-------------库存管理------------");
System.out.println("1.查看库存清单\n2.修改商品库存数量\n3.退出");
System.out.print("请输入要执行的操作序号:");
return new Scanner(System.in).nextInt();
}
/** 查看库存清单 */
public static void printStore(String[] brands, double[] sizes,
double[] prices, int[] counts) {
int totalCount = 0;
double totalMoney = 0.0;
for (int i = 0; i < brands.length; i++) {
totalCount += counts[i];
totalMoney += counts[i] * prices[i];
}
System.out.println("\n---------------------------查看库存清单---------------------------");
System.out.println("品牌型号\t\t尺寸\t价格\t库存数");
for (int i = 0; i < brands.length; i++) {
System.out.println(brands[i] + "\t" + sizes[i] + "\t"
+ prices[i] + "\t" + counts[i]);
}
System.out.println("---------------------------------------------------------");
System.out.println("总库存数:" + totalCount);
System.out.println("库存商品总金额:" + totalMoney);
}
/** 修改库存数量 */
public static void update(String[] brands, int[] counts) {
System.out.println("------------修改商品库存数量-----------");
for (int i = 0; i < brands.length; i++) {
System.out.print("请输入" + brands[i] + "商品库存数:");
counts[i] = new Scanner(System.in).nextInt();
}
}
/** 退出系统 */
public static void exit() {
System.out.println("----------------退出---------------");
System.out.println("您已退出系统");
}
}
八、知识点总结
📌 方法定义格式
java
修饰符 返回值类型 方法名(参数类型 参数名1, ...) {
方法体;
return 返回值;
}
⚠️ 使用注意事项
-
方法不调用不执行 - 定义后需要主动调用
-
方法不能嵌套定义 - 但可以在方法中调用其他方法
-
位置要求 - 定义在类中,其他方法外面
-
void关键字 - 无返回值时使用,不能作为数据类型
-
return可省略 - void方法中可以不写return
📞 方法调用方式
-
有返回值方法:赋值调用(推荐)、输出调用、单独调用
-
无返回值方法:只能单独调用
🔁 方法重载
-
定义:同一类中,方法名相同,参数列表不同(个数、类型、顺序)
-
特点:与返回值类型无关,与参数名无关
-
本质:JVM通过参数列表自动匹配对应方法
🔄 参数传递
-
基本数据类型:值传递,形参改变不影响实参
-
引用数据类型:地址传递(String除外),修改会影响原对象
🎓 写在最后
掌握方法是Java入门的关键一步。通过将功能封装成独立方法,我们的代码会变得更清晰、更易维护。建议大家在学习过程中:
-
多动手练习不同类型的方法定义
-
尝试将之前案例中的代码改造成方法形式
-
理解参数传递的内存模型
下期我们将继续深入学习Java的面向对象编程,敬请期待!
9万+

被折叠的 条评论
为什么被折叠?



