Java Challengers #1 Перегрузка методов в JVM


Перегрузка

1. Перегрузка методов

В Java разрешается в одном и том же классе определять два или более метода с одним именем, если только объявления их параметров отличаются. Это называется перегрузкой методов. Например, в следующем примере один класс объявляет два метода с одним именем test , но разными параметрами:

Как же JVM различает какой метод необходимо вызвать? Для этого в Java используется тип и/или количество аргументов метода.

Перегрузка методов является одним из способов поддержки полиморфизма в Java.

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

В следующем примере методы void test() и double test(double a) возвращают значения разного типа. Это допустимо, но при условии, что параметры методов будут отличаться. Закомментированный метод int test() отличается от void test() только типом — это недопустимо для перегруженного метода. Если его раскомментировать, будет ошибка компиляции:

2. Перегрузка конструкторов

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

Зачем нужна перегрузка методов?

20.11.2013, 22:50

Перегрузка методов
Помогите пожалуйста разобрать задание. Идет набор на курсы трактористов. Тех, кто имеет.

Перегрузка методов
Здравствуйте. Хочу осуществить перегрузку метода, но Eclipse выдаёт ошибку. public class Test <.

Перегрузка методов
Я новичок и пытаюсь разобраться в перегрузках методов класса Sad Допустим есть класс X b childX.

Зачем в Java нужно переопределение методов интерфейса?
Например, есть 2 интерфейса: DataOutput и ObjectOutput. ObjectOutout наследует DataOutput, и.

Перегрузка методов и варарги
Здравствуйте! Посмотрел такой пример, поднялись волосы public class A < static void.


Как перегрузить и переопределить основной метод в Java

Как перегрузить основной метод в Java?

Перегрузка метода может быть определена как функция, в которой класс может иметь более одного метода, имеющего одно и то же имя, если и только если они различаются по количеству параметров или типу параметров или обоим, тогда они могут иметь или не иметь одинаковый тип возвращаемого значения. , Перегрузка методов является одним из способов поддержки полиморфизма в Java.
Да , мы можем перегрузить метод main в java, но JVM вызывает только оригинальный метод main, он никогда не вызовет наш перегруженный метод main.
Ниже пример иллюстрирует перегрузку main () в Java
Пример 1:

ссылка на сайт
brightness_4
код

Из приведенного выше примера ясно, что каждый раз, когда выполняется оригинальный метод main, но не перегруженные методы, потому что JVM выполняет только оригинальный метод main по умолчанию, но не перегруженный.
Итак, чтобы выполнить перегруженные методы main, мы должны вызвать их из оригинального метода main.
Пример 2:
В этом примере мы по очереди выполним все перегрузки основного метода.

ссылка на сайт
brightness_4
код

Страница поста от канала Библиотека программиста

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме

Пожаловаться

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме

Java 8 ещё раз о перегрузке методов

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

Посмотрите на следующий код:

Вопрос: что будет выведено в консоли?

Правильный ответ: 1

Выбор перегруженного метода происходит по следующим правилам:


  1. Выбирается наиболее подходящий метод. Если бы у нас был метод, принимающий short x , то он бы и выполнился. Если нужно, то может выполняться расширяющее преобразование примитивов. Выбирается метод, для которого нужно наиболее близкое расширяющее преобразование. В данном случае до int , так как long , float и double «большие» типы.
  2. Расширяющее преобразование примитивов имеет приоритет над автоупаковкой/распаковкой.
  3. Автоупаковка/распаковка имеет приоритет перед методом с переменным количеством аргументов.
  4. Сужающее преобразование примитивов автоматически НЕ выполняется.
Мастер Йода рекомендует:  Как понять, что пора менять работу — отвечают эксперты

Если бы в примере выше метода method1 ( int x ) не было, то выполнился бы метод method1 ( long x ) .

�� Java Challengers #1: Перегрузка методов в JVM. #[email protected]

Перегрузка методов в JVM: рассмотрим основные моменты с примерами, разберемся в назначении, пройдемся по примитивным типам и решим задачу!

Java Challengers #1: Перегрузка методов в JVM

Перегрузка методов в JVM: рассмотрим основные моменты с примерами, разберемся в назначении, пройдемся по примитивным типам и решим задачу!

Комментарии (8)

Миха Миха

Водяной материал писал?

Полина Колесникова

Комментарий удалён пользователем или руководителем страницы

