Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> protected в jdk1.6.0_01 
V
    Опции темы
nornad
  Дата 26.6.2007, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Или я совсем старый стал и ничего не смыслю в модификаторах доступа, или в указанной ждк баг.
Вот пример:
Код

public class Protected
{
    protected boolean isTrue = false;
    protected int id = 10;
}

Код

public class ProtectedTest
{
    public ProtectedTest() {
        Protected prot = new Protected();
        System.out.println("Why there is no error? ... " + prot.isTrue);
        System.out.println("Why there is no error? ... " + prot.id);
    }

    public static void main( String[] args ) {
        new ProtectedTest();
    }
}

Вопрос: как это может работать?

Добавлено через 8 минут и 47 секунд
М-да... прошу прощения, я действительно ничего не понимаю в модификаторах доступа.
Нашёл тут в довольно старенькой книжке (точнее, в заметках, сделанных по книжке), что
Код

protected виден всем в пределах пакета

Имхо, несколько странное поведение для защищённых полей и методов, но "описанный баг - уже не баг, а фича". smile 

P.S. Просьба к модераторам: не удаляйте тему. Думаю, найдутся и другие "ничего не смыслящие". smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
jsa
Дата 26.6.2007, 05:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



хм... очень интересно, не знал таких подробностей, поэтому порылся на java.sun.com и вот что нашел
modifiers



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Ulysses4j
Дата 26.6.2007, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 2
Всего: 10



Цитата(jsa @ 26.6.2007,  06:11)
хм... очень интересно, не знал таких подробностей, поэтому порылся на java.sun.com и вот что нашел
modifiers

Давайте не будем томить народ, там речено:
Цитата
The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package.

Лично мне такое не нравится - Delphi вспоминается...

Это сообщение отредактировал(а) Ulysses4j - 26.6.2007, 06:06


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
nerezus
  Дата 26.6.2007, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

protected виден всем в пределах пакета
 
Собственно это как бы прописная истина ;)

И еще: если сабж без модификатора, то ведет он себя именно так, как ты хочешь, чтобы вел себя protected ;)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Ulysses4j
Дата 26.6.2007, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 2
Всего: 10



Цитата(nornad @  26.6.2007,  04:24 Найти цитируемый пост)
Думаю, найдутся и другие "ничего не смыслящие".

+1

Добавлено через 4 минуты и 52 секунды
Цитата(nerezus @  26.6.2007,  07:00 Найти цитируемый пост)
если сабж без модификатора, то ведет он себя именно так, как ты хочешь, чтобы вел себя protected ;)

Хотите сказать, что package-private и protected это одно и то же? Сомневаюсь. Если подкласс данного класса находится в другом пакете, то protected-члены базового ему будут видны, а package-private базового - нет.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
nornad
Дата 26.6.2007, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(nerezus @  26.6.2007,  09:00 Найти цитируемый пост)
И еще: если сабж без модификатора, то ведет он себя именно так, как ты хочешь, чтобы вел себя protected

Не скажи. Судя по информации на офсайте поле без модификатора ведёт себя не так, как protected в том же с++. Смотрим в табличку и видим, что такое поле видно в пределах пакета, но не будет видимым классу-потомку, который лежит в другом пакете. "Стандартный" же protected наоборот подразумевает видимость потомкам, а не пакету.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
fixxer
Дата 26.6.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Вся эта котовасия происходит от желания _четко_ разделить иерархию доступа, то есть, чтобы одна полностью включала другой.
public
protected
package
private

И вследствие этого к пакетам следует относиться внимательнее, помня, что это не только средство модульной декомпозиции, но и средство инкапсуляции.

Это сообщение отредактировал(а) fixxer - 26.6.2007, 09:24


--------------------
user posted image
PM MAIL ICQ   Вверх
LSD
Дата 26.6.2007, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(nornad @  26.6.2007,  08:15 Найти цитируемый пост)
"Стандартный" же protected наоборот подразумевает видимость потомкам, а не пакету.

В Java он ведет себя именно так как описано выше, с самой первой версии. О причинах fixxer уже написал.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
nornad
Дата 28.6.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



М-да... что-то я всё же заглючил. protected ведёт себя почти так, как я и понимал. Так же как и no modifier.
Единственный момент, которого я не знал - это, что protected виден и всем внутри пакета.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
progdog
Дата 30.6.2007, 08:47 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



В книжке "Секреты программирования для Internet для Java" еще по jre 1.0 было написано, что тогда во всяком случае был еще один модификатор. Цитата с книжки:
Цитата

Модификатор доступа private protected

Модификатор private protected предоставляет меньше доступа, чем модификатор protected, но
больше, чем модификатор private. Элемент, определенный с модификатором private protected,
доступен только из подклассов некоего класса. Если другие модификаторы, которые мы
использовали, соответствуют концепции затенения данных, то модификатор private protected
наиболее важен при рассмотрении наследования классов.

Его убрали скорее всего потому что разработчикам захотелось, чтобы было по одному модификатору доступа. А про protected там написано:
Цитата

Модификатор protected позволяет сделать элементы класса общими только для определенного
набора классов - тех, что содержатся в том же пакете.

Кстати именно этот модификатор присваивается если ничего не указывать. А до того как я прочитал эту книжку я искренне думал, что в остальных книжках написана правда.  smile  

Это сообщение отредактировал(а) progdog - 30.6.2007, 11:59
PM MAIL   Вверх
EvgenZ
Дата 30.6.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: нет
Всего: 11



Цитата(progdog @  30.6.2007,  08:47 Найти цитируемый пост)
Модификатор protected позволяет сделать элементы класса общими только для определенного
набора классов - тех, что содержатся в том же пакете.

Кстати именно этот модификатор присваивается если ничего не указывать. А до того как я прочитал эту книжку я искренне думал, что в остальных книжках написана правда.  smile  


Если не ошибаюсь, то, если ничего не указывать присваивается "доступ по умолчанию" или пакетный доступ. Т.е. наследник из другого пакета не будет видеть.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
EvgenZ
Дата 30.6.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: нет
Всего: 11



Код

package packagepkg;

class B extends newpackage.NewClass
{
    B(){this.}  /* если "а" в NewClass с модификатором доступа паблик или протектед, то могу поставить "а", а если с доступом по умолчанию, то "а" в наследнике будет не видно, так как доступ по умолчанию действует в пределах пакета.*/
    int b;    
}
public class Main 
{
    public static void main(String[] args) 
    {
    }
    
}


Код

package newpackage;
public class NewClass 
{    
    int a = 55;     //поставить паблик, протектед или оставить по умолчанию
}


Это сообщение отредактировал(а) EvgenZ - 30.6.2007, 09:32


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
progdog
Дата 30.6.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Я не знаю с чего вы взяли что при protected оно заработает, но во всяком случае в Eclipse оно выдаст ошибку. Даже если компилятор это и откомпилирует, я Eclipse выкидывать на помойку не собираюсь.  smile 

Я вот так тестил:
Код

package parent
public class Parent {
   protected void render() {}
}

Код

package child
public class Child extends Parent {
   void test() {
      render();
   }
}


Это сообщение отредактировал(а) progdog - 30.6.2007, 13:44
PM MAIL   Вверх
LSD
Дата 30.6.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(progdog @  30.6.2007,  12:55 Найти цитируемый пост)
Я вот так тестил:

Там ошибка в том, что нет импорта для Parent-а. А в остальном код полностью корректный.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
progdog
Дата 30.6.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Ну да, точно smile Перепечатал из исходника, про импорт забыл.

Но это все равно сути дела не меняет.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.