Java 方法与函数
方法(Method)是一段可重用的代码块,它执行一个特定的任务。方法也被称为函数(Function)。将代码组织成方法可以提高代码的可读性、可维护性,并实现代码复用。
什么是方法?
在面向对象的编程中,方法定义了对象的行为。例如,一个 Calculator 对象可能有一个 add() 方法来执行加法运算。
定义方法
一个完整的方法定义包括:
- 修饰符 (Modifier): 如
public,static。public表示该方法可以被任何类访问。static表示该方法属于类本身,而不是类的某个特定对象。 - 返回类型 (Return Type): 方法执行完毕后返回的数据的类型。如果方法不返回任何值,使用
void。 - 方法名 (Method Name): 方法的名称,遵循驼峰命名法(camelCase)。
- 参数列表 (Parameter List): 在括号内声明的变量列表,用于接收调用时传递给方法的值。如果方法不需要参数,括号内留空。
- 方法体 (Method Body): 包含在花括号
{}内的具体代码。
语法:
java
modifier returnType methodName(parameter1Type parameter1Name, ...) {
// 方法体
// ...
return value; // 如果返回类型不是 void
}示例:
java
public class Calculator {
// 定义一个加法方法
// public: 修饰符
// int: 返回类型
// add: 方法名
// (int a, int b): 参数列表
public int add(int a, int b) {
int sum = a + b;
return sum; // 返回计算结果
}
// 定义一个不返回任何值的方法
public void printWelcomeMessage() {
System.out.println("欢迎使用计算器!");
}
}调用方法
要执行一个方法,你需要“调用”它。
- 如果是实例方法(没有
static关键字),你需要先创建类的对象,然后通过对象调用。 - 如果是静态方法(有
static关键字),你可以直接通过类名调用。
java
public class Main {
public static void main(String[] args) {
// 调用实例方法
Calculator myCalculator = new Calculator(); // 创建对象
myCalculator.printWelcomeMessage(); // 通过对象调用 void 方法
int result = myCalculator.add(10, 20); // 调用带返回值的方法
System.out.println("10 + 20 = " + result); // 输出: 30
// 调用静态方法 (例如 Math.max)
int maxNumber = Math.max(5, 8); // 直接通过类名调用
System.out.println("最大值是: " + maxNumber);
}
}参数 (Parameters) vs. 实参 (Arguments)
- 参数 (Parameter): 在方法定义中声明的变量,如
add(int a, int b)中的a和b。 - 实参 (Argument): 在调用方法时传递给方法的实际值,如
myCalculator.add(10, 20)中的10和20。
方法重载 (Method Overloading)
方法重载允许在一个类中定义多个同名的方法,只要它们的参数列表不同(参数的数量、类型或顺序不同)。编译器会根据您传递的实参来决定调用哪个版本的方法。
java
public class Greeter {
public void sayHello() {
System.out.println("Hello!");
}
public void sayHello(String name) {
System.out.println("Hello, " + name + "!");
}
public void sayHello(String name, int times) {
for (int i = 0; i < times; i++) {
System.out.println("Hello, " + name + "!");
}
}
}static 关键字
- 静态方法 (
staticmethod): 属于类本身,不依赖于任何对象实例。可以直接通过类名调用。main方法就是一个典型的静态方法。 - 实例方法 (Instance method): 属于类的对象。必须通过类的实例来调用。它可以访问该对象的实例变量。
Java 的值传递 (Pass-by-Value)
这是一个非常重要的概念:Java 总是按值传递参数的。
对于基本类型: 方法接收的是实参值的一个副本。在方法内修改参数,不会影响到原始的实参变量。
javapublic void changeValue(int x) { x = 20; // 修改的是副本 x } int original = 10; changeValue(original); // 传递的是 10 这个值的副本 // original 的值仍然是 10对于引用类型 (对象): 方法接收的是对象引用的一个副本。这个副本和原始引用指向堆内存中同一个对象。因此,如果在方法内部通过这个引用副本修改了对象的状态(即对象的实例变量),这个修改是会反映到原始对象上的。但是,如果在方法内让参数引用指向一个新对象,原始的引用不会受影响。
javaclass MyData { int value; } public void changeObject(MyData data) { data.value = 99; // 修改了堆中同一个对象的内容 } MyData myData = new MyData(); myData.value = 1; changeObject(myData); // 传递的是引用的副本,但指向同一个对象 // myData.value 现在是 99