内部类拥有其外围所有(即使是私有)属性的访问权。
public class Outer {
private String s = "hello";
private void add(){
System.out.println(s + " world");
}
class Inner{
public void f() {
System.out.println(s);
add();
}
}
public static void main(String[] args) {
Outer out = new Outer();
Inner in = out.new Inner();
in.f();
}
}
运行结果:
hello
hello world
上例中,我们在内部类Inner
的f()
方法中,成功地访问了外部类的私有属性并调用了外部类的私有方法。
内部类自动拥有对其外部类所有成员的访问权。这是如何做到的呢?当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围对象的引用。然后,再你访问此外围类的成员时,就是用那个引用来选择外围类的成员。幸运的是,编译器会帮你处理所有的细节,但你现在可以看到:内部类的对象只能再与其外部类的对象相关联的情况下才能被创建(就像你应该看到,在内部类是非static类时)。构建内部类对象时,需要一个指向其外围对象的引用,如果编译器访问不到这个引用就会报错。
内部类通过.this
获得对外部类对象的引用,通过.new
创建内部类对象
public class Outer {
class Inner{
public Outer f() {
Outer out = Outer.this;
return out;
}
}
public static void main(String[] args) {
Outer out = new Outer();
Inner in = out.new Inner();
Outer out2 = in.f();
System.out.println("out与out2指向同一个对象?" + (out == out2));
}
}
运行结果:
out与out2指向同一个对象?true
在main()
方法中,我们新建了一个外部类对象,并通过.new
的方式新建了它的一个内部类对象,然后调用内部类的f()
方法。内部类的f()
方法通过.this
的方式获得外部类的引用。最终,我们利用==
操作符证明,我们新建的外部类引用out
与获得的引用out2
确实指向同一个对象。