|
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
|
||||||
Метод получает другой метод, как аргумент. Как это работает?19.01.2018, 09:42. Показов 3302. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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) активировать флаг. . .
|