杰瑞科技汇

Java如何调用另一个类的方法?

核心思想

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

Java如何调用另一个类的方法?-图1
(图片来源网络,侵删)
  1. 创建对象(实例化):如果被调用的方法是非静态的,你必须先创建该类的对象(实例),对象就像是一个蓝图的具体产物,你可以通过这个对象来访问它的方法和变量。
  2. 使用对象名和点操作符():通过 对象名.方法名() 的语法来调用方法。
  3. 传递参数(如果需要):如果方法定义了参数,调用时必须传入相应类型和数量的参数。

调用同一个包下非静态方法(最常见)

这是最基本的情况,假设有两个类 AB,它们在同一个包(文件夹)下,A 想调用 B 的一个非静态方法。

步骤:

  1. 在类 A 中,创建类 B 的一个对象。
  2. 使用这个对象来调用 B 的方法。

代码示例:

文件:Calculator.java

Java如何调用另一个类的方法?-图2
(图片来源网络,侵删)
// 这是一个简单的计算器类
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
    }
}

执行流程:

  1. main 方法开始执行。
  2. Calculator calc = new Calculator(); 创建了一个 Calculator 对象,并将其赋值给 calc 变量。
  3. calc.add(10, 20); 通过 calc 这个引用,找到了内存中的 Calculator 对象,并调用了它的 add 方法,传入了 1020
  4. add 方法执行完毕,返回结果 30
  5. main 方法将返回值 30 存储在 sum 变量中并打印。

调用同一个包下静态方法

如果一个方法被 static 关键字修饰,它就属于类级别的方法,而不是对象级别的方法,这意味着你不需要创建对象就可以直接调用它。

如何识别静态方法? 静态方法通常用于执行与类本身相关,但不依赖于任何特定对象状态的操作,工具类中的方法。

Java如何调用另一个类的方法?-图3
(图片来源网络,侵删)

代码示例:

文件: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 语句。

步骤:

  1. 在调用类(Main.java)的文件顶部,使用 import 语句导入目标类(com.example.model.Student)。
  2. 然后按照场景一或场景二的方式进行调用。

项目结构:

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);

重要提示:

  1. 访问修饰符:确保你想要调用的方法是 public 的,如果它是 privateprotected,你只能在同一个类或同一个包/子类中访问它。
  2. 参数匹配:调用方法时传入的参数数量、类型和顺序必须与方法签名完全匹配。
  3. null 指针异常:如果你尝试在一个为 null 的对象上调用方法(Calculator calc = null; calc.add(1, 2);),程序会抛出 NullPointerException 异常,在调用前确保对象已经被正确初始化。
  4. 静态 vs. 非静态:一个简单的判断标准:如果这个方法的行为依赖于对象内部的数据(成员变量),那么它应该是非静态的,如果它只是一个独立的功能,不依赖任何对象状态,那么它应该是静态的。 Cardrive() 方法是非静态的,因为它依赖于 Car 对象的当前状态(如油量),而 Mathsqrt() 方法是静态的,因为它只根据输入计算一个值,不依赖任何 Math 对象的状态。
分享:
扫描分享到社交APP
上一篇
下一篇