2011-09-09 29 views
1

我有一个类:超级构造函数不能正常工作如何,我认为它应该

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为空,当它应该已经分配了(按照超级构造函数)。

现在很清楚,我在理解子类的构造函数时做了一个假设;我究竟做错了什么?

回答

7

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

你同时在你的超类你的子类中定义

private OutputTerminal output; 

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

要解决:

  • 删除output声明在子类中
  • 变化output在超类中声明protected(这样子类可以访问它)
+0

那么这一切固定。感谢:D –

3

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

你而从class ANDGate删除

private OutputTerminal output; 

,并简单地使用

System.out.println(output); 

private OutputTerminal output; 

protected超类。

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); 
} 

}

相关问题