Z
ZHANK
面向对象基础

方法详解

掌握方法定义、重载、参数传递、this 关键字

方法详解

方法是对象能执行的操作。Java 方法的特色是重载(同名不同参)、this(指向当前对象)、值传递(参数传递规则)。

学完本章你将: 掌握方法定义、重载、this、参数传递机制。


方法基本结构

java
// [访问修饰符] [static] 返回类型 方法名(参数...) { }
public class Calculator {
    public int add(int a, int b) { return a + b; }  // 实例方法,需要对象调用
    public static int multiply(int a, int b) { return a * b; } // static,类名直接调用
}

Calculator calc = new Calculator();
calc.add(3, 5);              // 实例方法:对象.方法()
Calculator.multiply(4, 5);   // static 方法:类名.方法()

方法重载 —— 同名不同参

同一个类中允许多个同名方法,只要参数列表不同(个数、类型或顺序)。返回值类型不同不算重载。这让 API 更直观——System.out.println() 能接收任何类型,就是靠重载。

java
public class Printer {
    public void print(int value)     { System.out.println("整数:" + value); }
    public void print(String value)  { System.out.println("字符串:" + value); }
    public void print(int a, int b)  { System.out.println("两个:" + a + ", " + b); }
}

Printer p = new Printer();
p.print(42);        // 匹配 print(int)
p.print("Hello");   // 匹配 print(String)
p.print(1, 2);      // 匹配 print(int, int)

this —— 当前对象的引用

this 指向调用方法的那个对象。最常见用途是区分成员变量和参数,以及链式调用。

java
public class Person {
    private String name;

    public Person(String name) {
        this.name = name; // this.name 是成员变量,name 是参数
    }

    public Person setName(String name) {
        this.name = name;
        return this; // 返回自己,支持链式调用
    }
}

new Person("Alice").setName("Bob"); // 链式

参数传递 —— Java 只有值传递

这一点经常被误解。Java 总是值传递,但传递引用类型时,传的是"引用的副本"——副本和原引用指向同一个对象,所以修改对象内容会影响外部。

java
// 基本类型:传值副本,不影响外部
void change(int x) { x = 100; }
int a = 10; change(a);
System.out.println(a); // 10(没变)

// 引用类型:传引用副本,指向同一对象,修改对象内容会影响外部
void change(int[] arr) { arr[0] = 100; }
int[] nums = {1, 2}; change(nums);
System.out.println(nums[0]); // 100(变了!因为改的是同一个对象的内容)

this 关键字

java
public class User {
    private String name;

    public User(String name) {
        this.name = name; // this 区分成员变量和参数
    }

    public User setName(String name) {
        this.name = name;
        return this; // 链式调用
    }
}

// 链式调用
User user = new User("Alice")
    .setName("Bob");

参数传递

java
// Java 只有值传递,但引用类型传递的是引用的副本
public static void change(int x) {
    x = 100; // 不影响外部
}

public static void change(int[] arr) {
    arr[0] = 100; // 影响外部!arr 指向同一对象
}

int num = 10;
change(num);
System.out.println(num); // 10(未改变)

int[] arr = {1, 2, 3};
change(arr);
System.out.println(arr[0]); // 100(已改变)