内部类是在类中定义的类,内部类可以声明为public,private,protected。如果内部类定义为private和protected,外层类可以访问内部类的成员吗?并且内部类可以访问外部类的成员吗?
答案 0 :(得分:23)
通常,您可以(访问内部类的私有字段,反之亦然)。以下代码在Eclipse下编译:
public class Outer {
private int x;
public void f() {
Inner inner = new Inner();
inner.g();
inner.y = 5;
}
private class Inner {
private int y;
public void g() { x = 5; }
}
}
也就是说,您可以配置IDE /编译器来处理对错误等字段的访问(在Eclipse中,此设置称为“访问封闭类型的不可访问成员”,在Preferences - > Java - >下;编译器 - >错误/警告 - >代码样式)
答案 1 :(得分:17)
如果内部类定义为私有 和protected,可以外部类访问 内在成员?
是。这些限定符只会影响从外部类派生的类中内部类的可见性。
可以内部类访问成员 外类?
是的,包括声明为private
的那些,就像任何实例方法一样。
答案 2 :(得分:2)
是的!您可以从外部类访问内部类成员,反之亦然(与访问修饰符无关)。 但是,对于静态嵌套类,您无法仅通过字段名称访问其字段,并且需要像
一样访问它InnerClass.staticInnerField
虽然您可以直接通过字段名称从内部类访问外部类的静态字段。
答案 3 :(得分:1)
“嵌套类是一个定义的类 在另一个班级内。嵌套类 应该存在只是为了服务它 附上课。如果是嵌套类 在其他一些情况下会有用, 那么它应该是一个顶级的课程。 嵌套有四种 classes:静态成员类, 非静态成员类,匿名 课程和本地课程。除了 第一种被称为内在 类“。
(Joshua Bloch,来自Effective Java。)
至于你的问题:很容易自己测试。但答案是肯定的(即使对于private
成员),只要您不是试图从静态上下文访问非静态成员(而不是从引用),或者尝试访问的成员是在一个难以进入的范围内。
就像人们期望的那样=)。
答案 4 :(得分:1)
解释是在常规内部类的上下文中[常规内部类不能在其中声明静态成员]
您可以直接从内部类访问外部类的任何字段。
class Outer {
private static int x = 0;
class Inner {
void print() {
System.out.println(x); // x can be directly accessed
}
}
public static void main(String[] args) {
new Outer().new Inner().print();
}
}
即使是外类也可以通过内部类的对象访问Inner类的任何字段。
class Outer {
private class Inner {
private int x = 10;
}
void print() {
Inner inner = new Inner();
System.out.println(inner.x);
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.print();
}
}