Я могу создать объект класса, даже если он дает ошибку компиляции в Java - PullRequest
0 голосов
/ 26 июня 2018

Сегодня я столкнулся со сценарием, в котором я не переопределил все методы интерфейса в дочернем классе. Однако когда я попытался создать объект дочернего класса, он все равно работал нормально. Пока я предполагаю, что мы не можем создавать объекты, пока не будут устранены все ошибки компиляции.

Пожалуйста, пролите немного света на это.

Пример, который я взял.

interface Parent {
   public void test();
}

class Child implements Parent {
   public void print() {
      System.out.println("Didn't expect to print");
   }
}

Класс Child давал мне ошибку во время компиляции с просьбой переопределить методы из интерфейса. Игнорируя ошибку, когда я попытался создать объект, как показано ниже, и выполнить следующий оператор, он дал мне вывод, как показано внизу.

Child child = new Child();
child.print();

Выход:

Didn't expect to print

П.С .: Я пробовал это на Java 7

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

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Если по какой-либо причине у вас есть два класса с одинаковым именем и пакетом в пути к классам, Java ищет первый и находит его и использует его. Поэтому, если там уже есть другая версия вашего Parent.class без добавленной функции, ее можно выбрать поверх новой.

0 голосов
/ 26 июня 2018

Я просто сделал следующее, чтобы воспроизвести это условие (из командной строки, чтобы не происходили изменения IDE):

  1. Создание родительского интерфейса без объявления метода test.
  2. Создайте класс Child, который реализует Parent.
  3. Создайте класс Driver с помощью метода main, который создает экземпляр объекта Child и вызывает print.
  4. Скомпилируйте все без ошибок.

Все работает, как и ожидалось.

Затем я добавил объявление метода test в интерфейс Parent, попытался скомпилировать класс Child и получил ожидаемое сообщение об ошибке:

Child не является абстрактным и не переопределяет абстрактный метод test () в Parent

Я получаю ту же ошибку, если пытаюсь скомпилировать класс Driver.

Но когда я проверяю свою файловую систему, старый файл Child.class все еще там, и программа Driver, которая использует его, все еще работает нормально. Это устаревшие копии файлов классов, которые не были заменены или удалены при повторной компиляции. Типичная сборка очищает их перед компиляцией, гарантируя, что устаревшие классы не будут частью нового дистрибутива.

0 голосов
/ 26 июня 2018

Это возможно только в том случае, если ваша IDE кэшировала класс Child до того, как вы добавили Parent в качестве суперкласса. В противном случае это не скомпилируется вообще.

...