powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой вопрос новичка по protected
25 сообщений из 26, страница 1 из 2
Простой вопрос новичка по protected
    #32939536
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть пара простых вопросов, на которые у меня имеющиеся источники дают противоречивые ответы :
1) Объясняите, плиз, в чем разница в видимости :
c protected и без модификатора вовсе
2) В одной книжке у меня написан еще такой вариант видимости private protected , но он у меня не работает - это ошибка в книжке ?
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32939671
_Гость_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protected - не доступен никому, кроме как в своем но и в НАСЛЕДУЮЩЕМ классе
без модификатора - доступ в пределах пакета public, за пределами пакета - private
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32939700
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private protected - видимо, опечатка. Такого сочетания не бывает.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32939732
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 _Гость_ >
Я покорно прошу написать по русски - ничего не понял.

2 Зашедший >
Guest private protected - видимо, опечатка. Такого сочетания не бывает.

глянь вот http://] http://www.codenet.ru/webmast/java/08.php
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32939758
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или вот книжка 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.
 package  Str;

 public   class  String_  {
  public   int  val ;
// private protected int V ;
  protected   int  V ;
            int  V2 ;
  public        String_() { } ;
  public    void  Val( int  val) { this .val=val;}
}

 class  String2 { //extends Str.String_  {
 public   int  val2 ;
  public        String2() { } ;
  public    void  Val2( int  val) {
    this .val2=val; 
   Str.String_ i= new  Str.String_() ;
   i.V= 1  ;  // можно
   i.V2= 2  ;
 }
}


 package  Str2;
 import  Str.* ;

 class  String2  extends  Str.String_  {
 public   int  val2 ;
  public        String2() { } ;
  public    void  Val2( int  val) {
    this .val2=val; 
   V= 1  ;
   // super.V2=0; // нельзя !!!
   Str.String_ i= new  Str.String_() ;
   //i.V=2; // - нельзя !!!   
   //i.V2=2; // - нельзя !!!  
   V= 2  ; // можно ( или this.V=2 )
 System.out.println( super .V) ;
 System.out.println(V) ;
    super .V= 3  ; // можно
 }
}
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32939796
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi2 Зашедший >
Guest private protected - видимо, опечатка. Такого сочетания не бывает.

глянь вот http://] http://www.codenet.ru/webmast/java/08.php

Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32939823
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Зашедший >
Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону.
а разве может не соблюдаться правило совместимости снизу вверх ?

И потом, - почему в приведеном примере не доступна, по табличке выше вроде как этого не должно быть :
Код: plaintext
1.
   Str.String_ i= new  Str.String_() ;
   //i.V= 2 ; // - нельзя !!!   
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32940926
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi2 Зашедший >
Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону.
а разве может не соблюдаться правило совместимости снизу вверх ?

И потом, - почему в приведеном примере не доступна, по табличке выше вроде как этого не должно быть :
Код: plaintext
1.
   Str.String_ i= new  Str.String_() ;
   //i.V= 2 ; // - нельзя !!!   


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.
 public   class  MyClass {
   private  String s;
  ...
   public   boolean  isStringEquals(MyClass o){
     return  s.equals(o.s);
  }
  ...
}
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32941739
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший[quot kefi]2 Зашедший >
Посмотрел - книжка по JDK 1.1 - по меркам Явы это было ОЧЕНЬ давно. Видимо, синтаксис последующих версий изменился в более логичную сторону.
а разве может
...
обращении "снаружи" (к экземпляру класса) мы имеем доступ только к public (ну либо к default внутри пакета). Однако ВНУТРИ самого класса мы можем обратиться и к protected -членам родительского класса this.V , и к super.V . Кстати, есть одно исключение - если в метод передан экземпляр НАШЕГО же класса, то мы можем обратиться даже к privat члену полученного экземпляра,
...
[/src]

Ей. Вы чего городите товарищи?

private - видимость только внутри класса (т.е. любой экземпляр класса имеет доступ к методам любого друго экземпляра данного класса и к внутренним классам).
default - видимость внутри пакета только (наследник в другом пакете не будет видеть default методы).
protected - видимость внутри пакета и в наследниках класса .
public - везде.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32941886
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
protected - видимость внутри пакета и в наследниках класса .

