java继承:在父方法中编写使用子变量的代码

时间:2014-10-30 10:56:20

标签: java swing inheritance nullpointerexception

我正在尝试编写一个通用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不会让我删除声明!

5 个答案:

答案 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,它是一个对象,可能需要在追加之前启动。请检查。