Java内部类

什么是内部类

  • 概念:内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说称为内部类,而A类相对B类来说就是外部类
  • 特点:
    • 编译之后可生成独立的字节码文件
    • 内部类可直接访问外部类的私有成员,而不破坏封装
    • 可为外部类提供必要的内部功能组件

内部类的4种形式

  1. 成员内部类
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类

1. 成员内部类

  • 在类的内部定义,与实例变量、实例方法同级别的类
  • 是外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
    1. 先创建外部类对象 : Outer outer = new Outer();
    2. 然后创建内部类对象 : Inner inner = outer.new Inner();
    3. 或者一步创建内部类对象 : Inner inner = new Outer().new Inner();
  • 当外部类、内部类存在成员名字相同时,会优先访问内部类成员;与此同时,要想继续访问外部类成员时,需要以下形式进行访问:
    外部类.this.成员变量
    外部类.this.成员方法
    
  • 成员内部类不能定义静态成员(包括静态属性和静态方法);但是可以定义静态常量static final
  • 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)

注意点:

内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的子类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。

补充:

「包访问权限」: 没有任何修饰符的权限就是包访问权限,意味着当前包的所有类都可以访问这个成员

2. 静态内部类

  • 静态内部类也是定义在某一个类里面的类,只不过在类的前面多了一个关键字static
  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
//直接创建静态内部类对象
外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();
例如:Outer.Inner inner = new Outer.Inner();
  • 只有静态内部类可以声明为static类,其他不行
  • 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)

  • 由于静态内部类,所以无法直接访问非静态属性

3. 局部内部类

  • 局部内部类是定义在一个方法或者一个作用域里面的类,作用范围和创建对象范围仅限于当前方法

  • 局部内部类就像是方法里面的一个局部变量一样,不能加任何访问修饰符

  • 不能在外部类中创建局部内部类对象;若创建内部类对象,直接在当前方法中实例化

  • 局部内部类不能包含有静态成员;但静态常量static final除外

  • 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,其变量必须修饰为final(jdk1.7之前,要求必须加上final,jdk1.8以后,会自动添加final)

4. 匿名内部类

  • 没有类名的局部内部类(一切特征都与局部内部类相同)
  • 一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写
  • 匿名内部类是唯一一种没有构造器的类
  • 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
  • 匿名内部类在编译的时候由系统自动起名为Outter$1.class
  • 优点:减少代码量 ; 缺点:可读性较差

内部类的使用场景和好处

为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的) 实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码



此学习资料参考于

https://www.cnblogs.com/dolphin0520/p/3811445.html

posted @ 2022-05-01 22:56  ·追·  阅读(50)  评论(0)    收藏  举报
/*鼠标跟随效果*/ //返回顶部 returnTop