方法详解
掌握方法定义、重载、参数传递、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(已改变)