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)));
...