Gabriel Rosovski

Ребят. Очень жду нового материала по С#

Денис Марченко

Полина, Любишь парное программирование?


Азамат Шарипов

Комментарий удалён пользователем или руководителем страницы

Данил Сидоров

Азамат, покрой юнит тестами

Азамат Шарипов

Я не умею. Мой уровень программирования 0

Данил Сидоров

Азамат, так все впереди, учись!

О проекте

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

Перегрузка методов в Java

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего «Самоучителя по Java»
Давайте проведем эксперимент

Представим, что у нас есть такой код, в котором есть два метода с одинаковым названием:

Как Вы видите, тут есть два конструктора (если впервые слышите слово «конструктор», Вам следует почитать статью «Конструкторы в Java»). У них разные параметры, но называются они одинаково. У Вас выдает ошибку?


Нет.

Почему?

Дело в том, что у Java есть одна особенность — она позволяет производить перегрузку методов. Перегрузка методов — это возможность создавать несколько методов с одинаковым названием, но разными параметрами. Не все языки программирования позволяют это делать. Перегрузка методов — это часть такой составляющей ООП, как полиморфизм. (Если Вы не знаете, что такое ООП и полиморфизм — вернитесь к этой статье).

Обратите внимание: если Вы захотите создать два метода с одинаковым названием, которые будут требовать одни и те же параметры, возникнет ошибка .

Зачем?

Вот, есть у меня в программе один метод print или один конструктор Dog. Зачем мне еще один?

Дело в том, что перегрузка методов выполняет несколько функций:

1. Вы можете создать несколько конструкторов — с одним, двумя параметрами, и вообще без параметров. Программа будет выбирать тот, который подходит под заданные параметры. Например:

Java Challengers #1: Перегрузка методов в JVM

33 просмотра

2 ответа

46 Репутация автора

Пожалуйста, помогите мне найти ответ на два вопроса ниже, оба из которых были заданы в интервью Java:

В этом случае память будет выделяться в стеке JVM (в куче ничего не будет) с использованием нового ключевого слова.

В этом случае перегрузка метода будет решаться на основе типа возвращаемого значения, имя метода и параметры совпадают (я ответил, что это невозможно в Java)

Согласно моим знаниям и выводам из Google, оба не могут быть сделаны, Мой ответ был:


New всегда будет выделять память в куче, и на нее можно ссылаться по ссылке из стека.

Перегрузка решена при компиляции, она выдаст ошибку компилятора, если она не следует описанному ниже методу

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

Но он не был убежден.

Ответы (2)

-3 плюса

373 Репутация автора

1) примитивы типа int, определенные как private, хранятся в стеке (не в куче)

После прочтения вопроса . В случае создания нового экземпляра внутреннего класса оптимизатор может сохранить его в стеке. Более подробная информация: JVM Escape analysis

3 плюса

77673 Репутация автора

Ответ на оба вопросаНикогда , поскольку 1) new выделяет из кучи и с 2) перегрузка метода основана на имени метода и типах параметров, но не на типе возврата.


[Интервьюер] сказал мне, что оба сценария возможны

Это теоретически возможно оптимизатор в JVM для выполнения анализа бежать и принять решение о выделении объекта на стеке, но это невозможно предсказать, и полностью зависит от реализации JVM.

На вопрос «В каком случае . » нельзя ответить, так как вы ничего не можете сделать, чтобы это произошло, поэтому для этого не может быть «дела».

В самой JVM на уровне байт-кода сигнатура метода действительно включает тип возвращаемого значения, поэтому на этом уровне возможно иметь два метода, которые отличаются только типом возвращаемого значения.

Невозможно написать два метода в Java, которые отличаются только типом возврата.

Мастер Йода рекомендует:  Кто такой SEOшник

Можно написать код, который вызывает два таких метода, однако один из них является внутренним синтетическим методом, который просто вызывает другой. Это происходит, когда вы переопределяете метод и сужаете тип возвращаемого значения.

Поскольку возвращаемый тип является частью подписи на уровне байт-кода, компилятор должен создать метод искусственного моста для фактического переопределения Number getNumber() . Этот метод просто вызывает Integer getNumber() перегрузку.

Возможность изменять тип возвращаемого значения при переопределении не добавлялась в Java до Java 1.5.

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

Как JVM различает перегрузку метода и переопределение метода внутри?

