我有一个班级:
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
为空,应该已经分配(根据超级构造函数)。
现在很明显我在理解子类化构造函数时做了一个假设;我做错了什么?
答案 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);
}
}