Как известно старым читателям, семь лет назад я вернулся в Лоян (прекрасный) из Сучжоу, где много красавиц, я «опросил» немало интервьюеров, но только два или три меня устраивают. Один из них, Лао Ма, до сих пор жив в моей адресной книге WeChat. Он бросил вопрос интервью и ошеломил меня: "Ван Эр, в чем разница между Override и Overload в Java?"
В тот год мне было двадцать три года, в юности, примерно в том же возрасте, когда Джей Чоу выпустил "Octave Space", я думал, что смогу правильно ответить на все вопросы интервью, но не ожидал, что это будет "сложно" - оказывается, в Лояне есть и технические специалисты в пустыне интернета. Оглядываясь назад, на его лице бессознательно появился румянец стыда: главным образом потому, что он был слишком наивен в то время. В любом случае, прошло семь лет, и моя техническая база была очень прочной. У меня есть возможность написать статью для анализа переписывания и перегрузки Java. Пока я могу дать некоторые ссылки на опоздавших, я чувствую, что Я проделал большую работу, добрые дела.
Ладно, приступим к делу. Давайте сначала посмотрим на переписанный код.
class LaoWang{
public void write() {
System.out.println("老王写了一本《基督山伯爵》");
}
}
public class XiaoWang extends LaoWang {
@Override
public void write() {
System.out.println("小王写了一本《茶花女》");
}
}
Два переопределенных метода имеют одинаковое имя и одинаковое количество параметров метода, однако один метод находится в родительском классе, а другой — в подклассе. Как будто родительский класс LaoWang имелwrite()
Метод (без параметров), тело метода — написать книгу «Граф Монте-Кристо»; подкласс XiaoWang переписывает родительский классwrite()
Метод (без параметров), но суть метода в написании книги "Травиата".
написать тестовый код.
public class OverridingTest {
public static void main(String[] args) {
LaoWang wang = new XiaoWang();
wang.write();
}
}
Угадайте, каков результат?
小王写了一本《茶花女》
В приведенном выше коде мы объявляем переменную wang типа LaoWang. Во время компиляции компилятор проверяет, содержит ли класс LaoWangwrite()
метод, обнаружил, что класс LaoWang имеет, поэтому компиляция прошла. Во время работы создается новый объект XiaoWang и назначается wang.В это время виртуальная машина Java знает, что wang ссылается на объект XiaoWang, поэтому она вызывает подкласс XiaoWang.write()
метод вместо родительского класса LaoWangwrite()
метод, так что вывод "Сяо Ван написал книгу "Травиата".
Давайте посмотрим на другой фрагмент перегруженного кода.
class LaoWang{
public void read() {
System.out.println("老王读了一本《Web全栈开发进阶之路》");
}
public void read(String bookname) {
System.out.println("老王读了一本《" + bookname + "》");
}
}
Имена двух перегруженных методов одинаковы, но количество параметров метода разное, наследование не задействовано, два метода находятся в одном классе. Это похоже на то, что класс LaoWang имеет два метода, именаread()
, но у одного есть параметр (название книги), а у другого нет (может только читать и писать мертвую книгу).
написать тестовый код.
public class OverloadingTest {
public static void main(String[] args) {
LaoWang wang = new LaoWang();
wang.read();
wang.read("金瓶梅");
}
}
Результат - никаких догадок. Переменная wang имеет тип LaoWang,wang.read()
Вызывается без аргументовread()
метод, поэтому первый вывод «Фараон прочитал книгу «Дорога к продвинутой веб-разработке с полным стеком»;wang.read("金瓶梅")
Вызов параметризованread(bookname)
метод, поэтому вывод «Фараон прочитал« Джин Пинг Мэй »». Во время компиляции компилятор знает, что эти дваread()
методы отличаются, потому что их сигнатуры методов (= имя метода + параметры метода) различны.
Кратко резюмируя:
1) Компилятор не может решить, какой переопределенный метод вызывать, потому что о нем нельзя судить только по типу переменной, и можно решить только во время выполнения; но компилятор может четко знать, какой переопределенный метод вызывать, т.к. определяется, а количество параметров определяет, какой метод вызывать.
2) Полиморфизм - это переопределение, а не перегрузка.
Эй, я сожалею об этом, если бы я мог полностью понять этот вопрос интервью в первые годы, меня бы не беспокоила старая лошадь. Спой стихотворение о жизни.
Подсолнухи в саду Цинцин ждут рассвета. Весной Бу Дезе все сияет. Часто опасаются, что придет осенний праздник, и листья желтых цветов опадут. С востока к морю, когда вернется на запад? Молодой бездельник, старый нищий
Кроме того, я хочу вам сказать, что Override и Overload — два очень важных понятия в Java. Новички часто путаются в них, потому что их английские названия слишком похожи. До перевода всего одно слово. Сложно, слишком сложно.
Что ж, мои дорогие читатели, на этом все. Я вижу, что здесь все лучшие программисты, второй брат должен поставить вам палец вверх 👍. Оригинальность – это непросто, если вы сочтете это полезным, пожалуйста, не скупитесь на свое право на лайк, потому что это будет моей сильнейшей письменной мотивацией. До встречи в нашей следующей статье!