这似乎是一个愚蠢的问题,但是对象是否可以从实例化它的对象调用方法?
具体来说,如果我有一个扩展 JFrame 以提供 GUI 的类 A 和具有各种组件的 JPanel 类型的 B 类和 C 类,则 A 类对象在 B 和 C 之间变化以向用户显示不同的内容。B类的对象是否可以调用A类的方法而不在B内部创建另一个A类对象但调用里面有B的上层A对象?
这似乎是一个愚蠢的问题,但是对象是否可以从实例化它的对象调用方法?
具体来说,如果我有一个扩展 JFrame 以提供 GUI 的类 A 和具有各种组件的 JPanel 类型的 B 类和 C 类,则 A 类对象在 B 和 C 之间变化以向用户显示不同的内容。B类的对象是否可以调用A类的方法而不在B内部创建另一个A类对象但调用里面有B的上层A对象?
看起来你需要这样的东西。
class A {
private B b;
public void method() {
b = new B(this);
}
}
class B {
private A a;
public B(A a) {
this.a = a;
}
void callAMethod() {
a.method();
}
}
}
我看到的最简单的方法是将 A 传递给 B 和 C,或者通过参数或对 B/C 的扩展,该扩展包含一个 A 实例并具有一个设置器。
您可以尝试放置对在其中创建 B 或/和 C 对象的 A 对象的引用,例如通过使用 setter 或将它们作为构造函数参数传递。
class A extends JFrame{
void someMethod(){System.out.println("methods body");}
public static void main(String[] args) {
A a=new A();
B b=new B();
b.setCreator(a);
b.test();
}
}
class B extends JPanel{
private A creator;
public void setCreator(A creator) {
this.creator = creator;
}
void test(){
creator.someMethod();
}
}
还要考虑在 Swing 框架中存在不同的方法来获取组件的层次结构,例如 getParent()或getRoot()。
最好的解决方案是让执行实例化的代码将自身的引用传递给它正在创建/已创建的对象。
理论上,一个对象可以找出哪个类创建了它(通过创建一个Exception
并查看它的堆栈跟踪)......但是在执行的应用程序中没有办法找出创建实例。