【问题标题】:Call a method in another class within 3 classes in java在java中的3个类中调用另一个类中的方法
【发布时间】:2026-01-06 17:40:01
【问题描述】:

我在一个包中有 3 个课程。第一个类 (ClassStart) 分别生成其他 2 个类(ClassAClassB)的实例。我想通过其实例“a”调用ClassBClassA 的方法。
虽然实例“a”的范围是包(因为ClassStart 中的属性"ClassA a;""a.showText()" 不起作用。它收到错误消息"a cannot resolved"。 所以我尝试了"s.a.showText()",但它不起作用,因为实例“s”是在静态方法中生成的,我不知道如何访问“s”。

第一类(包含主方法):

public class ClassStart {
    ClassA a;

    public static void main(String[] args) {
    ClassStart s = new ClassStart();
    }

    public ClassStart() {
    a = new ClassA();
    ClassB b = new ClassB();
    }
}

第二课:

public class ClassA {

    public void showText() {
    System.out.println("This text comes from ClassA.");
    }
}

第三课:

public class ClassB {

    public ClassB() {
    a.showText();
    }
}

如何在 ClassB 中调用 ClassA 的方法“showText()”?
(我在这个论坛上找过答案,但是我没有找到像这样的三级问题的答案。)谢谢你的回答。

【问题讨论】:

  • 实例化ClassB 还是接收ClassB 作为参数?
  • aClassStart 的一个方法。 ClassB 没有任何东西(任何符号)是 a
  • @DaveNewton:我希望实例“a”在 ClassB 的范围内,而不接收“a”作为参数。
    @SJuan76:“a”不是 ClassStart 的方法,而是 ClassA 的一个实例。
  • 好吧,它不是那样工作的,但你现在已经知道了。

标签: java class call static-methods


【解决方案1】:

如果 ClassA 对象需要始终相同,则将其传递给 B:

public class ClassB {
   private ClassA a;

   // pass the ClassA reference into the ClassB constructor
   public ClassB(ClassA a) {
     this.a = a;   // assign it to the a field
     // a.showText();  // or you can do this if you need it called in the constructor
   }

   // or do this if you want the a method called in a ClassB method.
   public void callAShowText() {
     a.showText();
   }
}

然后:

public class ClassStart {
    ClassA a;

    public static void main(String[] args) {
       ClassStart s = new ClassStart();
    }

    public ClassStart() {
       a = new ClassA();  // create your ClassA instance
       ClassB b = new ClassB(a);  // pass it into your ClassB instance
       b.callAShowText();
    }
}

这里理解的关键是理解引用类型和引用变量。您希望 ClassB 中的引用变量引用在 ClassStart 中创建的 ClassA 对象。一种方法是在 ClassB 的构造函数或 setter 方法中将对象传递给 ClassB。完成后,ClassB 就有了它需要的引用,它可以调用实例上的任何 ClassA 方法。

请注意,您也可以通过创建和使用公共静态 ClassA 变量或公共静态 showText() 方法来“解决”此问题,但通常您会尽量避免这样做,因为在一个简单的示例中它可以正常工作像这样,它不能很好地“扩展”,这意味着如果通常在更大更复杂的程序中使用,它可能会增加复杂程序中的潜在连接,从而大大增加错误的风险。正是出于这个原因,为了降低复杂性和减少连接性(减少耦合),创建了面向对象的编程。

【讨论】:

  • 感谢您的详细解答。它工作得很好,我已经了解了一些关于引用变量(和类型)的相互关系。你的第二个解决方案(静态变量和方法)在这个简化的代码中工作,但我不能将它用于后面的真实应用程序,因为我需要一个与实例相关的方法(但你不知道这一点)。
【解决方案2】:

将方法设为静态:

public static void showText()

然后调用它:

ClassA.showText();

【讨论】:

    最近更新 更多