我试图使用和学习组合关于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
可以避免使用静态类和静态函数来做到这一点吗?
答案 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();
否则我同意,你正在尝试的概念有很多误解。尝试将Test
和MainFrame
逻辑分开。