#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. Перевернутые определения для «защищенных» и «без модификатора», нет?
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. Ответ также отредактирован, чтобы отразить ваши изменения. Я надеюсь, что теперь это абсолютно ясно.