Как может отрабатывать метод isDogNear(Dog dog) класса Cat, если он вызывает private метод класса Dog? Ведь если метод getSpeed() помечен как "private" - то к нему нет доступа из других классов...
Сергей
20 уровень
Почему так?
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ярослав Java Developer Master
10 февраля 2018, 21:38
Играем в угадайку? Если нет, то следовало бы прикрепить весь код, а потом спрашивать.
0
Сергей
10 февраля 2018, 22:28
Все понял, некрасиво получилось, но код уже решенной задачи прикрепить нельзя... Суть в следущем:
метод getX() приватный, но ,несмотря на это, экземпляр класс A имеет к нему доступ. +1
Dudchenko Andrei
10 февраля 2018, 22:40
В смысле?
в 14-й строке описан метод класса А. При вызове этого метода мы обязаны "скормить" ему ссылку на какой-то объект В.
В 5-й строке мы именно это и делаем и скармливаем ему переменную b класса В.
Далее, в 15-й строке мы вычисляем результат такого:
больше ли переменная х объекта а класса А (this.x) чем такая же переменная х, но объекта b класса В (b.getX()).
Как работает этот b.getX. b - это объект класса В и, соответственно, может спокойно вызывать все методы своего класса. Одним из таких методов есть getX, который вернет в место своего вызова значение переменной х объекта, который его вызвал.
Собственно, такие методы для этого и нужны - чтобы иметь доступ к приватным полям других классов где угодно. Заметь, что мы не можем поменять значение этого поля х. Мы только узнаем чему оно равно сейчас.
Посмотри Геттеры и Сеттеры.
0
Сергей
10 февраля 2018, 23:20
Про геттеры и сеттеры я в курсе. Суть в том, что мы обращаемся к private методу класса B из класса А! Переменная "x" класса B приватная, КАК И ЕЕ ГЕТТЕР. Таким образом, в принципе, мы можем и напрямую обратиться к переменной "x" без всяких геттеров. Это и вызвало непонимание происходящего, т. к. если бы A и B были НЕ внутренними классами, то мы бы не имели доступ к private полям/методам класса B из класса A.
0
Алексей Рубинкович
4 мая 2018, 13:40
Я правильно понимаю, что объекты разных классов, находящихся внутри одного класса, могут вызывать любые методы друг друга назависимо от того, private они или public? Почему бы тогда просто не обратиться напрямую к переменной speed интересующего нас объекта?
0
Сергей
10 февраля 2018, 20:39
или JavaRush и Сьерра с Бэйтсом мне что-то недоговаривают? =) Единственное решение этого недоразумения, которое мне приходит в голову - это то, что оба этих класса являются внутренними и рассматриваются как часть класса Solution, и соответственно их модификаторы доступа действуют как в рамках своего класса, так и в рамках внешнего. Пожалуйста, скажите, что это не так, иначе у меня думалка сломается! =)
0
Стас Пасинков Software Developer в Zipy Master
10 февраля 2018, 21:40решение
если классы Cat и Dog внутренние/вложенные - то да. все именно так, как вы и предположили.
класс Solution может "видеть" приватные методы и переменные своих внутренних/вложенных классов. ну и наоборот
а вообще, конечно, если бы видно было код - было бы проще догадаться о чем вы)
+4
Сергей
10 февраля 2018, 22:08
Первый раз спрашивал про уже решенную задачу, не подумал, что условие и код не будут прикреплены, учту в будущем, извиняюсь. А за пояснение огромное спасибо, тут именно такая ситуация!
0
Dudchenko Andrei
10 февраля 2018, 22:11
Тут есть такая дырка в Джаве, как рефлексия. С помощью нее можно вообще поломать все и вся, включая закрытые для нас дебри сторонних библиотек...
То есть переопределить приватные поля, методы, классы вообще левых файлов и классов.
Так что это еще цветочки.
0
Сергей
10 февраля 2018, 22:32
Так, полегче, мне еще нельзя такого рассказывать, у меня и так все понимание модификаторов доступа рухнуло... =) Хотя про вашу рефлексию почитаю на досуге, спасибо!
0