|
|
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Есть пара простых вопросов, на которые у меня имеющиеся источники дают противоречивые ответы : 1) Объясняите, плиз, в чем разница в видимости : c protected и без модификатора вовсе 2) В одной книжке у меня написан еще такой вариант видимости private protected , но он у меня не работает - это ошибка в книжке ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 17:56 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
protected - не доступен никому, кроме как в своем но и в НАСЛЕДУЮЩЕМ классе без модификатора - доступ в пределах пакета public, за пределами пакета - private ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 18:39 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
private protected - видимо, опечатка. Такого сочетания не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 18:56 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
2 _Гость_ > Я покорно прошу написать по русски - ничего не понял. 2 Зашедший > Guest private protected - видимо, опечатка. Такого сочетания не бывает. глянь вот http://] http://www.codenet.ru/webmast/java/08.php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 19:14 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Или вот книжка Java in a Nutshell By David Flanagan глава 3.8 Data Hiding and Encapsulation ... [/src]Table 3.1: Class Member Accessibility Accessible to: public protected package private Same class yes yes yes yes Class in same package yes yes yes no Subclass in different package yes yes no no Non-subclass, different package yes no no no [/src] Но эксперимент показывает : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 19:29 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
kefi2 Зашедший > Guest private protected - видимо, опечатка. Такого сочетания не бывает. глянь вот http://] http://www.codenet.ru/webmast/java/08.php Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 19:50 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
2 Зашедший > Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону. а разве может не соблюдаться правило совместимости снизу вверх ? И потом, - почему в приведеном примере не доступна, по табличке выше вроде как этого не должно быть : Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 20:19 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
kefi2 Зашедший > Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону. а разве может не соблюдаться правило совместимости снизу вверх ? И потом, - почему в приведеном примере не доступна, по табличке выше вроде как этого не должно быть : Код: plaintext 1. 1) Правило совместимости может не соблюдаться, и в Java тому немало примеров. Например, в первых версиях JDK метод main() мог быть объявлен приватным, но класс все равно запускался на исполнение. С 1.4 он может быть только public , соответственно, все ранние версии запускаться перестанут и надо будет менять модификатор на public . Кроме того, есть специальный указатель @deprecated , указывающий, что метод не рекомендован к использованию и в последующих версиях может быть (и, скорее всего, будет) удален. 2) В данном случае недоступен потому, что мы обращаемся к Str.String_ как к экземпляру класса, а не как к родителю текущего экземпляра. При обращении "снаружи" (к экземпляру класса) мы имеем доступ только к public (ну либо к default внутри пакета). Однако ВНУТРИ самого класса мы можем обратиться и к protected -членам родительского класса this.V , и к super.V . Кстати, есть одно исключение - если в метод передан экземпляр НАШЕГО же класса, то мы можем обратиться даже к privat члену полученного экземпляра, прочитать и изменить его - эта особенность используется обычно для реализации compareTo() и equals() без прикручивания ненужных getXXX. Примерчик: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 13:10 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Зашедший[quot kefi]2 Зашедший > Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону. а разве может ... обращении "снаружи" (к экземпляру класса) мы имеем доступ только к public (ну либо к default внутри пакета). Однако ВНУТРИ самого класса мы можем обратиться и к protected -членам родительского класса this.V , и к super.V . Кстати, есть одно исключение - если в метод передан экземпляр НАШЕГО же класса, то мы можем обратиться даже к privat члену полученного экземпляра, ... [/src] Ей. Вы чего городите товарищи? private - видимость только внутри класса (т.е. любой экземпляр класса имеет доступ к методам любого друго экземпляра данного класса и к внутренним классам). default - видимость внутри пакета только (наследник в другом пакете не будет видеть default методы). protected - видимость внутри пакета и в наследниках класса . public - везде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 16:23 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUs protected - видимость внутри пакета и в наследниках класса . Да, конечно, внутри пакета тоже. Забыл указать, каюсь. А вот в наследниках класса protected -члены родительского класса можно увидеть только если мы используем this или super . Если же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected -членам доступа не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:03 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет. Ну так ясно же ведь сказано было, что protected члены видят только наследники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:19 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
wessen ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет. Ну так ясно же ведь сказано было, что protected члены видят только наследники. Если ясно - то откуда тогда взялся вопрос: kefi И потом, - почему в приведеном примере не доступна, по табличке выше вроде как этого не должно быть... Видимо, человеку не ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:23 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
wessen ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет. Ну так ясно же ведь сказано было, что protected члены видят только наследники. А вот и фиг там, в том же пакете можно получить доступ к protected членам через ссылку на объект, а вот в другом пакете уже не прокатит такая штука, только через наследников. Сорри, попутал немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 17:46 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
wessen wessen ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет. Ну так ясно же ведь сказано было, что protected члены видят только наследники. А вот и фиг там, в том же пакете можно получить доступ к protected членам через ссылку на объект, а вот в другом пакете уже не прокатит такая штука, только через наследников. Сорри, попутал немного. В том же пакете можно к protected и не предка обращаться. Короче, разобрались общими силами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:09 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Зашедший NotGonnaGetUs protected - видимость внутри пакета и в наследниках класса . Да, конечно, внутри пакета тоже. Забыл указать, каюсь. А вот в наследниках класса protected -члены родительского класса можно увидеть только если мы используем this или super . Cлово this используется по умолчанию при обращении к методам и полям класса, поэтому не понятно к чему эта длинна фраза. Если же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected -членам доступа не будет. Только при условии, что наследник на ходится в другом пакете. Иначе это не верно. Аналогия, котороую вы проводите между private и protected свидельство отсутствия ясного понимания, что такое модификаторы доступа, взамен которого выступает принцип: "сделал, посмотрел, запомнил результат". -- Вопрос о видимости членов при доступе через переменную ссылку прозрачен. Если у нас есть класс B, то при обращении к экземпяру А из методов класса B будет доступ только к public членам и, если B в одном пакете с A, то к protected и deafalt. Если B extends A, то дополнительно в экземпляре В доступны protected-члены родительского класса этого же экземпляра (а не любого экземпляра родительского класса). Если у нас есть экземплр А, то при обращении к другому экземпяру А будет доступ ко всем членам. Это всё элементарные следствия четырёх строчек, написанных мною выше :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:51 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Пока ходил кофе пить, всё всё друг другу разрулили :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 18:52 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
2 NotGonnaGetUs > Ей. Вы чего городите товарищи? Можно , действительно подумать , что народ городит, а на самом деле каждый прав по своему, вопросик не очень простой оказался. И у меня он возник ,т.к. в разных книжках с точностью до наоборот написано. А если посмотреть спецификацию Java (вот на русском языке), то там это определяется полностью, но даже по русски с трудом догадываюсь, что это такое написано : Итак : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 6.6.2 Модификатор доступа protected Если член или конструктор объекта объявлен с модификатором доступа protected, то к нему можно обращаться вне пакета, в котором он объявлен только с помощью кода, ответственного за реализацию этого объекта. ... но , что интересно , далее приведен интересный пример,который может при protected зациклиться : [SRC java] package morepoints; public class PlusPoint extends points.Point { // Правило : // Если член или конструктор объекта объявлен с модификатором доступа protected, то // к нему можно обращаться вне пакета, в котором он объявлен только с помощью кода, // ответственного за реализацию этого объекта. // Только при protected или public в super классе увидит super.move, а, значит, и - перекроет его ! // что и приведет к зацикливанию, а без protected в super этот move будет как-бы новым членом public void move(int dx, int dy) { // super.move(dx, dy); // compile-time error moveAlso(dx, dy); } } class Test { public static void main(String[] args) { PlusPoint pp = new PlusPoint(); pp.move(1, 1); } } package points; public class Point { public int x, y; int w; protected int v; // Правило : // Если член или конструктор объекта объявлен с модификатором доступа protected, то // к нему можно обращаться вне пакета, в котором он объявлен только с помощью кода, // ответственного за реализацию этого объекта. // без модификатора виден только в этом пакете //protected (или public) приволит к зацикливанию!!! , т.к. не мешает перекрыть его (он виден там) в потомке вне этого пакета : /* protected*/ void move(int dx, int dy) { x += dx; y += dy; } public void moveAlso(int dx, int dy) { move(dx, dy); } } [src] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 19:00 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
kefiИ у меня он возник ,т.к. в разных книжках с точностью до наоборот написано. Это следствие не граммотности переводчиков :) (как в знании языка, так и в понимании темы) 6.6.2 Модификатор доступа protected Если член или конструктор объекта объявлен с модификатором доступа protected, то к нему можно обращаться вне пакета, в котором он объявлен только с помощью кода, ответственного за реализацию этого объекта. ... но , что интересно , далее приведен интересный пример,который может при protected зациклиться : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Если поставить модификатор protected, то метод move в классе PlusPoint будет переопределять move() и следовательно вызов метода moveAlso в классе PlusPoint будет вызывать не код "x += dx; y += dy;", а "moveAlso(dx, dy);". Т.е. получится инфинит loop. Если move() в класс Point будет default или private, то произойдёт перекрытие этого метода в класс PlusPoint. Соотвественно вызов moveAlso() повлечёт вызов метода move из класса Point, а не PlusPoint и всё будет в порядке. Правильный пример, но он на целен на понимание сразу нескольких аспектов java, а не только на понимание того, что такое модификаторы видимости :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 19:52 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Правильный пример, но он на целен на понимание сразу нескольких аспектов java, а не только на понимание того, что такое модификаторы видимости :) Ну в общем-то , да, но только после него я как-то почувствовал разницу между без модификатора и с protected. Кстати, про перекрытие по-моему, ты написал с точностью до наоборот : Если move() в класс Point будет default или private, то произойдёт перекрытие этого метода в класс PlusPoint ведь,как раз ,гда стоит protected в родителе , тогда мы и перекрываем - мы его в потомке видим и поэтому перекрываем(полимонрфируем,пардон за выражение), когда нет protected в родителе (или private) - метод move родителя не перекрывается , т.к. вообще никак не видится потомком, и поэтому используется как бы уже новый move потомка . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 20:16 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
kefiКстати, про перекрытие по-моему, ты написал с точностью до наоборот : Если move() в класс Point будет default или private, то произойдёт перекрытие этого метода в класс PlusPoint ведь,как раз ,гда стоит protected в родителе , тогда мы и перекрываем - мы его в потомке видим и поэтому перекрываем(полимонрфируем,пардон за выражение), когда нет protected в родителе (или private) - метод move родителя не перекрывается , т.к. вообще никак не видится потомком, и поэтому используется как бы уже новый move потомка . Согласен, использованная мною терминология может не совпадать с той, что вы читали в книжке :) Я использовал слово "переопределять", когда метод наследуется и "перекрывать", когда метод не наследуется, но классе предке есть метод с такой же сигнатурой. Сути вроисходящего это не меняет, но, как оказалось, может привести к путанице у других. Буду стараться избегать перегруженных слов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 20:24 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
У меня простой вопрос касательно модификаторов доступа -- есть ли они обязательны для класов, полей и методов. То есть формальное отсутвие модификатора доступа ввиде дефолтного (пакетного) значит что они не есть обязательны или это лиш значит что дефолтный модификатор прямо не указывается но модификаторы обязательны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 19:39 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
arrtУ меня простой вопрос касательно модификаторов доступа -- есть ли они обязательны для класов, полей и методов. То есть формальное отсутвие модификатора доступа ввиде дефолтного (пакетного) значит что они не есть обязательны или это лиш значит что дефолтный модификатор прямо не указывается но модификаторы обязательны? У вас немного путаница в голове. Что для вас значит термин "обязательны"? Модификаторы доступа - это лишь указание компилятору(хинт) на область видимости переменной, чтобы он мог еще до выполнения программы отловить очевидные случаи нарушения инкапсуляции. С другой стороны есть best-practices, правила хорошего тона для программирования и coding стандарты, в которых иногда можно встретить что переменные должны быть private и их надо явно указывать. Хотя лично я часто оставляю их как default. То есть, для того чтобы программа работала, модификаторы указывать НЕ ОБЯЗАТЕЛЬНО, но в целом, в индустрии есть такое правило - если что-то можно изменить(переменную), то доступ к ней должен происходить из как можно меньшего количества мест(в идеале одного). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 23:13 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Была у меня такая проблема когда я вчера задавал вопрос (касательно класа, поля, метода). В принципе указывать не обязательно -- но сам модификатор то обязательный (в смысле он присутвует в любом случае) -- если явно указан, если нет -- то дефолт. Хотя очевидно что правильно что модификатор "может быть" как и прямо написано на oracle.doc.com. Еще был вопрос из разряда что обязательно при декларации (обьявление) класа -- само слово class, имя -- хотя не знаю как там с анонимными класами -- да и деклариются ли они? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2017, 21:58 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
Почему остановились на 4 уровнях? В качестве троллинга можно было-бы обсудить такие уровни как semi-protected, wide-private e.t.c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2017, 22:15 |
|
||
|
Простой вопрос новичка по protected
|
|||
|---|---|---|---|
|
#18+
maytonПочему остановились на 4 уровнях? Потому что авторы java, увы, не изучили имеющиеся ООП языки. Хватило только на С++ и то не полностью :( maytonВ качестве троллинга можно было-бы обсудить такие уровни как semi-protected, wide-private e.t.c. В eiffel хватило одного и это круче java в бесконечное число раз. FEATURE{список классов} - тогда это будет видно указанным классам и их наследникам. Если {ANY} (аналог Object) - то всем. Если указать себя- то аналог protected. Если никого- то никому (private). Если надо тестам показать- то классы тестов. А переменные, кстати, открываются только на чтение, запись всегда только из класса. И никакого синтаксического сахара не надо. Ээээх! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2017, 08:50 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=32939758&tid=2122564]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
129ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 410ms |

| 0 / 0 |
