我有一个类:
public abstract class LogicGate extends JPanel implements PropertyChangeListener {
private Image image;
private URL url;
private OutputTerminal output;
private Terminal input0;
private Terminal input1;
public LogicGate(String fileName) {
this.url = getClass().getResource(fileName);
this.image = new javax.swing.ImageIcon(url).getImage();
this.setSize(image.getWidth(null), image.getHeight(null));
this.output = new OutputTerminal();
}
}
和一个子类:
public class ANDGate extends LogicGate {
private OutputTerminal output;
private Terminal input0;
private Terminal input1;
public ANDGate() {
super("images/AND.gif");
System.out.println(this.output);
}
}
然而,当我调用一个新的 ANDGate
对象时,output
为空,而此时它应该被分配(根据 super 构造函数)。
现在很明显,我在理解子类构造函数方面做了一个假设;我做错了什么?
最佳答案
这种情况叫做field hiding - 子类字段 output
正在“隐藏”父类(super class)中的同名字段。
你已经定义了
private OutputTerminal output;
在您的父类(super class)和您的子类中。子类中对 output
的引用将指向其字段,但您在父类(super class)中设置输出 - 子类字段将保持为空。
修复:
- 删除子类中
output
的声明 - 将父类(super class)中
output
的声明改为protected
(这样子类就可以访问了)
关于java - super 构造函数无法按我认为的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7357837/