java组成

时间:2014-03-16 13:04:15

标签: java oop

我试图使用和学习组合关于OOP编程灵活性的类之间的关系,这是一个小样本代码,解释了我尝试的内容做:

主要课程:

public class MainFrame extends JFrame {

private Test test;
public static void main(String[] args) {
    new MainFrame();    
  }

public MainFrame() {
    initFrame();
    }  

private void initFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(100,100);
    setResizable(false);
    setUndecorated(true);
    setVisible(true);
    setLocationRelativeTo(null);
    test.update();

    }
    public void setNumber(int i) {
    System.out.println(i);
    }
}

和这堂课:

public class Test {
MainFrame mainFrame;
public void update(){
    mainFrame.setNumber(10);
  }

}

如果我运行这个我会得到:

  

线程中的异常" main"显示java.lang.NullPointerException

如何更改代码以便:

  • Test类仅指MainFrame中创建的main实例,而不是在{{1}内创建MainFrame的新实例} class

  • 可以避免使用静态类和静态函数来做到这一点吗?

3 个答案:

答案 0 :(得分:2)

  

Test类仅指在。中创建的MainFrame实例   main,而不是在Test中创建MainFrame的新实例   类

对不起,这没有任何意义。这不是Java的工作方式,而运行时正在教育你。

此代码从上到下是错误的。

Test类中的实例为null,因为您从未初始化它。

Test类对MainFrame类中的main方法一无所知,也不应该。

一旦方法退出并且被垃圾收集,该main方法中的实例就会超出范围。

为什么MainFrame类会引用其中的Test实例?糟糕的设计。它被称为circular dependency。添加后,您永远不能将这两个类分开。有时它们无法得到帮助,但我认为没有理由这样做,特别是对于一个名为Test的班级。 Test可以了解MainFrame,但MainFrame不需要了解Test。你做错了。

您无需延长JFrame。您没有通过扩展添加任何内容。我敢打赌,这应该是JPanel,您将添加到JFrame

答案 1 :(得分:2)

而不是建议设计,我只是想办法实现它。

public class MainFrame extends JFrame {

    private Test test;

    public void setTest(Test test) {
        this.test = test;
    }
}

public class Test {
    MainFrame mainFrame;

    public Test(MainFrame mainFrame) {
        this.mainFrame = mainFrame;
        this.mainFrame.setTest(this);
    }
}
祝你好运。

答案 2 :(得分:1)

快速修复NullPointerExceptions:

public class Test {
MainFrame mainFrame;
public void update(){
    mainFrame.setNumber(10);
}
public void setMainFrame(MainFrame mainFrame) {
    this.mainFrame = maninFrame;
}

initFrame()

test = new Test();
test.setMainFrame(this);
test.update();

否则我同意,你正在尝试的概念有很多误解。尝试将TestMainFrame逻辑分开。