在 java 的 3 class 秒内调用另一个 class 的方法

Call a method in another class within 3 classes in java

我有 3 个 classes 在一个包裹里。第一个 class (ClassStart) 生成另外两个 classes(ClassAClassB)的每个实例。我想通过其实例 "a".
ClassB 中调用 ClassA 的方法 尽管实例 "a" 的范围是包(由于 ClassStart 中的属性 "ClassA a;",行 "a.showText()" 不起作用。它得到错误消息 "a cannot resolved". 所以我尝试了 "s.a.showText()" 但它不起作用,因为实例 "s" 是在静态方法中生成的,我不知道如何访问 "s".

第一个class(包含主要方法):

public class ClassStart {
    ClassA a;

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

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

第二个class:

public class ClassA {

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

第三个class:

public class ClassB {

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

如何在ClassB中调用ClassA的方法"showText()"?
(我曾在这个论坛中寻找答案,但我没有找到像这样的三个 class 问题的答案。)谢谢你的回答。

如果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 对象。一种方法是在其构造函数或 setter 方法中将对象传递给 ClassB。一旦你这样做了,ClassB 就会有它需要的引用,它可以调用实例上的任何 ClassA 方法。

请注意,您也可以 "solve" 通过创建和使用 public 静态 ClassA 变量或 public 静态 showText() 方法,但通常您会尝试避免这样做,因为虽然它在像这样的简单示例中可以正常工作,但它并不 "scale" 很好,这意味着如果在更大更复杂的程序中普遍使用,它将冒着增加复杂程序中潜在连接的风险,大大增加了错误的风险。正是出于这个原因,为了降低复杂性和减少连通性(减少耦合),创建了面向对象的编程。

使方法静态化:

public static void showText()

然后调用它:

ClassA.showText();