[英]java, inheritance — private field in parent is accessed through a public method in child
[英]java inheritance: in the parent method write code that uses child variable
我正在尝试编写一个通用的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指针Exc,因为它正在查找属于logTextArea
一个尚未实例化的对象。
1)为什么会这样? 2)如何获得目标结果?
谢谢!
编辑:我试图删除子类中的变量声明:作为通过netbeans设计的GUI,netbeans不会让我删除该声明!
您不需要定义
protected javax.swing.JTextArea logTextArea
两次。
将其定义为父类的受保护字段意味着所有inreting类都可以访问此字段。
继承是这样的:
1)您从子类B调用父方法foo()。
2)如果子类具有方法foo(),则将其调用
3)如果child没有方法foo,则查找方法foo()的继承链并调用它
4)说父类A中的方法foo()使用字段x,只有在A或任何超类拥有它的情况下,它才能访问字段x。
1)您已经回答了这个问题—父类的say()
方法,它正在父类中声明该对象的logTextArea
查找。 您在子类中对该字段的重新声明将创建另一个字段,该字段对父类隐藏同名字段。
2)只需删除子类中另一个logTextArea
的声明logTextArea
。
如果您确实需要子类中具有相同名称的另一个字段,则可以通过super.logTextArea
访问(隐藏)父字段。
1-logTextArea没有得到实例化,这就是为什么要获得NPE的原因。 2-您必须确定要将logTextArea作为类属性的位置。我认为将其保留在两个类中没有任何意义,否则请尝试实例化generalGUI类的logTextArea。
protected javax.swing.JTextArea logTextArea
隐藏父类GeneralGUI的成员变量,所以它仍然是零 ,这就是为什么你有NullPointerEception你还没有初始化没有logTextArea。 您应该只从SpecificGUI类中删除成员变量logTextArea
请在子类中删除受保护的javax.swing.JTextArea logTextArea。
接下来,在父级受保护的javax.swing.JTextArea中,logTextArea未定义且为null,它是一个对象,可能需要在追加之前启动。 请检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.