Да, конечно, внутри пакета тоже. Забыл указать, каюсь. А вот в наследниках класса protected -члены родительского класса можно увидеть только если мы используем this или super . Если же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected -членам доступа не будет.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32941950
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет.
Ну так ясно же ведь сказано было, что protected члены видят только наследники.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32941962
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет.
Ну так ясно же ведь сказано было, что protected члены видят только наследники.
Если ясно - то откуда тогда взялся вопрос:
kefi
И потом, - почему в приведеном примере не доступна, по табличке выше вроде как этого не должно быть...

Видимо, человеку не ясно.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942063
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет.
Ну так ясно же ведь сказано было, что protected члены видят только наследники.
А вот и фиг там, в том же пакете можно получить доступ к protected членам через ссылку на объект, а вот в другом пакете уже не прокатит такая штука, только через наследников. Сорри, попутал немного.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942155
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen wessen ЗашедшийЕсли же мы обращаемся к переменной-ссылке на экземпляр родительского класса, то к его protected-членам доступа не будет.
Ну так ясно же ведь сказано было, что protected члены видят только наследники.
А вот и фиг там, в том же пакете можно получить доступ к protected членам через ссылку на объект, а вот в другом пакете уже не прокатит такая штука, только через наследников. Сорри, попутал немного.
В том же пакете можно к protected и не предка обращаться. Короче, разобрались общими силами.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942254
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший NotGonnaGetUs
protected - видимость внутри пакета и в наследниках класса .

Да, конечно, внутри пакета тоже. Забыл указать, каюсь. А вот в наследниках класса protected -члены родительского класса можно увидеть только если мы используем this или super .

Cлово this используется по умолчанию при обращении к методам и полям класса, поэтому не понятно к чему эта длинна фраза.

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

Аналогия, котороую вы проводите между private и protected свидельство отсутствия ясного понимания, что такое модификаторы доступа, взамен которого выступает принцип: "сделал, посмотрел, запомнил результат".

--
Вопрос о видимости членов при доступе через переменную ссылку прозрачен.

Если у нас есть класс B, то
при обращении к экземпяру А из методов класса B будет доступ только к public членам и, если B в одном пакете с A, то к protected и deafalt.

Если B extends A, то дополнительно в экземпляре В доступны protected-члены родительского класса этого же экземпляра (а не любого экземпляра родительского класса).

Если у нас есть экземплр А, то при обращении к другому экземпяру А будет доступ ко всем членам.

Это всё элементарные следствия четырёх строчек, написанных мною выше :)
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942256
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока ходил кофе пить, всё всё друг другу разрулили :)
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942270
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 NotGonnaGetUs >
Ей. Вы чего городите товарищи?
Можно , действительно подумать , что народ городит, а на самом деле каждый прав по своему, вопросик не очень простой оказался.
И у меня он возник ,т.к. в разных книжках с точностью до наоборот написано.

А если посмотреть спецификацию Java (вот на русском языке), то там это определяется полностью, но даже по русски с трудом догадываюсь, что это такое написано :

Итак :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Спецификация языка Ява
Джеймс Гослинг
Билл Джой
Гай Стил
Версия  1 . 0 

Перевод с английского М.Батрак, С.Болтухова, И.Бураковой, Е.Гречниковой, Д.Касимовой, В.Лешукова, Т.Морозовой, Е.Ожогина, Т.Сушниковой, С.Щепеткина
Редактор С.Щепеткин
Под общей редакцией С.Свердлова 
 1999 


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]
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942341
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
 package  morepoints;

 public   class  PlusPoint  extends  points.Point {
         public   void  move( int  dx,  int  dy) {
              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;

/* protected*/  void  move( int  dx,  int  dy) { x += dx; y += dy; }

     public   void  moveAlso( int  dx,  int  dy) { move(dx, dy); }
}



Если поставить модификатор protected, то метод move в классе PlusPoint будет переопределять move() и следовательно вызов метода moveAlso в классе PlusPoint будет вызывать не код "x += dx; y += dy;", а "moveAlso(dx, dy);". Т.е. получится инфинит loop.
Если move() в класс Point будет default или private, то произойдёт перекрытие этого метода в класс PlusPoint. Соотвественно вызов moveAlso() повлечёт вызов метода move из класса Point, а не PlusPoint и всё будет в порядке.

Правильный пример, но он на целен на понимание сразу нескольких аспектов java, а не только на понимание того, что такое модификаторы видимости :)
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942374
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный пример, но он на целен на понимание сразу нескольких аспектов java, а не только на понимание того, что такое модификаторы видимости :)
Ну в общем-то , да, но только после него я как-то почувствовал разницу между без модификатора и с protected.

