Java学习第六天:方法(函数)+ 方法重载

一、方法是什么、作用、语法结构

定义:方法是一段具有特定功能的代码块,被封装在类中,通过调用执行。
类比:类似数学中的“函数”——输入参数,经过处理,可能返回结果
关键特性:

  • 必须定义在类内部(不能嵌套在其他方法中)。
  • 不调用则不执行。
  • 支持重载(同名方法,不同参数列表)。

方法的作用:

  • 提高复用性:一次定义,多次调用,避免重复代码。
  • 增强可维护性:修改逻辑只需调整一处。
  • 提升可读性:方法名即文档,使程序结构清晰。
  • 支持模块化:将复杂任务拆分为独立功能单元。
  • 便于测试与调试:可单独测试每个方法。

语法结构:
Java 方法的标准语法如下:

[访问修饰符] [其他修饰符如 static] 返回值类型 方法名(参数类型 参数名, ...) {
   // 方法体:执行的具体语句
   [return 返回值;]  // 仅当返回值类型不是 void 时需要
}

组成部分详解:

  • 访问修饰符(可选):如 public、private、protected,控制访问权限。
  • 其他修饰符(可选):如 static、final、abstract。
  • 返回值类型:若方法返回数据(如 int、String),则写具体类型。若不返回任何值,必须写 void。
  • 方法名:遵循小驼峰命名法(如 calculateSum),首字母小写,后续单词首字母大写。
  • 参数列表:格式:类型 名称,多个参数用逗号分隔。可为空(无参方法)。支持可变参数(如 int... nums),但只能有一个且必须位于最后。
  • 方法体:大括号 {} 内的语句,实现具体逻辑。

示例:

  • 无参无返回值
public static void sayHello() {
    System.out.println("Hello!");
}
  • 有参有返回值
public static int add(int a, int b) {
    return a + b;
}
  • 调用方式(假设在 main 方法中)
int result = add(3, 5);  // 接收返回值
sayHello();              // 作为语句调用

补充说明:

  • return 关键字:有返回值的方法必须包含 return 返回对应类型值。void 方法中可写 return; 提前退出,但不可返回值。
  • 静态 vs 实例方法:static 方法属于类,可直接通过类名调用。非静态方法需通过对象实例调用。
  • 参数传递:Java 中所有参数均为值传递,对象传递的是引用的副本(可修改对象内容,但不能改变引用本身)。

二、方法定义五要素

1、修饰符(Modifiers):

  • 这是可选的,用于指定方法的访问权限和其它特性(如是否是静态方法、是否是抽象方法等)。常见的修饰符有public、private、protected、static、final、abstract等。如果没有指定,则默认为包级私有(即默认情况下,只有同一包内的类可以访问这个方法)。

2、返回值类型(Return Type):

  • 指定方法执行完成后返回的数据类型。如果是void类型,表示该方法不返回任何值。例如,int表示该方法返回一个整型值,String表示返回一个字符串等。

3、方法名(Method Name):

  • 方法的名称,遵循Java的命名规范。方法名应该能够清晰地描述该方法的功能或操作。例如,calculateSum、printMessage等。

4、参数列表(Parameters):

  • 方法可以接受零个或多个参数。每个参数都有类型和名称。参数之间用逗号分隔。例如,int a, String b表示该方法接受一个整型参数和一个字符串参数。如果方法不接受任何参数,则参数列表为空,即使用括号表示:()。

5、方法体(Method Body):

  • 包含在花括号{}内,定义了方法的实际执行逻辑。这是实现方法功能的代码部分。例如,如果方法是要计算两个整数的和并返回结果,方法体可能包含类似return a + b;的代码。

示例

public class Example {
    // 修饰符:public,表示该方法可以被任何其他类访问
    // 返回值类型:int,表示该方法返回一个整型值
    // 方法名:calculateSum
    // 参数列表:(int a, int b),表示该方法接受两个整型参数
    // 方法体:包含实际的计算逻辑和返回结果
    public int calculateSum(int a, int b) {
        return a + b; // 方法体,执行加法操作并返回结果
    }
}

