如何调用在另一个 class 中实例化的对象的方法?

How to call a method of an object that was instantiated in another class?

给定三个例子classes:

public class MainClass {
    public MainClass() {
        ArrayOfObjectA arrA = new ArrayOfObjectA();
    }
}

,

public class ArrayofObjectA {
    ...
    public void doSomething() {
        ...
    }
}

,以及

public class ObjectA {
    ...
    public void doThis() {
        arrA.doSomething(); // <-- Here's the issue
    }
}

如何从 arrA 调用 doSomething()

此外,arrA 包含一个 ObjectA 对象数组,使这个问题更加复杂。

我在 MainClass 中创建了 arrA 一个 class 对象,然后在其中有一个 getArrA() 方法,但我觉得有更好的解决方案。

ObjectA 需要 引用 arrA。通常这是通过将其作为参数传递给该函数来完成的:

public class ObjectA {
    ...
    public void doThis(ArrayofObjectA arrA) {
        arrA.doSomething(); // <-- Here's the issue
    }
}

通过这样做,您可以确保该函数的引用是 'in scope'。通常函数只能 'see' 传递给它们的参数和它们 class 的成员字段。所以,它可以调用 doSomething() 的另一种方式是如果 class 本身有一个引用:

public class ObjectA {
    private ArrayofObjectA arrA;

    public ObjectA(ArrayofObjectA a) {
      this.arrA = a; ///'this' is optional but makes it clear we are talking about a member field.
    }

    public void doThis(ArrayofObjectA arrA) {
        this.arrA.doSomething(); // <-- Here's the issue
    }
}

请注意,'reference' 本质上是一些句柄,允许您引用对象的特定实例。您需要 一个引用来调用任何非静态方法。有关这两者之间区别的更多信息,请参阅 this answer

另请注意,尽管将您的名称命名为 class ArrayofObjectA,但它实际上并不是一个数组。它只声明了一个实例(在您的 MainClass 中)并且它(当前)没有对任何 ObjectA 实例的引用。更恰当地说,您可以将其命名为 ArrayHolder:

public class ArrayHolder {
    private ObjectA[] arrA;//note that the [] indicates it's an array.

    public ArrayHolder() {
        this.arrA = new Object[10];//Length of ten
        for (int idx=0; idx<10; idx++) {
            this.arrA[idx] = new ObjectA(this);//pass new ObjectA a REFERENCE to 'this' object (ArrayHolder)
        }
    }

    public void doSomething() {
        //This is now callable from all ObjectA objects.
    }
}