Супер конструктор не работает так, как я думаю - PullRequest
1 голос
/ 09 сентября 2011

У меня есть класс:

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 ]

7 голосов
/ 09 сентября 2011

Эта ситуация называется скрытие поля - поле подкласса output "скрывает" одноименное поле в суперклассе.

Вы определили

private OutputTerminal output;

в вашем суперклассе и в вашем подклассе.Ссылки на output в подклассе будут относиться к его полю, но вы устанавливаете вывод в суперклассе - поле подкласса останется нулевым.

Исправить:

  • удалить объявление output в подклассе
  • изменить объявление output в суперклассе на protected (чтобы подкласс мог получить к нему доступ)
3 голосов
/ 09 сентября 2011

Обе выходные переменные являются локальными для каждого класса они относятся к двум разным членам.

вы скорее удалите

private OutputTerminal output;

из class ANDGate и просто используйте

System.out.println(output);

Make

private OutputTerminal output;

protected в суперклассе.

1 голос
/ 09 сентября 2011

Вы можете сделать переменную класса в суперклассе защищенной и использовать ключевое слово 'super' вместо 'this' в строке system.out.println ().

Пример кода для вас.

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...