《Java编程思想》读书笔记——内部类(一)

内部类拥有其外围所有(即使是私有)属性的访问权。

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

上例中,我们在内部类Innerf()方法中,成功地访问了外部类的私有属性并调用了外部类的私有方法。

内部类自动拥有对其外部类所有成员的访问权。这是如何做到的呢?当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围对象的引用。然后,再你访问此外围类的成员时,就是用那个引用来选择外围类的成员。幸运的是,编译器会帮你处理所有的细节,但你现在可以看到:内部类的对象只能再与其外部类的对象相关联的情况下才能被创建(就像你应该看到,在内部类是非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确实指向同一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值