java - super 构造函数无法按我认为的方式工作

标签 java oop constructor

我有一个类:

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/

相关文章:

c++ - C++中如何正确使用虚成员函数

java - 具有 'new' 的构造函数与使用 'this()' 的构造函数有何不同?

javascript - 为什么我的对象被声明但从未读取(在函数内)?

java - Apache DBCP 连接池与 Hibernate 错误 : Initial SessionFactory creation failed

java - 在 JOptionPane 中使用包含变量的字符串

java - pdfBox:如何从签名字段获取签名名称

javascript - 向 JavaScript 对象添加方法

java - 如何将枚举与 jpa 一起用作持久化实体的数据成员?

javascript - 将带参数的方法添加到 javascript 对象

java - java中的构造函数