Я хотел бы знать, как JVM различает между перегрузкой метода и переопределением метода внутри.

4 ответа

3 Решение Atsby [2015-05-27 09:41:00]

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

Метод перегрузки означает наличие нескольких методов с одним и тем же «простым именем», но с разными сигнатурами. Во время компиляции компилятор javac выбирает один из однотипных методов, основанный на типах аргументов, и помещает свою подпись в скомпилированный файл .class . Вызов метода в скомпилированном байт-коде Java должен указывать подпись вызываемого абонента.

2 Raj [2015-05-27 09:33:00]


Jvm не участвует в перегрузке метода. Поэтому не нужно различать перегрузку метода и переопределение метода.

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

Прежде чем перейти к разнице между перегрузкой и переопределением, давайте сначала рассмотрим полиморфизм.

Что такое полиморфизм?

Полиморфизм — это способность метода делать разные вещи на основе объекта, на который он действует. Другими словами, полиморфизм позволяет вам определить один интерфейс и иметь несколько реализаций.

Различные типы полиморфизма в java. 1) Перегрузка метода 2) Переопределение метода

Типы полиморфизма в java: статическое, динамическое, время выполнения и время компиляции

Теперь вернемся к исходному вопросу и поймем разницу между перегрузкой и переопределением.

1. Первым и самым важным является то, что метод перегрузки полиморфизма времени компиляции при переопределении метода — это полиморфизм времени выполнения. Поэтому JVM должна заниматься только переопределением метода. Перегрузка метода уже разрешена после компиляции.

2. В перегрузке метода методы должны иметь различную подпись. В методе Overriding методы должны иметь одинаковую подпись.

Есть много других отличий, но выше двух может действительно отличать перегрузку метода от переопределения метода.

Прежде чем завершать, давайте также посмотрим, чего каждый пытается достичь.

Перегрузка метода заключается в том, чтобы «добавить» или «расширить» поведение методов. Метод переопределения — «Изменить» существующее поведение метода.

Перегрузка метода обрабатывается компилятором (то есть известным как статическое связывание), в то время как переопределение обрабатывается JVM.

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

Переопределение метода происходит, когда мы пытаемся вызвать переопределенный метод в ссылке parent , которая удерживает объект child . Потому что мы вызываем метод на ссылке parent , поэтому при компиляции метод времени определяется с помощью ссылочного типа parent , поэтому для компилятора метод parent получает вызов. Но parent удерживает объект child , поэтому при вызове метода выполнения из child вызывается.


Чтобы понять, как Java (компилятор + JVM) обрабатывает обе вещи внутри себя, возьмите пример класса Mammal и Human

Когда мы скомпилируем выше код и попытаемся посмотреть на байт-код с помощью javap -verbose OverridingInternalExample , мы увидим, что компилятор сгенерирует таблицу констант, где он присваивает целые коды каждому вызову метода.

Я включил байт-код вместе с вышеперечисленными вызовами методов и, посмотрев выше код, мы видим, что байт-коды humanMammal.speak() , human.speak() и human.speak(«Hindi») полностью различаются, потому что компилятор способен различать их на основе в списке аргументов и ссылке на класс. И поэтому Перегрузка метода известна как Статический полиморфизм или Статическая привязка.

Но байт-код для anyMammal.speak() и humanMammal.speak() аналогичен тому, что в соответствии с компилятором оба метода вызываются на ссылку Mammal , но вывод для обоих вызовов метода отличается от того, что во время выполнения JVM знает, к какому объекту относится ссылка и JVM вызывает метод на объекте, и именно поэтому Переопределение метода называется Динамический полиморфизм или просто Полиморфизм.

Если вы хотите узнать больше об этом, вы можете больше узнать о Как перегружать и переопределять метод обработки JVM внутри страны.

Мастер Йода рекомендует:  Как научиться переключаться между задачами — отвечают эксперты

Хотя имя метода остается таким же в случае перегрузки и переопределения метода, основное различие возникает из-за того, что перегрузка метода разрешена во время компиляции, а переопределение метода разрешено во время выполнения. Также правила Java переопределяют или перегружают метод в Java. Например, частный, статический и конечный метод не могут переопределяться в Java, но вы все равно можете их перегрузить. Для переопределения как имени, так и подписи метода должен оставаться таким же, но для перегрузки метод подписи должен отличаться. Последняя, ​​но не менее важная разница между ними заключается в том, что вызов перегруженных методов разрешается с использованием статической привязки, тогда как вызов переопределенного метода разрешается с использованием динамической привязки в Java. SO JVM не участвует в перегрузке
Перегрузка метода:

