Статьи

Возможно ли иметь абстрактный метод в последнем классе?

Это один из интересных ключевых вопросов Java, который недавно был задан одному из моих читателей во время телефонного интервью для собеседования для разработчиков Java. Хотя он знает, что ты
не может сделать абстрактный класс окончательным в Java , его смутила формулировка методов. Ответ прост: нет, в финальном классе на Java невозможно иметь абстрактный метод. Почему? потому что как только вы объявляете абстрактный метод в классе Java, класс автоматически становится абстрактным классом, и вы не можете сделать абстрактный класс окончательным в Java, как обсуждалось ранее, поэтому невозможно иметь абстрактный метод в конечном классе в Java ,

Многие программисты на Java путаются в этом вопросе только из-за формулировки вопроса, как я уже сказал, даже читатель, которому задавали этот вопрос, был знаком с концепцией, он не осознавал, что, как только вы объявите абстрактный метод в класс, он станет абстрактным классом, и сделать абстрактный класс в Java невозможно.

Это недостающая часть информации, или вы называете ее уловкой, которая отделяет ее от более популярных и часто задаваемых вопросов. Можете ли вы объявить класс как абстрактный и окончательный в Java ?

Давайте рассмотрим один пример кода, чтобы доказать, что вы не можете объявить абстрактный метод в конечном классе. У нас есть открытый финальный класс с именем Hello, который имеет абстрактный метод print () в
Файл Hello.java

1
2
3
4
5
public final class Hello {
 
  public abstract print();
 
}

Как только вы введете это в Eclipse IDE, вы получите следующую ошибку:

Тип Hello должен быть абстрактным классом для определения абстрактных методов.

Вот еще один скриншот, который показывает, что вы не можете иметь абстрактный метод в конечном классе в Java:

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

Это верно как для верхнего уровня, так и для вложенного класса в Java. Даже если вы объявите абстрактный метод для вложенного конечного класса, вы получите ту же ошибку.

Еще один дополнительный вопрос по этой теме: может ли абстрактный класс иметь статические методы в Java? Ответ — да, нет никакой проблемы с объявлением статического метода внутри абстрактного класса в Java, потому что вам не нужно создавать экземпляр класса для использования статического метода, вы можете просто вызвать их, используя имя класса.

Мы можем изменить наш пример кода, чтобы включить метод main () в класс Hello, который является статическим методом в Java, как показано ниже:

1
2
3
4
5
6
7
8
9
public abstract class Hello {
 
  public abstract void print();
 
  public static void main(String args[]) {
     .. some code here
  }
 
}

Вы можете видеть, что нет ошибки времени компиляции. Код прекрасно компилируется, поэтому вполне нормально объявить статический метод внутри абстрактного класса в Java.

Это все о том, возможно ли иметь абстрактный метод в последнем классе или нет? Как я уже сказал, это невозможно, потому что, как только вы создаете абстрактный метод внутри класса, согласно спецификации Java, класс автоматически становится абстрактным классом. Поскольку вы не можете сделать конечный класс абстрактным в Java, это становится недопустимым, и компилятор запрещает вам делать это, выдавая ошибку. Но, да, вы можете объявить статические методы как в конечном классе, так и в абстрактных классах, с этим проблем нет. Если вы изучаете Java, я предлагаю вам прочитать
Базовая Java для Impatient, чтобы ознакомиться с основными понятиями, такими как абстрактный и конечный класс. Это также покрывает Java 8.

Другие связанные вопросы интервью Java для практики

  1. Может ли абстрактный класс иметь конструктор в Java? ( ответ )
  2. Можете ли вы переопределить статический метод в Java? ( ответ )
  3. Можете ли вы перегрузить статический метод в Java? ( ответ )
  4. Можете ли вы запустить программу без метода main () в Java? ( ответ )
  5. Можете ли вы переопределить закрытый метод в Java? ( ответ )
  6. Можете ли вы перегрузить и переопределить метод main () в Java? ( ответ )
  7. Можете ли вы сделать массив изменчивым в Java? ( ответ )
  8. Можете ли вы объявить статический класс в Java? ( ответ )

Дальнейшее чтение

Интервью по программированию на Java

Head First Java 2nd Edition

Спасибо за чтение этой статьи, если вам понравился этот основной вопрос об интервью на Java и мое объяснение, поделитесь с друзьями и коллегами.