Кстати, про перекрытие по-моему, ты написал с точностью до наоборот :
Если move() в класс Point будет default или private, то произойдёт перекрытие этого метода в класс PlusPoint
ведь,как раз ,гда стоит protected в родителе , тогда мы и перекрываем - мы его в потомке видим и поэтому перекрываем(полимонрфируем,пардон за выражение), когда нет protected в родителе (или private) - метод move родителя не перекрывается , т.к. вообще никак не видится потомком, и поэтому используется как бы уже новый move потомка .
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #32942383
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefiКстати, про перекрытие по-моему, ты написал с точностью до наоборот :
Если move() в класс Point будет default или private, то произойдёт перекрытие этого метода в класс PlusPoint
ведь,как раз ,гда стоит protected в родителе , тогда мы и перекрываем - мы его в потомке видим и поэтому перекрываем(полимонрфируем,пардон за выражение), когда нет protected в родителе (или private) - метод move родителя не перекрывается , т.к. вообще никак не видится потомком, и поэтому используется как бы уже новый move потомка .

Согласен, использованная мною терминология может не совпадать с той, что вы читали в книжке :)
Я использовал слово "переопределять", когда метод наследуется
и "перекрывать", когда метод не наследуется, но классе предке есть метод с такой же сигнатурой.

Сути вроисходящего это не меняет, но, как оказалось, может привести к путанице у других.

Буду стараться избегать перегруженных слов :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Простой вопрос новичка по protected
    #39527283
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня простой вопрос касательно модификаторов доступа -- есть ли они обязательны для класов, полей и методов. То есть формальное отсутвие модификатора доступа ввиде дефолтного (пакетного) значит что они не есть обязательны или это лиш значит что дефолтный модификатор прямо не указывается но модификаторы обязательны?
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #39527337
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arrtУ меня простой вопрос касательно модификаторов доступа -- есть ли они обязательны для класов, полей и методов. То есть формальное отсутвие модификатора доступа ввиде дефолтного (пакетного) значит что они не есть обязательны или это лиш значит что дефолтный модификатор прямо не указывается но модификаторы обязательны?

У вас немного путаница в голове. Что для вас значит термин "обязательны"? Модификаторы доступа - это лишь указание компилятору(хинт) на область видимости переменной, чтобы он мог еще до выполнения программы отловить очевидные случаи нарушения инкапсуляции.

С другой стороны есть best-practices, правила хорошего тона для программирования и coding стандарты, в которых иногда можно встретить что переменные должны быть private и их надо явно указывать. Хотя лично я часто оставляю их как default.

То есть, для того чтобы программа работала, модификаторы указывать НЕ ОБЯЗАТЕЛЬНО, но в целом, в индустрии есть такое правило - если что-то можно изменить(переменную), то доступ к ней должен происходить из как можно меньшего количества мест(в идеале одного).
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #39527952
arrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была у меня такая проблема когда я вчера задавал вопрос (касательно класа, поля, метода). В принципе указывать не обязательно -- но сам модификатор то обязательный (в смысле он присутвует в любом случае) -- если явно указан, если нет -- то дефолт. Хотя очевидно что правильно что модификатор "может быть" как и прямо написано на oracle.doc.com. Еще был вопрос из разряда что обязательно при декларации (обьявление) класа -- само слово class, имя -- хотя не знаю как там с анонимными класами -- да и деклариются ли они?
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #39527962
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему остановились на 4 уровнях? В качестве троллинга можно было-бы обсудить
такие уровни как semi-protected, wide-private e.t.c.
...
Рейтинг: 0 / 0
Простой вопрос новичка по protected
    #39528086
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПочему остановились на 4 уровнях?

Потому что авторы java, увы, не изучили имеющиеся ООП языки. Хватило только на С++ и то не полностью :(

maytonВ качестве троллинга можно было-бы обсудить
такие уровни как semi-protected, wide-private e.t.c.

В eiffel хватило одного и это круче java в бесконечное число раз.
FEATURE{список классов} - тогда это будет видно указанным классам и их наследникам. Если {ANY} (аналог Object) - то всем. Если указать себя- то аналог protected. Если никого- то никому (private). Если надо тестам показать- то классы тестов.
А переменные, кстати, открываются только на чтение, запись всегда только из класса. И никакого синтаксического сахара не надо.
Ээээх!
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой вопрос новичка по protected
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]