|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
||||||
Метод получает другой метод, как аргумент. Как это работает?19.01.2018, 09:42. Показов 3290. Ответов 45
Метки нет (Все метки)
Добрый день, ребят. Есть такая программа:
0
|
||||||
| 19.01.2018, 09:42 | |
|
Ответы с готовыми решениями:
45
Как сделать так, чтобы можно было вписать другой метод(не знаю, как это описать )
Можно ли записать в аргумент метода, другой метод? |
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 21.01.2018, 11:39 | |
![]() Давай так Создаем объект Block ob1 = new Block (10, 2, 5); теперь ob1.a = 10, ob1.b = 2, ob1.c = 5. Создаем объект Block ob3 = new Block (4 ,5, 5); теперь ob3.a = 4, ob3.b = 5, ob3.c = 5. Вызываем метод объекта ob1 и передаем ему аргумент - объект ob3: ob1.sameBlock(ob3); Т.е. для этого метода в данном случае ob3 становится ob. Далее, обращения в методе: a будет равно 10, b будет равно 2, c будет равно 5, ob.a будет равно 4, ob.b будет равно 5, ob.c будет равно 5. Ну, так-то хоть понятно???
0
|
|
|
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
|
||
| 21.01.2018, 12:14 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|
| 21.01.2018, 14:24 [ТС] | |
|
iSmokeJC
В предложении «Вызываем метод объекта ob1 и передаем ему аргумент...» ты не зря написал «метод объекта». Из всего сообщения вот именно этого я не понимаю. Опиши пожалуйста этот момент поподробнее. iSmokeJC, Alex_Fedor До этой программы, мне всегда казалось, что в записях типа ob1.sameBlock(ob3) , ob1 это просто «провайдер», который отправляет «клиента»(аргумент) наверх. мне всегда казалось, что этот «провайдер» только отправляет что-то тому или иному метода. но сейчас я понимаю, что он также и влияет на этот метод. но вот как, не пойму. Если говорить простыми категориями, то получается: Есть начальник по имени main, у него есть два сотрудника iSmokeJC и Alex_Fedor Main говорит им, сходите к парню Block, назовите свои цифры и принесите мне корзинки с этими цифрами на табличках. iSmokeJC, Alex_Fedor пошли к Block'u и называют каждый свои цифры. Тот дает каждому по корзинке, в которых таблички со своими цифрами, и говорит: "запомните, что эти корзинки занимают пространство вокруг вас и всегда будут с вами." Вы оба киваете и возвращаетесь к начальнику main. Тот смотрит на вас и говорит: "Alex_Fedor, отведи iSmokeJC к парню, по имени sameBlock, да корзинки свои не забудьте." И вот вы оба приходите к sameBlock, а Alex_Fedor говорит sameBlock'у: "Вот парня к тебе привел". SameBlock знает, что должен работать с тем, кого привели а именно с ob3, т.к. в должностной инструкции у него написано: ob1.sameBlock(ob3). И в данном случае ob1 это Alex_Fedor, а ob3 - iSmokeJC. После он берет корзинку у iSmokeJC и называет те цифры, которые там написаны. А теперь вопрос, откуда sameBlock знает, что в корзинке у Alex_Fedor, если по инструкции он работает с аргументом ob, который в данном случае является iSmokeJC? И если с «ob.a» он понимает, что нужно посмотреть к корзинку «iSmokeJC» и там найти «а», то откуда он понимает, что просто «а» в корзинке у «Alex_Fedor», а не у парня Block???
0
|
|
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 21.01.2018, 14:52 | |
|
В магазине iSmokeJC (ob1) купил (создали объект) пузырь водки(а) и колбасу краковскую(b), больше денег не хватило и у него появилось намерение (метод sameBlock) отобрать у кого-нибудь еще.
У aves (ob3) тоже есть намерение отобрать (метод sameBlock), а также пузырь коньяка(a) и сосиски(b). Братва (main) сказала iSmokeJC - сходи, отними вон у того чувака еще чего-нибудь (передает в метод ob1.sameBlock параметр ob3). iSmokeJC отобрал у чувака (ob, а не ob3, т.к. iSmokeJC не знает, как его зовут) девайсы a и b. Потом он их сравнил - ништяк! У меня водка (а), а у него коньяк(ob.a == ob3.a), у меня колбаса(b), а у него сосиски(ob.b == ob3.b). Потом говорит братве (System.out.println) - мое бухло не такое же как его (a != ob.a), у меня водка (a=), а у него коньяк (ob.a =).
0
|
|
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
| 21.01.2018, 15:33 | |
|
Есть память, в ней лежат объекты. У них есть адреса, по которым к ним можно обратиться.
Ты можешь написать что-то типа того: copy(source, destination); source и destination - адреса двух объектов. когда ты это говоришь, ты подразумеваешь, что надо сходить по адресу source, взять то, что там лежит, скопировать по адресу destination. Подлежащее - source, сказуемое - copy т.е. то же самое можно выразить вот так source.copy(destination); source.copy(destination) и copy(source, destination) эквивалентны в некотором смысле.
0
|
|
|
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
|
|||||||
| 21.01.2018, 16:31 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|
| 21.01.2018, 21:07 [ТС] | |
|
Если я все правильно понимаю, то метод sameBlock (Block ob) одновременно может работать только с двумя объектами. это ob1 и ob3. (имеется ввиду, если передача аргумента произошла по записи ob1.sameBlock(ob3)).
0
|
|
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 21.01.2018, 21:10 | |
|
Aves,
в конце то концов...
0
|
|
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|
| 21.01.2018, 21:21 [ТС] | |
|
Если я все правильно понимаю, то метод sameBlock (Block ob) одновременно может работать только с двумя объектами. это ob1 и ob3. (имеется ввиду, если передача аргумента произошла по записи ob1.sameBlock(ob3)).
В принципе, я это понимал, но сейчас увидел это более ясно. Кстати, Alex_Fedor, респект тебе с твоим примером. Не знаю почему, но он мне немного прояснил суть. Если бы была запись типа sameBlock(Block ox, oy), то передача была бы возможна и таким способом: ob1.sameBlock(ob2, ob3). В этом случае метод sameBlock понимал бы уже три переменные: a, ox.a, oy,a. Первая это от объекта ob1, вторая от объекта ob2 и третья от объекта ob3. iSmokeJC, Вы мне тоже очень сильно помогли Добавлено через 5 минут Единственно чего я до сих пор не понимаю до конца, так это то, как организуется память для объектов. Я знаю, что для них выделяется место для хранения переменных. Но как физически происходит взаимодействие sameBlock и этих объектов.
0
|
|
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 21.01.2018, 21:26 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|
| 21.01.2018, 21:30 [ТС] | |
|
iSmokeJC, мне Alex_Fedor посоветовал Хорстмана для изучения, хотя я уже прохожу Шилдта. Какая, по-твоему лучше и удобнее для начинающего?
0
|
|
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 21.01.2018, 21:35 | |
|
Шилдт вроде попроще, Хорстман получше... хз. Читай обоих!
![]() Добавлено через 2 минуты Берешь тему, и у обоих ее изучаешь. Взгляд с двух сторон, кто-то что-то недоскажет, кто-то подробней, кто-то понятней...
0
|
|
| 21.01.2018, 23:06 | |
|
Не по теме: Aves, чувак, может просто не твое? Торговать не пробовал?
0
|
|
|
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
|
|||||||
| 22.01.2018, 08:40 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|
| 22.01.2018, 14:29 [ТС] | |
|
Alex_Fedor
Такой код мне абсолютно понятен. Метод класса А sameVolume принимает два целочисленных аргумента x, y, которые принимают то значение, которое мы указали в условии if (obA.sameVolume(5,6)). При этом sameVolume не может быть никакого другого типа, кроме как boolean, т.к. условие if ожидает логическое значение. (если конечно не возвращать 0 или 1). Далее метод сравниваем "приезжие" x , y с "местными" i, j. Если они равны, то метод возвращает true. если нет, то false. И в зависимости от этого будет выполняться либо первое условие if, либо второе. Это элементарно. Добавлено через 7 минут Т.е. будет true
0
|
|
|
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
|
|||||||||||||||||||||||||
| 22.01.2018, 17:43 | |||||||||||||||||||||||||
|
Тогда такой код, он абсолютно равноценен первому. Дает те же самые результаты. Главное , что здесь надо понимать. Перемененные а и в метода main, переменные а и в - класса А, это абсолютно разные переменные которые живут параллельно каждая своей жизнью. Сточки this.a this.b означают, что это переменные а и в класса А, просто они скрываются своими тезками в этой строчке boolean sameVolume(int a,int b), и чтобы к ним обратиться нужно использовать this, Здесь вам все понятно?
1
|
|||||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|
| 22.01.2018, 22:01 [ТС] | |
|
Я полтора часа рассматривал ваши примеры и кое-что понял.
Из последнего примера 22 строка. В ней указывается объект objA, который нужен для того, чтобы работать с переменными того объекта, который придет на место 'А'. Тогда становится понятно, что запись 'objA.a' не может иметь другой формы записи, иначе интерпретатор тупо не поймет, к переменной какого объекта нужно обращаться (только если написать просто 'а', тогда интерпретатор сошлется на переменную текущего класса (obA.sameBlock(otherObA). Таким образом, запись типа 'а' и 'this.a' эквивалентны. А запись objA.a всегда будет указывать на переменную объекта otherObA. Я правильно понял? Если да, то объясните в чем смысл ключевого слова this? Добавлено через 1 минуту Возможно, что я не совсем ясно изъяснился, но это от того, что сам еще не до конца понял, что я понял. Но что-то я понял.
0
|
|
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
||||||
| 22.01.2018, 22:23 | ||||||
|
Aves, ключевое слово this указывает на принадлежность объекту, внутри которого происходит обращение:
1
|
||||||
|
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
|
|
| 22.01.2018, 22:39 | |
|
который придет на место 'А' нет
boolean sameVolume(A objA) здесь А это указатель типа переменной, в данном случае переменная objA должна быть объектом класса А, у вас же не вызывает затруднение такое boolean sameVolume(int a,int b) что переменные а и b имеют тип int. Т.е. по сути вы можете насоздавать сколь угодно много объектов класса A и спокойно передавать их в метод. Если вы попытаетесь передать в метод любую другую переменную то получите ошибку. Все остальное вы поняли правильно. В последнем примере указывать this не обязательно, просто я оставил его для лучшего согласования с предыдущими примерами. Удалите this от этого ничего не поменяется.
0
|
|
|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
|||||||||||||||||||||
| 23.01.2018, 10:24 [ТС] | |||||||||||||||||||||
|
Alex_Fedor
Еще вопрос., при создании объектов, в памяти выделяется область для каждого из них, в которую записываются значения переменных и все методы класса. Поэтому, если рассматривать ваш пример, получается, что как только интерпретатор встречает запись
Таким образом когда выполнение программы доходит до строчки
Добавлено через 3 минуты iSmokeJC если изменить код
0
|
|||||||||||||||||||||
| 23.01.2018, 10:24 | |
|
Метод как аргумент в цикле Передача объекта как аргумент в метод Как в аргумент функции передать указатель на метод класса? Напишите метод, который принимает массив как аргумент и возвращает N Если асинхронные методы вызывают другой метод, то этот другой метод тоже должен быть async? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|