超级构造函数不工作我认为它应该如何

时间:2011-09-09 06:21:56

标签: 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为空,应该已经分配(根据超级构造函数)。

现在很明显我在理解子类化构造函数时做了一个假设;我做错了什么?

3 个答案:

答案 0 :(得分:7)

这种情况称为field hiding - 子类字段output正在“隐藏”超类中相同名称的字段。

您已定义

private OutputTerminal output;

在你的超类你的子类中。子类中对output的引用将是其字段,但是您在超类中设置输出 - 子类字段将保持为空。

修复:

  • 删除子类中的output声明
  • 将超类中output的声明更改为protected(因此子类可以访问它)

答案 1 :(得分:3)

两个输出变量都是本地每个类 他们指的是两个不同的成员。

你宁愿删除

private OutputTerminal output;

来自class ANDGate,只需使用

即可
System.out.println(output);

private OutputTerminal output;
超级课程中的

protected

答案 2 :(得分:1)

您可以将超类中的类变量设置为protected并在system.out.println()行中使用'super'关键字而不是'this'。

您的示例代码。

//superclass
class A {
protected int a;

public A(){
    a=50;
}
}

//sublcass
class B extends A{

private int a;

public B(){
    super();
    System.out.println(super.a);
}

}