核心思想
调用另一个类的方法,本质上遵循三个步骤:

- 创建对象(实例化):如果被调用的方法是非静态的,你必须先创建该类的对象(实例),对象就像是一个蓝图的具体产物,你可以通过这个对象来访问它的方法和变量。
- 使用对象名和点操作符():通过
对象名.方法名()的语法来调用方法。 - 传递参数(如果需要):如果方法定义了参数,调用时必须传入相应类型和数量的参数。
调用同一个包下非静态方法(最常见)
这是最基本的情况,假设有两个类 A 和 B,它们在同一个包(文件夹)下,A 想调用 B 的一个非静态方法。
步骤:
- 在类
A中,创建类B的一个对象。 - 使用这个对象来调用
B的方法。
代码示例:
文件:Calculator.java

// 这是一个简单的计算器类
public class Calculator {
// 这是一个非静态方法,用于计算两个数的和
// 它需要两个整数作为参数,并返回它们的和
public int add(int a, int b) {
System.out.println("Calculator.add() 方法被调用了!");
return a + b;
}
}
文件:Main.java
public class Main {
public static void main(String[] args) {
// 1. 创建 Calculator 类的对象
// new Calculator() 会在内存中创建一个 Calculator 实例
// calc 是这个对象的引用(可以理解为对象的名字)
Calculator calc = new Calculator();
// 2. 使用对象 calc 调用 Calculator 类的 add() 方法
// 3. 传递参数 10 和 20
int sum = calc.add(10, 20);
// 打印结果
System.out.println("计算结果是: " + sum); // 输出: 计算结果是: 30
}
}
执行流程:
main方法开始执行。Calculator calc = new Calculator();创建了一个Calculator对象,并将其赋值给calc变量。calc.add(10, 20);通过calc这个引用,找到了内存中的Calculator对象,并调用了它的add方法,传入了10和20。add方法执行完毕,返回结果30。main方法将返回值30存储在sum变量中并打印。
调用同一个包下静态方法
如果一个方法被 static 关键字修饰,它就属于类级别的方法,而不是对象级别的方法,这意味着你不需要创建对象就可以直接调用它。
如何识别静态方法? 静态方法通常用于执行与类本身相关,但不依赖于任何特定对象状态的操作,工具类中的方法。

代码示例:
文件:ArrayUtils.java
public class ArrayUtils {
// 这是一个静态方法,用于打印数组中的所有元素
// 因为它不依赖于任何 ArrayUtils 的对象实例,所以可以声明为 static
public static void printArray(int[] array) {
System.out.print("[ ");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]);
if (i < array.length - 1) {
System.out.print(", ");
}
}
System.out.println(" ]");
}
}
文件:Main.java
public class Main {
public static void main(String[] args) {
int[] myArray = {1, 2, 3, 4, 5};
// 调用静态方法
// 直接使用 类名.方法名() 的方式,不需要创建对象
ArrayUtils.printArray(myArray);
// 你也可以通过对象来调用,但不推荐,这会造成混淆
// ArrayUtils utils = new ArrayUtils();
// utils.printArray(myArray);
}
}
输出:
[ 1, 2, 3, 4, 5 ]
调用不同包下的方法
如果两个类在不同的包(文件夹)下,调用方式基本相同,但需要加上 import 语句。
步骤:
- 在调用类(
Main.java)的文件顶部,使用import语句导入目标类(com.example.model.Student)。 - 然后按照场景一或场景二的方式进行调用。
项目结构:
src/
├── com/
│ └── example/
│ ├── Main.java
│ └── model/
│ └── Student.java
文件:com/example/model/Student.java
package com.example.model;
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("你好,我是 " + this.name + "!");
}
}
文件:com/example/Main.java
package com.example;
// 1. 导入 Student 类
import com.example.model.Student;
public class Main {
public static void main(String[] args) {
// 2. 创建 Student 对象
Student student = new Student("张三");
// 3. 调用方法
student.sayHello(); // 输出: 你好,我是 张三!
}
}
调用方法并处理返回值
很多时候,被调用的方法会返回一个值,你需要用一个变量来接收这个返回值。
代码示例:
文件:MessageGenerator.java
public class MessageGenerator {
public String generateWelcomeMessage(String userName) {
return "欢迎, " + userName + "!";
}
}
文件:Main.java
public class Main {
public static void main(String[] args) {
MessageGenerator generator = new MessageGenerator();
// 调用方法,并用 message 变量接收返回的字符串
String message = generator.generateWelcomeMessage("李四");
System.out.println(message); // 输出: 欢迎, 李四!
}
}
总结与最佳实践
| 方法类型 | 调用方式 | 是否需要创建对象? | 例子 |
|---|---|---|---|
| 非静态方法 (Instance Method) | 对象名.方法名() |
是 | calc.add(10, 20); |
| 静态方法 (Static Method) | 类名.方法名() |
否 | Math.max(10, 20); |
| 跨包调用 | import + 类名.方法名() 或 对象名.方法名() |
根据方法类型决定 | ArrayUtils.printArray(arr); |
重要提示:
- 访问修饰符:确保你想要调用的方法是
public的,如果它是private或protected,你只能在同一个类或同一个包/子类中访问它。 - 参数匹配:调用方法时传入的参数数量、类型和顺序必须与方法签名完全匹配。
null指针异常:如果你尝试在一个为null的对象上调用方法(Calculator calc = null; calc.add(1, 2);),程序会抛出NullPointerException异常,在调用前确保对象已经被正确初始化。- 静态 vs. 非静态:一个简单的判断标准:如果这个方法的行为依赖于对象内部的数据(成员变量),那么它应该是非静态的,如果它只是一个独立的功能,不依赖任何对象状态,那么它应该是静态的。
Car的drive()方法是非静态的,因为它依赖于Car对象的当前状态(如油量),而Math的sqrt()方法是静态的,因为它只根据输入计算一个值,不依赖任何Math对象的状态。
