内部类

目录

  • 为什么要使用内部类
  • 内部类的种类
    • 普通内部类
    • static内部类
  • 普通内部类的实例化方式
    • 需要借助外部类对象
      • 外部类方法中返回(使用new实例化)
      • 外部类对象直接new
  • 封装内部类
    • 实现接口
    • 隐藏实现细节
    • 不能使用外部类对象new一个实例(类比private属性只能通过方法实例化)
  • 匿名内部类
    • 定义内部类同时实例化内部类对象
  • 内部类的本质

为什么要使用内部类

  • 获取外部类成员的访问权限
    • 本质是内部类对象拥有外部类对象的引用
  • 实现多重继承

内部类的种类

  • 普通内部类
    • 需要借助外部类对象才能实例化
    • 内部类对象拥有外部类对象的引用
      • 所以内部类对象可以获得外部类对象的引用
      • 通过this关键字
    • 就像子类对象拥有父类对象的引用
    • 所以子类对象实例化之前,先实例化父类对象
  • static内部类
    • 不依赖外部类对象即可实例化

普通内部类实例化方式

  • 通过在外部类定义方法返回内部类实例
  • 使用new关键字(private内部类不能使用此方法)
    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();

匿名内部类

  • 匿名内部类在创建类的同时实例化了对象
  • 匿名内部类可以显示定义基类
  • 传入匿名内部类的参数必须声明为final(除传入基类的参数外)
  • 匿名内部类实例初始化的实际效果就是构造器

内部类的本质

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。

posted @ 2017-08-10 10:40  s3abiscuit  阅读(145)  评论(0编辑  收藏  举报