Являются ли конструкторы необязательными в Java или как? - PullRequest
2 голосов
/ 28 сентября 2010

Я программист на C # и пытаюсь взломать Java-проект. Вот анонимная выдержка из нашего производственного кода. Это работает (я думаю). Обратите внимание, что - это весь класс.

public class Y extends X
{
  public Z m_Z;

  protected void readCustomData (CustomStream reader, boolean forUpdate)
    throws IOException, FTGException
  {
    super.readCustomData (reader, forUpdate) ;
    m_Z.readBinaryData (reader, forUpdate) ;
  }

  protected void writeCustomData (CustomStream writer, int original)
    throws IOException, FTGException
  {
    super.writeCustomData (writer, original) ;
    m_Z.writeBinaryData (writer, original) ;
  }
}

Что меня озадачивает - где инициализируется m_Z? Я не могу найти его во всей кодовой базе. Так почему же методы readCustomData и writeCustomData не работают с NullReferenceException - или что-то подобное в Java? m_Z как-то автоматически конструируется вместе с Y? Или я что-то пропустил, и в кодовой базе есть какая-то более глубокая магия, которая его инициализирует?

Ответы [ 5 ]

12 голосов
/ 28 сентября 2010

Когда класс Java не объявляет конструктор, компилятор неявно добавляет конструктор без аргументов, который ничего не делает, кроме как вызывает конструктор суперкласса без аргументов (если его нет, будет ошибка компилятора).*

Однако в вашем примере поле m_Z будет нулевым.Если вызовы этого метода успешны, тогда поле должно быть установлено в другом месте.В конце концов, это публично (очень плохая практика).

0 голосов
/ 28 сентября 2010

В данном коде m_Z никогда не инициализируется, поэтому оно равно нулю. Но к нему можно получить доступ с внешней стороны (общедоступной), поэтому значение можно установить с помощью y.m_Z = ....

0 голосов
/ 28 сентября 2010

Если у вас нет конструктора, java создает конструктор по умолчанию для вас.Все члены инициализируются с заданным значением или, если значение не указано, с null.Это означает, что если ваш элемент m_Z установлен, он был установлен откуда-то еще (это открытый член), потому что конструктор по умолчанию инициализировал m_Z с нулем;

0 голосов
/ 28 сентября 2010

m_Z переменная public. Есть ли вероятность, что кто-то извне это установит? Хотя это довольно плохая практика ...

0 голосов
/ 28 сентября 2010

m_Z является общедоступным, поэтому его можно инициализировать вне класса:

Y y = new Y();
y.m_Z = new Z();
y.readCustomData(...);

Будет работать нормально.

Хотя ужасный код.

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