三、形参 & 实参

在 Java 中,形参(形式参数)和实参(实际参数)是方法调用中两个核心概念,它们的区别主要体现在定义位置、作用阶段、内存分配及传递机制上。
1、基本定义

  • 形参(Formal Parameter):
    是在方法声明时定义的参数,用于接收调用时传入的值。它是一个“占位符”,仅在方法内部有效,属于局部变量。
    示例:public void print(int num) 中的 num 就是形参。
  • 实参(Actual Parameter):
    是在方法调用时实际传递给形参的具体值,可以是常量、变量或表达式。
    示例:print(10); 或 print(x); 中的 10 或 x 就是实参。

2、核心区别

维度 形参 实参
定义位置 方法声明的括号内 方法调用时的括号内
作用域 仅限于方法内部 由其自身声明位置决定(局部/成员/静态变量)
生命周期 方法调用时创建,方法结束时销毁 独立于方法调用,取决于变量类型(如局部变量随方法结束而销毁)
是否需初始化 定义时无需赋值,由实参初始化 调用时必须有确定的值
类型要求 必须显式声明类型 类型需与形参兼容(支持自动类型转换、向上转型等)

3、Java 的参数传递机制:值传递(Pass-by-Value)
Java 只支持值传递,无论参数是基本类型还是引用类型:

  • 基本数据类型(如 int, double, boolean 等)
    传递的是值的副本。方法内修改形参不会影响实参。
public static void change(int n) { n = 100; }
public static void main(String[] args) {
    int a = 10;
    change(a);
    System.out.println(a); // 输出 10,未改变
}
  • 引用数据类型(如对象、数组、String)
    传递的是引用的副本(即对象地址的拷贝),形参和实参指向同一个对象。
  • 若通过形参修改对象内容(如 arr[0] = 99),会影响原对象。
  • 若重新赋值形参引用(如 arr = new int[]{}),则不会影响实参引用。
public static void modifyArray(int[] arr) { arr[0] = 99; }
public static void main(String[] args) {
    int[] array = {1, 2, 3};
    modifyArray(array);
    System.out.println(array[0]); // 输出 99,已改变
}

⚠️ 注意:Java 没有引用传递(Pass-by-Reference),即使传递对象时“看起来像共享”,本质仍是传递引用地址的副本

补充要点

  • 类型兼容性:实参类型必须与形参类型匹配或兼容(如 int 可传给 double,子类可传给父类)
  • 数量与顺序:实参个数、类型、顺序必须与形参完全一致(可变参数除外)
  • 可变参数:Java 支持 String... args 形式,允许传递 0 个或多个同类型参数

四、方法重载(Overload)

在Java中,方法重载(Overloading)是面向对象编程中的一个重要概念,它允许在同一个类中定义多个同名方法,只要它们的参数列表不同即可。这些方法可以是不同的返回类型,也可以是不同的参数类型、数量或者顺序。
方法重载的规则

  • 方法名相同:被重载的方法必须具有相同的名字。
  • 参数列表不同:方法必须改变参数的类型、数量或者顺序。
  • 返回类型可以不同:方法的返回类型可以是不同的,但这并不用于区分重载,除非与参数列表一起使用。
  • 访问修饰符和异常类型可以不同:这些因素不影响方法的重载。

示例

public class OverloadingExample {
    // 方法重载示例
    public void display() {
        System.out.println("No parameter");
    }

    public void display(int a) {
        System.out.println("One parameter: " + a);
    }

    public void display(int a, int b) {
        System.out.println("Two parameters: " + a + ", " + b);
    }

    public double display(double a) {
        System.out.println("One double parameter: " + a);
        return a * 2; // 演示返回类型不同的重载
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容