Рассмотрим следующий фрагмент кода:Зачем использовать спецификаторы доступа при определении внутренних (нестатических вложенных) классов в Java?
class Deep {
static class StaticInner {
}
class InnerClass {
}
public class InnerClass2 {
}
private class InnerClass3 {
}
protected class InnerClass4 {
}
}
public class Test {
public static void main(String args[]) {
Deep.StaticInner sc = new Deep.StaticInner(); // valid
Deep.InnerClass ic = new Deep.InnerClass(); // invalid
Deep.InnerClass2 ic2 = new Deep.InnerClass2(); // invlaid
Deep.InnerClass3 ic3 = new Deep.InnerClass3(); // invalid
Deep.InnerClass4 ic4 = new Deep.InnerClass4(); // invalid
}
}
За исключением статического класса внутри Deep имени StaticInner
, все остальные вложенные классы требуют класс ограждающую Deep
, чтобы получить доступ. Другими словами, к ним нельзя получить доступ за пределами Deep
(это мое понимание). Я видел программистов, указывающих спецификаторы перед вложенными внутренними классами. В чем смысл? Если (нестатические) внутренние классы вообще недоступны вне закрывающего класса, то почему спецификаторы (public
, private
, & protected
) даны? Почему Java даже поддерживает спецификаторы доступа во внутренних классах?
Целью является ограничение доступа и экспозиции. Например, 'private class InnerClass3' недоступен, даже если вы создаете экземпляр Deep. – c0der
'Deep.InnerClass ic = new Deep.InnerClass(); // invalid', потому что 'InnerClass' не является статическим – emotionlessbananas