Область действия защищенных элементов

#java #access-modifiers

#java #модификаторы доступа

Вопрос:

Я готовлюсь к SCJP, также я узнал, что область действия защищенных элементов находится внутри пакета, а также в другом пакете с некоторыми условиями, которые возможны только при наследовании.

Например: у меня есть три класса как Parentclass дочерний класс Friendclass

 package x.parent;

 class Parentclass{
 protected int x=10;
  ...............
  }

 package x.child;

 class Childlass extends Parentclass{
  super.x=20;
  ...............
}

 package x.child;

 import x.parent.Parentclass;

 class Friendclass{
 Parentclass pc = new Parentclass();
 pc.x=30;
  ...............
}
  

В чем причина этого, в Friendclass член x не согласится присвоить этому значение, ведет себя как закрытый член, а не в случае Childclass .

Комментарии:

1. Назначение x=20 в дочернем классе также должно завершиться неудачей, потому что оно находится в другом пакете, а член x не protected является членом, но имеет доступ по умолчанию.

2. извините, ошибка с моей стороны тоже. исправлено

Ответ №1:

Существует четыре модификатора доступа

 private - just this class
no modifier - just this class or this package (NOT subclass)
protected - just this class, this package, or subclass
public - everyone and their cousin
  

Поскольку он использует модификатор по умолчанию, он имеет доступ, если верно одно из следующих значений:

  1. Является частью самого класса (Нет!)
  2. Является частью пакета самого класса (Нет!)

Таким образом, это не соответствует критериям, и поэтому вы не получаете доступа.

Комментарии:

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

2. Перевернутые определения для «защищенных» и «без модификатора», нет?

3. @Damodar, zerocrates — да, я их перевернул. Исправлено.

4. я отредактировал вопрос вчера, пожалуйста, не могли бы вы проверить один раз

Ответ №2:

Вы даже не можете получить доступ Parentclass.x к Childclass , потому что x имеет видимость по умолчанию (не защищена). Смотрите http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Редактировать:

x.child.Friendclass не находится в том же пакете, что и x.parent.Parentclass . x.child.Friendclass не наследуется от x.parent.Parentclass .

как указано в сводке TotalFrickinRockstarFromMars и в документах Java access control docs также указано, это означает, что Friendclass не разрешен доступ к полю x .

Комментарии:

1. я отредактировал вопрос вчера, пожалуйста, не могли бы вы проверить один раз

2. Ответ также отредактирован, чтобы отразить ваши изменения. Я надеюсь, что теперь это абсолютно ясно.