Как JVM различает внутреннюю перегрузку метода и переопределение метода?

Я хотел бы знать, как JVM различает перегрузку метода и переопределение метода внутри.

4 ответа

JVM имеет дело только с переопределением метода. Метод переопределяется путем добавления метода с той же сигнатурой в производный класс (единственное допустимое различие заключается в типе возвращаемого значения, который может быть более конкретным). Подпись кодирует имя метода, а также типы параметров и тип возвращаемого значения.

Перегрузка метода означает наличие нескольких методов с одинаковым «простым именем», но разными сигнатурами. Во время компиляции компилятор javac выбирает один из методов с тем же именем на основе типов аргументов и помещает свою подпись в скомпилированный файл .class . Вызов метода в скомпилированном байт-коде Java должен указывать подпись вызываемого.

JVM не участвует в перегрузке метода. Таким образом, нет необходимости различать перегрузку метода и переопределение метода.

Вы бы это ясно поняли, если бы понимали, как перегрузка методов и переопределение методов реализованы Java за кулисами.

Прежде чем перейти к разнице между перегрузкой и переопределением, давайте сначала рассмотрим полиморфизм.

Что такое полиморфизм?

Полиморфизм — это способность метода делать разные вещи в зависимости от объекта, на который он воздействует. Другими словами, полиморфизм позволяет вам определять один интерфейс и иметь несколько реализаций.


Различные виды полиморфизма в Java. 1) Перегрузка метода 2) Переопределение метода

Типы полиморфизма в Java: статический, динамический, время выполнения и время компиляции

Теперь давайте вернемся к исходному вопросу и поймем разницу между перегрузкой и переопределением.

1. Первым и наиболее важным является то, что метод перегружает полиморфизм во время компиляции, а переопределение метода — это полиморфизм во время выполнения. Таким образом, JVM имеет дело только с переопределением метода. Перегрузка метода уже разрешена после компиляции.

2. В методе перегрузки методы должны иметь разную подпись. В методе переопределения методы должны иметь одинаковую подпись.

Есть еще много различий, но два выше могут реально отличить перегрузку метода от переопределения метода.

Прежде чем закончить, давайте также посмотрим, чего каждый пытается достичь.

Перегрузка метода заключается в том, чтобы «добавить» или «расширить» больше поведения метода. Переопределение метода — «изменить» существующее поведение метода.

Перегрузка метода обрабатывается компилятором (поэтому он называется статическим связыванием), а переопределение обрабатывается JVM.

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

Переопределение метода происходит, когда мы пытаемся вызвать переопределенный метод для parent ссылки, которая содержит child объект. Поскольку мы вызываем метод для parent ссылки, поэтому во время компиляции метод разрешается из parent ссылочного типа, поэтому для компилятора вызывается метод parent . Но parent содержит объект child поэтому во время выполнения метод вызывается из child .

Чтобы понять, как Java (Compiler + JVM) обрабатывает обе вещи внутренне, давайте рассмотрим пример классов Mammal и Human

Когда мы скомпилируем приведенный выше код и попытаемся просмотреть байт-код с помощью javap -verbose OverridingInternalExample , мы увидим, что компилятор генерирует таблицу констант, где он присваивает целочисленные коды каждому вызову метода.

Я включил байт-код вместе с приведенными выше вызовами методов, и, взглянув на приведенный выше код, мы видим, что байт-коды humanMammal.speak() , human.speak() и human.speak(«Hindi») полностью отличаются, поскольку компилятор возможность различать их на основе списка аргументов и ссылки на класс. И именно поэтому перегрузка метода известна как статический полиморфизм или статическое связывание .

Но байт-код для anyMammal.speak() и humanMammal.speak() одинаков, потому что согласно компилятору оба метода вызываются по ссылке Mammal но выходные данные для обоих вызовов метода различны, поскольку во время выполнения JVM знает, какой объект содержит ссылка, и вызовы JVM метод на объекте, и именно поэтому переопределение метода известно как динамический полиморфизм или просто полиморфизм .

Если вы хотите узнать больше об этом, вы можете прочитать больше о том, как JVM обрабатывает перегрузку и переопределение метода внутри системы .

Добавить комментарий