Java 从其他类调用时的类层次结构方法
首先,这是一个相当基本的问题,但我似乎无法理解, 好的,这里是我的程序的概述Java 从其他类调用时的类层次结构方法,java,object,hierarchy,Java,Object,Hierarchy,首先,这是一个相当基本的问题,但我似乎无法理解, 好的,这里是我的程序的概述 |class A | |new B();| |new C();| / \ / \ |Class B | |Class C | |new D();| |method E(){}| | |Class D | |Invokes method E| 这是我的程序层次结构,我想从类
|class A |
|new B();|
|new C();|
/ \
/ \
|Class B | |Class C |
|new D();| |method E(){}|
|
|Class D |
|Invokes method E|
这是我的程序层次结构,我想从类D调用非静态方法E,而不创建类C的新实例,有没有办法做到这一点,或者我必须重新构造我的类层次结构
**编辑:**以下是显示我的问题的真实代码(尽管没有B类):
我想通过单击按钮调用changeText方法如果没有实例,则无法调用非静态方法。这是“不可谈判的”
你必须重新修改你的类结构。你可以使用构造函数或setter将
C
类注入D
。
这是一个构造函数注入的示例
class A {
A() {
C c = new C();
B b = new B(c);
}
}
class B {
B(C c) {
D d = new D(C c);
}
}
class D {
private C c;
D(C c) {
this.c = c;
}
public void methodThatCallsE() {
c.E();
}
}
这样,您就可以调用方法E
,而不必在D
中创建C
的对象
您可以修改ChangeButton
类以接收任何JLabel
对象
public class ChangeButton extends JButton {
private JLabel jlabel;
public ChangeButton(JLabel jlabel){
this.jlabel = jlabel;
setText("Click to change Label");
addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
jlabel.setText("new Text");
}
});
}
}
然后,框架
类将如下所示
public class TheFrame extends JFrame{
public TheFrame(){
setTitle("Suduku Solver");
JLabel jlabel = new TextLabel();
add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
jlabel, new ChangeButton(jlabel)));
...
您的ascii图表不清楚。您可以发布实际代码吗?您可以将
C
类的实例从A
传递到B
类。然后,将此实例传递给D
类,并在D
类中调用方法E
,而无需在D
类中创建实例。是的,这是一种方法,但我正在寻找一种更简单的方法,而不是对这一行add(new JSplitPane)进行长链的引用(JSplitPane.HORIZONTAL_SPLIT,new textlab(),new ChangeButton());
。我认为您需要以某种方式将new textlab()
对象传递给new ChangeButton()
对象。为什么不将其传递到ChangeButton
构造函数中?
public class TheFrame extends JFrame{
public TheFrame(){
setTitle("Suduku Solver");
JLabel jlabel = new TextLabel();
add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
jlabel, new ChangeButton(jlabel)));
...