【学习笔记】第十章 内部类

内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。

10.2 链接到外部类

内部类对象可以访问其外部类对象所有成员。

当一个内部类对象生成时,其包含了一个隐含的外部类对象,以调用外部类成员。

class Out {
    int out_i = 1;

    class In {
        int int_i = 1;

        void f() {
            out_i = 2;
        }
    }
}


public class InnerDemo {

    public static void main(String[] args) {
        Out o = new Out();
        Out.In i = o.new In();
        i.f();
        System.out.println(o.out_i);
    }
}
//Output:
//2

内部类对象和外部类对象的绑定


10.3 使用.this和.new

.this 用于返回隐含的外部类对象。

.new 用于创建内部类对象。
e.g.

Out.In i = o.new In();

10.4 内部类与向上转型

将内部类置为private,可以在不影响类的逻辑组成的同时,隐藏接口的实现,类的继承,直接返回实现功能后的(对象)引用。这样可以避免客户端程序员对内部类的修改,误用。(如果使用一般的类可能会出现这种情况)。


10.6 匿名内部类

如果定义一个匿名内部类,并且希望使用一个在其外部定义的对象,那么编译器会要求其参数是final的。

class Out {
    int out_i = 1;

    void f() {
        int var = 1;
        class In {
            void f() {
                //Cannot refer to the non-final local variable var defined in an enclosing scope
                System.out.println(var);
            }
        }
    }
}

不仅是匿名内部类,局部内部类(在方法中定义的内部类)也同理。
方法中定义的变量的生命周期结束于方法调用的结束,而内部类生成的对象的生命周期知道没有引用指向它才结束,如果不定义final的话,调用内部类对象调用方法中的局部变量时,访问的是一个被销毁的变量。
具体参考:http://feiyeguohai.iteye.com/blog/1500108


10.7 嵌套类

即静态内部类。
嵌套类和外部类对象没有太多的联系,除了可以访问外部类中的静态对象。

接口中使用嵌套类进行代码测试。因为接口中所有成员默认public和static和嵌套类的定义不冲突。


10.8 为什么需要内部类

  1. 隐藏实现。
  2. 变相实现多继承。
  3. 具有外部类所有成员的访问权限。
  4. 对于同名方法,可以在类中实现该方法,同时在内部类中实现接口中的同名方法,并得以区分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值