|
|
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Хоть убейте, но обьясните плиз, что здесь неправильно Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 06:50:47 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
http://www.math.rsu.ru/mexmat/pmp/student/book/Chapter06.html Итак вы только что получили представление о наследовании и теперь пришло время раскрыть смысл ключевого слова protected. В идеальном мире, private объекты всегда являются действительно private, но в реальных проектах, где вы пытаетесь во многих местах скрыть от внешнего мира нечто, Вам часто нужна возможность получить к нему доступ из классов наследников. Ключевое слово protected поэтому не такая уж и ненужная назойливость или догма. Оно объявляет "Этот объект частный (private), если к нему пытается подобраться пользователь, но он доступен для всех остальных находящихся в том же самом пакете(package)". Читайте основы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 07:18:05 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Я предполагал, что в обоих случаях c.v() - это вызов переписанного public метода package2.Class2.v()??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 07:43:27 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
У классиков (The Java Language Specification, Third Edition) нашел такое: 6.6.7 Example: protected Fields, Methods, and Constructors Consider this example, where the points package declares:package points; Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Но это же не мой случай??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 09:09:11 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Ноль2 Но это же не мой случай??? Почему же не ваш? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 09:26:35 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Объект класса 2 объявляется как объект класса 1. Их этого следует, что через эту ссылку (ее тип класс 1) доступны поля и методы, а так же область их доступности, только те, которые относятся к классу1 (к родительскому). Меня лично заинтересовало другое - получается, что в этом самом объекте существет один и тот же метод, который в разных случаях имеет разную степень доступа к нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 10:15:56 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Наверно потому, что Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. public void package2.Class2.v() public static void package2.Class2.main(java.lang.String[]) public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() public java.lang.String java.lang.Object.toString() и не слова о public void package1.Class1.v(), то есть c.v() может быть только вызовом public void package2.Class2.v()??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 10:18:24 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Я до сих пор думал, что если имеет место overriding, то какой будет вызван метод определяется не типом package1.Class1 переменной с, а классом обьекта package2.Class2, на который она, переменная с, указывает??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 10:37:02 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
АСУ ТПшникОбъект класса 2 объявляется как объект класса 1. Их этого следует, что через эту ссылку (ее тип класс 1) доступны поля и методы, а так же область их доступности, только те, которые относятся к классу1 (к родительскому). Меня лично заинтересовало другое - получается, что в этом самом объекте существет один и тот же метод, который в разных случаях имеет разную степень доступа к нему. Это не верно для overriding методов!!!??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 10:56:24 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Protected Следующим спецификатором уровня доступа является спецификатор "защищенный" -- protected, который разрешает обращаться к членам класса самому классу, его суб-класссам (с упомянутыми ранее ограничениями), а также всем классам в той же самой библиотеке. Уровень доступа protected используют в случаях, если к члену класса нужно разрешить доступ из его суб-классов, но не из самостоятельных не связанных с ним классов. Защищенные члены (protected members) подобны семейным секретам -- вы не думаете, что об этом знает вся семья и даже некоторые ближайшие друзья, но вы не хотите, чтобы об этом знал кто-либо со стороны. Для объявления защищенного члена служит ключевое слово protected. Сначала давайте посмотрим, как спецификатор protected влияет на доступ для классов в той же самой библиотеке. Рассмотрим следующую версию класса Alpha, которая теперь объявлена внутри библиотеки с именем Greek и которая имеет одну защищенную переменную и один защищенный метод: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Давайте введем новый класс Delta, который получен из класса Alpha, но прописан в другой библиотеке -- Latin. Класс Delta может обращаться к iamprotected и к protectedMethod, но только для объектов типа Delta или их суб-классов. Класс Delta не может обращаться к iamprotected или protectedMethod для объектов типа Alpha. accessMethod в следующем примере пытается обратиться к к переменной iamprotected, являющейся member variable для объекта типа Alpha, что недопустимо, и к объекту типа Delta, что разрешено. Аналогично, accessMethod вытается вызвать метод protectedMethod объекта Alpha, что также недопустимо: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. From tutorial http://www.javable.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:01:51 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Последняя фраза ключевая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:02:48 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Ну так все просто. На момент компиляции же не известно, какой тип объекта хранится в ссылочной переменной Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:32:05 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Последняя фраза ключевая для понимания особенности, которая присуща потомку класса (а именно: он хоть и потомок, но доступ получить к протектед только если в том же пакете находится). А тут акцент немного на другое - является ли в приведенном примере запись v как метода с другим уровнем доступа overriding и более того, если класс потомок имеет переопределенный метод, то если объект этого класса объявить как объект родительского типа, то в вызове (Родительский класс) Объект.метод () будет использовано содержимое метода исходного или переопределнного. Что впрочем легко проверить, работы много, надо будет сделать тест. Хотя делов то... Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:39:08 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
авторto Leonidov эээ не совсем понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:41:49 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
LeonidvНу так все просто. На момент компиляции же не известно, какой тип объекта хранится в ссылочной переменной Код: plaintext 1. Да все там известно. Если Packege1.v1() сделать public все будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:43:28 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:46:16 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
теперь я в тупике На момент компиляции известно что в ссылке Parent p хранится объект типа Parent, с чего же вдруг нельзя вызвать его собственный метод?! да хоть private! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 11:54:17 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
to Fjord and Leonidv Еще одна моя глупость и все Компилирую свои package1 и package2, только в package1 метод v() - public Потом компилирую package1, изменив предварительно метод v() на protected Теперь Код: plaintext 1. 2. 3. 4. 5. 6. Делаю скорее всего неправильный вывод, что javac колбасит что-то не то??? Прокомментируйте, bitte С Уважением и Благодарностью ко всем за все ранее сказанное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 13:23:37 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Забавный глюк. Среда показывает ошибку но сомпилятор не возмущается и делает свое дело как будто метод в первом классе public, и билдит и запускает без проблем. Думал что может ява машина что нить кеширует, но после перезапуска компа ничего не изменилось. После удаления готовых классов и жара сомпилятор выдал долгожданную ошибку. В книжке все четко описанно, что работать не должно. Почему так незнаю. Очень интересно самому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 14:08:09 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
кажется понял: ошибка при protected v() должна быть (обязанна), и class2.class само собой не появится, а если v() сделать на время протектед и потом компилить и запускать то Код: plaintext Наверняка я не прав. Очень интересно. Может кто нибудь в силах прояснить ситуацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 14:21:09 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
fjordкажется понял: ошибка при protected v() должна быть (обязанна), и class2.class само собой не появится, а если v() сделать на время протектед и потом компилить и запускать то Код: plaintext Наверняка я не прав. Очень интересно. Может кто нибудь в силах прояснить ситуацию? там Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 14:22:50 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Развиваем тему даже если не переопределять метод v в классе 2, а просто вызываем метод родителя, компилируем все, потом изменяем в классе 1 доступ к методу на private, и перекомпилируем только класс 1, то один фиг объект класса 2 спокойно запускает private метод родителя! А вот это уже конкретный глюк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 15:12:08 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Компилируем оба класса. Меняем в классе 1 доступ к методу на приват. Компилируем только первый класс. Запускаем. Все работает. Комментарии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 15:36:51 |
|
||
|
Убейте
|
|||
|---|---|---|---|
|
#18+
2АСУ ТПшник Все так, но при надобности изменить и откомпилировать второй класс ничего невыйдет, придется лезть в первый и опять делать его паблик. Поидее все нормально, при защищенном певом классе оба класса сразу нельзя будет откомпилировать. Поэтому нужно создавать сперва классы с протектед методами и полями а потом те которые будут ими пользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2006, 16:08:16 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34082825&tid=2147524]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 224ms |
| total: | 398ms |

| 0 / 0 |
