我正在尝试编写一个通用的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,但这不会发生:它会抛出Null Pointer Exc,因为它正在查找属于GeneralGUI的logTextArea,该对象尚未实例化。

1)为什么会这样?
2)如何达到目标效果?

谢谢!

编辑:
我尝试删除子类中的变量声明:由于它是我通过netbeans设计的GUI,因此netbeans不会让我删除该声明!

最佳答案

1)您已经回答了这个问题-父类的say()方法,它正在父类中声明它的logTextArea中寻找。您在子类中对该字段的重新声明会创建另一个字段,该字段对父类隐藏同名字段。

2)只需删除子类中另一个logTextArea的声明。

如果确实需要子类中具有相同名称的另一个字段,则可以通过super.logTextArea访问(隐藏)父字段。

07-24 21:18