如何调用在另一个 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.
}
}
给定三个例子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.
}
}