Java基础语法(五):方法全解析(含实战案例)

大家好!今天我们将深入理解方法(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) { /*...*/ }

重载的注意事项

  1. 参数必须不同

    • 个数不同:method(int x) vs method(int x, int y)

    • 类型不同:method(int x) vs method(double x)

    • 顺序不同:method(int x, double y) vs method(double x, int y)

  2. 与返回值无关

    java
    // ❌ 错误!这不是重载,不能共存
    void method(int x) { }
    int method(int y) { return y; }
  3. 与参数名无关

    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:随机点名器

需求分析

  1. 存储全班同学姓名

  2. 打印所有同学姓名

  3. 随机抽取一名同学

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 返回值;
}

⚠️ 使用注意事项

  1. 方法不调用不执行 - 定义后需要主动调用

  2. 方法不能嵌套定义 - 但可以在方法中调用其他方法

  3. 位置要求 - 定义在类中,其他方法外面

  4. void关键字 - 无返回值时使用,不能作为数据类型

  5. return可省略 - void方法中可以不写return

📞 方法调用方式

  • 有返回值方法:赋值调用(推荐)、输出调用、单独调用

  • 无返回值方法:只能单独调用

🔁 方法重载

  • 定义:同一类中,方法名相同,参数列表不同(个数、类型、顺序)

  • 特点:与返回值类型无关,与参数名无关

  • 本质:JVM通过参数列表自动匹配对应方法

🔄 参数传递

  • 基本数据类型:值传递,形参改变不影响实参

  • 引用数据类型:地址传递(String除外),修改会影响原对象


🎓 写在最后

掌握方法是Java入门的关键一步。通过将功能封装成独立方法,我们的代码会变得更清晰、更易维护。建议大家在学习过程中:

  1. 多动手练习不同类型的方法定义

  2. 尝试将之前案例中的代码改造成方法形式

  3. 理解参数传递的内存模型

下期我们将继续深入学习Java的面向对象编程,敬请期待!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值