Вопрос: А вот этот a++ на значении переменной n как-то сказалось?
Вопрос: А вот этот a++ на значении переменной n как-то сказалось? Ответ: Нет. Поэтому когда я вызываю функцию, значения аргументов (n, m, 1) – они передаются по значению аргумента в переменные, которые как параметры объявлены. В Java только механизм передачи по значению. Вопрос: Зачем это сделано? Ответ: Для надежности, потому что метод ничего не может испортить то, что находится во вне. Представьте, если бы я мог изменить и n, и m. Какой бы это был кошмар. Кто-то вызывает метод, а он берет и меняет ваши переменные во вне. Вы вообще не пожете понять, почему так происходит. Поэтому, вы работаете с копией. Можете делать с ней все, что захотите, но n, m и 1 вам никак не испортить. Вопрос: А что происходит для ссылочных типов? Ответ: Вначале надо разобрать, а что такое ссылочные типы. Надо будет нарисовать, как они устроены в памяти, и тогда мы сможем понять, как они передаются в методы в ссылочные типы. Перегрузка и методы с переменным числом аргументов.
Для методов существует еще несколько дополнительных возможностей – перегрузка. Я могу сделать один метод, например, сумма. Но ко мне приходит заказчик, и говорит: «Ты мне сделай сумму для двух параметров, для трех, для четырех, для пяти». А я ему: «А давай до ста! ». А он: «Да, давай до ста! ». Можно было бы написать summa1(), summa2, …, summa100(). Это очень не удобно. Представьте, что у вас по всей программе вызывается метод summa75(), потом вы хотите сделать 73 параметра, а вам надо еще и имя менять в методе. Это очень неудобно. А когда у меня есть перегрузка, то мне разрешено все методы назвать одинаково. Они все выполняют одну функцию – суммирование. Но они должны отличаться числом параметров(! ) или типом(! ) имея одинаковое имя, имея одинаковый тип возвращаемого значения.
Посмотрите на перегрузку из жизни – println. Вот он существует в стольких вариантах. println() – переход на новую строку. А также есть и для других типов и мы это видим. Есть также println(Object o) – это для всех ссылочных типов. И отдельно есть для строк (строки – это отдельная история). Поэтому получается, что println существует, как вариант на все случаи жизни. А теперь представьте, что у меня гигантская программа и вдруг моя переменная, которая была double, поменяла тип на int. В одном случае у меня вызывался метод printDouble, а мне бы пришлось, поменяв тип переменной потом по всей программе поменять вызов метода на printInt. Представляете, какой бы был ужас? Перегрузка – это идеальное решение. Вопрос: Есть в Java перегрузка операций? Ответ: Нет. +, - перегружать в Java вы не будете. И, слава богу, никому это не нужно. Я не очень представляю, как складывать двух сотрудников. И даже >, < для сотрудников не представляю, как реализовать. Никому это не нужно. Вернемся к нашим баранам… Но дело можно довести до маразма, и тот же самый заказчик придет, и скажет: «Ну хорошо! Ты мне написал сумма от 1 до 100. А если мне понадобится больше? ». И тогда вы можете предложить ему такой вариант: «А давай мы тебе сделаем так: мы тебе напишем один вариант, но на вход в массив будет всего 1 параметр – массив. Массив же может быть любой размерности, правильно? Ты создай массив, положи туда свои замечательные числа. Вызови сумму, и на вход в массив. Я тебе все скажу! У тебя будет одна версия! ». А он скажет: «Нет, я хочу через запятую! И чтобы было сколько угодно! ». Вот тогда вам пригодится для решения такой задачи метод с переменным числом аргументов (…).
Функции с переменным числом аргументов – void vsolve1(Object … arg) – void vsolve2(int [] … arg) «Три точки» - это такой синтаксис, который говорит компилятору – это не один параметр, а число аргументов с произвольным количеством. Их можно указывать через запятую и их всех положат в один arg. Вопрос: А кто такой arg, который способен хранить много чисел? Ответ: Это arg-массив. Это может быть не обязательно Object - тип может быть любым. Это может быть не обязательно такой простой тип, как int или double. На вход можно передать любое количество массивов через запятую. Т. е. можно сделать практически, что хочешь. И поэтому если мы хотим попробовать вариант с переменным числом аргументов, то мы можем использовать наш код. Вот это правильный синтаксис. Осталось написать что-то внутри. Вопрос: А сколько можно передать на вход данных? Ответ: От нуля. Разрешено передавать даже 0. Самое приятное, что такой синтаксис позволяет на вод передать не только через запятую сто чисел, но можно на вод передать массив.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|