第 7 课:方法(函数)

第 7 课:方法(函数)

一、为什么用方法

DRY 原则(Don't Repeat Yourself):逻辑只写一次,随处调用。方法 = 复用 + 可读 + 好维护。

二、定义语法

java 复制代码
public static int add(int a, int b) {
    return a + b;
}
// public  访问修饰符
// static  静态方法,可直接调用
// int     返回值类型
// add     方法名(小驼峰,动词开头)
// (int a, int b)  参数列表(形参)

三、四种形态

java 复制代码
static void sayHello() { }                       // ① 无参无返回
static void printStar(int n) { }                 // ② 有参无返回
static int getRandom() { return 1; }             // ③ 无参有返回
static int add(int a, int b) { return a + b; }   // ④ 有参有返回(最常用)

void = 没有返回值,调用时不能用变量接。

四、return 的双重身份

  1. 交结果
  2. 立即结束方法,后面的代码不执行
java 复制代码
static String checkAge(int age) {
    if (age < 0)  return "年龄不合法";   // 提前 return,避免深层嵌套
    if (age < 18) return "未成年";
    return "成年";
}

有返回值的方法,所有分支都要有 return,否则编译报 missing return statement。

五、参数传递(面试高频)

Java 只有值传递,区别在于「值」是什么:

类型 传的是什么 方法内修改 影响外部?
基本类型 值的副本 改形参 不影响
引用类型 地址的副本 改内容(arr0=99) 影响
引用类型 地址的副本 改指向(a = new int\[\]{}) 不影响

六、方法重载

方法名相同、参数列表不同(个数/类型/顺序)。

java 复制代码
static int add(int a, int b)        { return a + b; }
static int add(int a, int b, int c) { return a + b + c; }
static double add(double a, double b) { return a + b; }

只看方法名 + 参数列表(方法签名),与返回值无关:

java 复制代码
static int getValue()    { return 1; }
static double getValue() { return 1.0; }   // ❌ 重复定义

七、可变参数

java 复制代码
static int sum(int... nums) {
    int total = 0;
    for (int n : nums) total += n;
    return total;
}
sum(); sum(1, 2); sum(1, 2, 3, 4);

规则:可变参数必须在参数列表最后。

八、递归(了解 + 面试常考)

java 复制代码
static int factorial(int n) {
    if (n <= 1) return 1;            // 出口
    return n * factorial(n - 1);     // 规模递减
}

两要素:出口条件 + 问题规模递减。缺一个就是 StackOverflowError。新手优先用循环。

九、三个坑

  1. 方法不能嵌套定义
  2. 有返回值但漏写 return → 编译错误
  3. 调用时参数个数/类型不匹配

十、实战工具类

java 复制代码
public class MyUtils {
    static boolean isPrime(int n) {
        if (n < 2) return false;
        for (int i = 2; i * i <= n; i++) {
            if (n % i == 0) return false;
        }
        return true;
    }

    static int max(int[] arr) {
        if (arr == null || arr.length == 0) return -1;
        int max = arr[0];
        for (int v : arr) if (v > max) max = v;
        return max;
    }

    static String reverse(String s) {
        if (s == null) return "";
        return new StringBuilder(s).reverse().toString();
    }
}

亮点细节:判断素数只需试到平方根(i * i <= n)。

十一、作业

  1. 写方法 int sumToN(int n) 返回 1 到 n 的和
  2. 写方法 boolean isEven(int n) 判断奇偶
  3. 写方法 double avg(int[] arr) 求平均值,传入空数组返回 0
  4. 用重载写三个 print 方法,分别接收 int、double、String

下一课预告

面向对象(上):类与对象------Java 真正的分水岭。

相关推荐
一条泥憨鱼4 小时前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
孟陬6 小时前
Foobar 技术周刊#160:大模型让大规模形式化软件验证成为现实丨AI写C++代码之后会发生什么?丨我们真的需要alpha() 函数吗丨重试,有时会让故障更
前端·后端·typescript
BingoGo6 小时前
PHP 标准库的价值远不止少写几行代码
后端·php
JaguarJack6 小时前
PHP 标准库的价值远不止少写几行代码
后端·php·服务端
鶴哥只手遮天6 小时前
《Redis 8.10.3 深度剖析》系列 · 第 1 章·全景与源码地图:版本谱系、构建体系、全局状态与启动链路
redis·后端·开源
用户400315043356 小时前
《从 skynet.timeout 到回调执行:Skynet 分层时间轮源码剖析》
后端
一条Go6 小时前
四个进程,一把锁:Alioth 的告警评测为什么不需要消息队列
后端·设计模式·架构
用户1996143559966 小时前
插件是怎么被安全装进系统的
后端
愚农搬码7 小时前
自研表单引擎、开源组件二开和商业产品,企业应该如何选择?
后端
用户298698530147 小时前
Python 自动化处理 Word 页眉页脚的几种典型场景
后端·python·api