我正在尝试编写一个通用GUI类,其中包含所有不同和更具体的GUI使用的主要方法。
public class GeneralGUI extends javax.swing.JFrame {
protected javax.swing.JTextArea logTextArea;
protected void say(String s) {
logTextArea.append(s + "\n");
}
}
子类包含:
public class SpecificGUI extends GeneralGUI {
protected javax.swing.JTextArea logTextArea;
[...]
private void initComponents() {
[...]
logTextArea = new javax.swing.JTextArea();
}
}
我想要的是当我打电话时
SpecificGUI myGUI = new SpecificGUI();
myGUI.say("Ciao!");
"Ciao!"
字符串附加到myGUI.logTextArea
,但这不会发生:它会抛出空指针Exc,因为它正在寻找属于GeneralGUI的logTextArea
- 一个尚未实例化的对象。
1)为什么会这样? 2)如何实现desider结果?
谢谢!
编辑: 我已经尝试删除子类中的变量声明:因为它是我通过netbeans设计的GUI,netbeans不会让我删除声明!
答案 0 :(得分:1)
你不需要定义
protected javax.swing.JTextArea logTextArea
两次。
将其定义为父类的受保护字段意味着所有固有类都可以访问此字段。
继承的工作原理如下:
1)从子类B调用父方法foo()。
2)如果子类有方法foo(),则调用它
3)如果child没有方法foo查找方法foo()的继承链并调用它
4)说父类A中的方法foo()使用字段x,它只能访问字段x,如果A或任何超类都有它。答案 1 :(得分:1)
1)您已经回答了问题 - 父类的say()
方法正在父类中寻找logTextArea
,并在其中声明它。您在子类中重新声明字段会创建另一个字段,该字段隐藏父类中的同名字段。
2)只需删除子类中另一个logTextArea
的声明。
如果您确实需要具有相同名称的子类中的另一个字段,则可以通过super.logTextArea
访问(隐藏)父字段。
答案 2 :(得分:1)
1-logTextArea没有被实例化,这就是为什么你要获得NPE。 2 - 您必须决定将logTextArea作为类属性的位置。我认为将它保留在两个类中没有任何意义,否则尝试并实例化generalGUI类的logTextArea。
答案 3 :(得分:1)
protected javax.swing.JTextArea logTextArea
隐藏父类 GeneralGUI 的成员变量,并且您没有任何内容初始化logTextArea,因此它仍然 Null 这就是为什么 NullPointerEception 即可。您应该从 SpecificGUI 类中删除成员变量 logTextArea
答案 4 :(得分:0)
请删除子类中受保护的javax.swing.JTextArea logTextArea。
接下来,在您父母受保护的javax.swing.JTextArea中,logTextArea未定义且为null,它是一个对象,可能需要在追加之前启动。请检查。